tools/xen-9pfsd: add 9pfs write request support

Add the write request of the 9pfs protocol.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Jason Andryuk <jandryuk@gmail.com>
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
Juergen Gross authored and Andrew Cooper committed 2024-02-15 16:24:39 +00:00
1 parent 01c569f3fc
commit e93172d57d
1 file changed
+54
+54
View File
@@ -33,6 +33,7 @@
#define P9_CMD_WALK 110
#define P9_CMD_OPEN 112
#define P9_CMD_CREATE 114
#define P9_CMD_WRITE 118
#define P9_CMD_CLUNK 120
#define P9_CMD_STAT 124
@@ -1244,6 +1245,55 @@ static void p9_stat(struct ring *ring, struct p9_header *hdr)
free_fid(device, fidp);
}
static void p9_write(struct ring *ring, struct p9_header *hdr)
{
device *device = ring->device;
uint32_t fid;
uint64_t off;
unsigned int len;
uint32_t written;
void *buf;
struct p9_fid *fidp;
int ret;
ret = fill_data(ring, "ULD", &fid, &off, &len, ring->buffer);
if ( ret != 3 )
{
p9_error(ring, hdr->tag, EINVAL);
return;
}
fidp = get_fid_ref(device, fid);
if ( !fidp || !fidp->opened || fidp->isdir )
{
p9_error(ring, hdr->tag, EBADF);
goto out;
}
buf = ring->buffer;
while ( len != 0 )
{
ret = pwrite(fidp->fd, buf, len, off);
if ( ret < 0 )
break;
len -= ret;
buf += ret;
off += ret;
}
written = buf - ring->buffer;
if ( written == 0 )
{
p9_error(ring, hdr->tag, errno);
goto out;
}
fill_buffer(ring, hdr->cmd + 1, hdr->tag, "U", &written);
out:
free_fid(device, fidp);
}
void *io_thread(void *arg)
{
struct ring *ring = arg;
@@ -1319,6 +1369,10 @@ void *io_thread(void *arg)
p9_create(ring, &hdr);
break;
case P9_CMD_WRITE:
p9_write(ring, &hdr);
break;
case P9_CMD_CLUNK:
p9_clunk(ring, &hdr);
break;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.