SIGIO-driven I/O with inotify queues
PATCH 1/1 SIGIO-driven I/O with inotify queues
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
Signed-off-by Dmitry Antipov <[email protected]>
fs/inotify_user.c +14 -0
@@ -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);