public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] SIGIO-driven I/O with inotify queues
@ 2007-10-18 10:10 Dmitry Antipov
  0 siblings, 0 replies; only message in thread
From: Dmitry Antipov @ 2007-10-18 10:10 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 164 bytes --]

This patch proposes SIGIO-driven I/O for descriptors returned by
inotify_init(). The thing may be enabled by convenient
fcntl (fd, F_SETFL, O_ASYNC) call.

Dmitry


[-- Attachment #2: 2.6.23-inotify-fasync.patch --]
[-- Type: text/x-patch, Size: 1979 bytes --]

Signed-off-by: Dmitry Antipov <antipov@dev.rtsoft.ru>

diff -ur -X /tmp/dontdiff .orig-2.6.23/fs/inotify_user.c 2.6.23/fs/inotify_user.c
--- .orig-2.6.23/fs/inotify_user.c	2007-10-10 00:31:38.000000000 +0400
+++ 2.6.23/fs/inotify_user.c	2007-10-18 14:06:38.000000000 +0400
@@ -78,6 +78,7 @@
 	atomic_t		count;		/* reference count */
 	struct user_struct	*user;		/* user who opened this dev */
 	struct inotify_handle	*ih;		/* inotify handle */
+	struct fasync_struct    *fa;            /* async notification */
 	unsigned int		queue_size;	/* size of the queue (bytes) */
 	unsigned int		event_count;	/* number of pending events */
 	unsigned int		max_events;	/* maximum number of events */
@@ -301,6 +302,7 @@
 	dev->queue_size += sizeof(struct inotify_event) + kevent->event.len;
 	list_add_tail(&kevent->list, &dev->events);
 	wake_up_interruptible(&dev->wq);
+	kill_fasync(&dev->fa, SIGIO, POLL_IN);
 
 out:
 	mutex_unlock(&dev->ev_mutex);
@@ -489,6 +491,13 @@
 	return ret;
 }
 
+static int inotify_fasync(int fd, struct file *file, int on)
+{
+	struct inotify_device *dev = file->private_data;
+
+	return fasync_helper(fd, file, on, &dev->fa) >= 0 ? 0 : -EIO;
+}
+
 static int inotify_release(struct inode *ignored, struct file *file)
 {
 	struct inotify_device *dev = file->private_data;
@@ -501,6 +510,9 @@
 		inotify_dev_event_dequeue(dev);
 	mutex_unlock(&dev->ev_mutex);
 
+	if (file->f_flags & FASYNC)
+		inotify_fasync(-1, file, 0);
+
 	/* free this device: the put matching the get in inotify_init() */
 	put_inotify_dev(dev);
 
@@ -529,6 +541,7 @@
 static const struct file_operations inotify_fops = {
 	.poll           = inotify_poll,
 	.read           = inotify_read,
+	.fasync         = inotify_fasync,
 	.release        = inotify_release,
 	.unlocked_ioctl = inotify_ioctl,
 	.compat_ioctl	= inotify_ioctl,
@@ -576,6 +589,7 @@
 		goto out_free_dev;
 	}
 	dev->ih = ih;
+	dev->fa = NULL;
 
 	filp->f_op = &inotify_fops;
 	filp->f_path.mnt = mntget(inotify_mnt);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-10-18 10:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-18 10:10 [PATCH] SIGIO-driven I/O with inotify queues Dmitry Antipov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox