[PATCH 6/7] FUSE: implement unsolicited notification

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <fuse-devel@...>, <miklos@...>, <greg@...>, <linux-kernel@...>
Cc: Tejun Heo <tj@...>
Date: Thursday, August 28, 2008 - 1:41 pm

Clients always used to write only in response to read requests.  To
implement poll efficiently, clients should be able to issue
unsolicited notifications.  This patch implements basic notification
support.

Zero fuse_out_header.unique is now accepted and considered unsolicited
notification and the error field contains notification code.  This
patch doesn't implement any actual notification.

Signed-off-by: Tejun Heo <tj@kernel.org>
---
 fs/fuse/dev.c        |   34 ++++++++++++++++++++++++++++++++--
 include/linux/fuse.h |    4 ++++
 2 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 87250b6..2fb65a5 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -813,6 +813,21 @@ static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov,
 	return err;
 }
 
+static int fuse_handle_notify(struct fuse_conn *fc, enum fuse_notify_code code,
+			      unsigned int size, struct fuse_copy_state *cs)
+{
+	int err;
+
+	switch (code) {
+	default:
+		err = -EINVAL;
+		break;
+	}
+
+	fuse_copy_finish(cs);
+	return err;
+}
+
 /* Look up request on processing list by unique ID */
 static struct fuse_req *request_find(struct fuse_conn *fc, u64 unique)
 {
@@ -876,9 +891,24 @@ static ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov,
 	err = fuse_copy_one(&cs, &oh, sizeof(oh));
 	if (err)
 		goto err_finish;
+
+	if (oh.len != nbytes)
+		goto err_finish;
+
+	/*
+	 * Zero oh.unique indicates unsolicited notification message
+	 * and error contains notification code.
+	 */
+	if (!oh.unique) {
+		err = fuse_handle_notify(fc, oh.error, nbytes - sizeof(oh),
+					 &cs);
+		if (err)
+			return err;
+		return nbytes;
+	}
+
 	err = -EINVAL;
-	if (!oh.unique || oh.error <= -1000 || oh.error > 0 ||
-	    oh.len != nbytes)
+	if (oh.error <= -1000 || oh.error > 0)
 		goto err_finish;
 
 	spin_lock(&fc->lock);
diff --git a/include/linux/fuse.h b/include/linux/fuse.h
index 5a396d3..0044590 100644
--- a/include/linux/fuse.h
+++ b/include/linux/fuse.h
@@ -206,6 +206,10 @@ enum fuse_opcode {
 	FUSE_IOCTL         = 40,
 };
 
+enum fuse_notify_code {
+	FUSE_NOTIFY_CODE_MAX,
+};
+
 /* The read buffer is required to be at least 8k, but may be much larger */
 #define FUSE_MIN_READ_BUFFER 8192
 
-- 
1.5.4.5

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Re: [PATCHSET] FUSE: extend FUSE to support more operations, Miklos Szeredi, (Thu Nov 13, 10:48 am)
Re: [PATCHSET] FUSE: extend FUSE to support more operations, Miklos Szeredi, (Thu Nov 13, 11:52 am)
Re: [PATCHSET] FUSE: extend FUSE to support more operations, Christoph Hellwig, (Wed Nov 12, 5:14 am)
Re: [fuse-devel] [PATCHSET] FUSE: extend FUSE to support mor..., Szabolcs Szakacsits, (Tue Oct 14, 8:16 am)
[PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 1:41 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, H. Peter Anvin, (Thu Aug 28, 2:20 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 2:28 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, H. Peter Anvin, (Thu Aug 28, 3:08 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Thu Aug 28, 3:18 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, H. Peter Anvin, (Thu Aug 28, 4:21 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Thu Aug 28, 4:55 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, H. Peter Anvin, (Thu Aug 28, 5:27 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Fri Aug 29, 3:32 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Greg KH, (Thu Aug 28, 1:51 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 1:59 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 2:02 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Greg KH, (Thu Aug 28, 2:14 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 2:25 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 2:01 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Thu Aug 28, 2:13 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 2:17 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Thu Aug 28, 2:23 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 2:34 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Alan Cox, (Thu Aug 28, 4:48 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Thu Aug 28, 3:25 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 3:42 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Thu Aug 28, 4:02 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Thu Aug 28, 10:19 pm)
Re: [fuse-devel] [PATCH 5/7] FUSE: implement ioctl support, Roger Willcocks, (Fri Aug 29, 7:31 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Fri Aug 29, 3:59 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Fri Aug 29, 4:12 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Fri Aug 29, 4:29 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Fri Aug 29, 5:03 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Eric W. Biederman, (Fri Aug 29, 3:17 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Miklos Szeredi, (Mon Sep 1, 7:57 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Mon Sep 1, 8:03 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Eric W. Biederman, (Wed Sep 3, 10:32 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Wed Sep 3, 10:40 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Eric W. Biederman, (Wed Sep 3, 5:51 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Wed Sep 3, 8:09 pm)
Re: [PATCH 5/7] FUSE: implement ioctl support, Tejun Heo, (Sat Aug 30, 7:40 am)
Re: [PATCH 5/7] FUSE: implement ioctl support, Arnd Bergmann, (Fri Aug 29, 3:47 pm)
[PATCH 7/7] FUSE: implement poll support, Tejun Heo, (Thu Aug 28, 1:41 pm)
[PATCH 6/7] FUSE: implement unsolicited notification, Tejun Heo, (Thu Aug 28, 1:41 pm)
[PATCH 4/7] FUSE: implement direct lseek support, Tejun Heo, (Thu Aug 28, 1:41 pm)
[PATCH 1/7] FUSE: add include protectors, Tejun Heo, (Thu Aug 28, 1:40 pm)
[PATCH 3/7] FUSE: implement nonseekable open, Tejun Heo, (Thu Aug 28, 1:40 pm)
[PATCH 2/7] FUSE: pass nonblock flag to client, Tejun Heo, (Thu Aug 28, 1:40 pm)