@@ -31,6 +31,7 @@
#define P9_CMD_ERROR 107
#define P9_CMD_WALK 110
#define P9_CMD_OPEN 112
+#define P9_CMD_CLUNK 120
/* P9 protocol open flags. */
#define P9_OREAD 0 /* read */
@@ -943,6 +944,43 @@ static void p9_open(struct ring *ring, struct p9_header *hdr)
fill_buffer(ring, hdr->cmd + 1, hdr->tag, "QU", &qid, &iounit);
}
+static void p9_clunk(struct ring *ring, struct p9_header *hdr)
+{
+ device *device = ring->device;
+ uint32_t fid;
+ struct p9_fid *fidp;
+ int ret;
+
+ ret = fill_data(ring, "U", &fid);
+ if ( ret != 1 )
+ {
+ p9_error(ring, hdr->tag, EINVAL);
+ return;
+ }
+
+ fidp = get_fid_ref(device, fid);
+ if ( !fidp )
+ {
+ p9_error(ring, hdr->tag, ENOENT);
+ return;
+ }
+
+ if ( fidp->opened )
+ {
+ fidp->opened = false;
+ free_fid(device, fidp);
+ close(fidp->fd);
+ if ( fidp->mode & P9_OREMOVE )
+ unlink(fidp->path);
+ }
+
+ /* 2 calls of free_fid(): one for our reference, and one to free it. */
+ free_fid(device, fidp);
+ free_fid(device, fidp);
+
+ fill_buffer(ring, hdr->cmd + 1, hdr->tag, "");
+}
+
void *io_thread(void *arg)
{
struct ring *ring = arg;
@@ -1014,6 +1052,10 @@ void *io_thread(void *arg)
p9_open(ring, &hdr);
break;
+ case P9_CMD_CLUNK:
+ p9_clunk(ring, &hdr);
+ break;
+
default:
syslog(LOG_DEBUG, "%u.%u sent unhandled command %u\n",
ring->device->domid, ring->device->devid, hdr.cmd);
Add the clunk request of the 9pfs protocol. Signed-off-by: Juergen Gross <jgross@suse.com> --- tools/xen-9pfsd/io.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)