mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
01c569f3fc
commit
e93172d57d
1 file changed
+54
@@ -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;
|
||||
|
||||