]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/inotify_user.c
ipg: plug Tx completion leak
[linux-2.6-omap-h63xx.git] / fs / inotify_user.c
index f2386442adeeeafad47132049aea39284fc07d98..5e009331c01ff5fbe1a453f735e906e54645368f 100644 (file)
 #include <linux/list.h>
 #include <linux/inotify.h>
 #include <linux/syscalls.h>
+#include <linux/magic.h>
 
 #include <asm/ioctls.h>
 
-static kmem_cache_t *watch_cachep __read_mostly;
-static kmem_cache_t *event_cachep __read_mostly;
+static struct kmem_cache *watch_cachep __read_mostly;
+static struct kmem_cache *event_cachep __read_mostly;
 
 static struct vfsmount *inotify_mnt __read_mostly;
 
@@ -187,7 +188,7 @@ static struct inotify_kernel_event * kernel_event(s32 wd, u32 mask, u32 cookie,
 {
        struct inotify_kernel_event *kevent;
 
-       kevent = kmem_cache_alloc(event_cachep, GFP_KERNEL);
+       kevent = kmem_cache_alloc(event_cachep, GFP_NOFS);
        if (unlikely(!kevent))
                return NULL;
 
@@ -455,8 +456,16 @@ static ssize_t inotify_read(struct file *file, char __user *buf,
                        break;
 
                kevent = inotify_dev_get_event(dev);
-               if (event_size + kevent->event.len > count)
+               if (event_size + kevent->event.len > count) {
+                       if (ret == 0 && count > 0) {
+                               /*
+                                * could not get a single event because we
+                                * didn't have enough buffer space.
+                                */
+                               ret = -EINVAL;
+                       }
                        break;
+               }
 
                if (copy_to_user(buf, &kevent->event, event_size)) {
                        ret = -EFAULT;
@@ -570,9 +579,9 @@ asmlinkage long sys_inotify_init(void)
        dev->ih = ih;
 
        filp->f_op = &inotify_fops;
-       filp->f_vfsmnt = mntget(inotify_mnt);
-       filp->f_dentry = dget(inotify_mnt->mnt_root);
-       filp->f_mapping = filp->f_dentry->d_inode->i_mapping;
+       filp->f_path.mnt = mntget(inotify_mnt);
+       filp->f_path.dentry = dget(inotify_mnt->mnt_root);
+       filp->f_mapping = filp->f_path.dentry->d_inode->i_mapping;
        filp->f_mode = FMODE_READ;
        filp->f_flags = O_RDONLY;
        filp->private_data = dev;
@@ -676,7 +685,8 @@ static int
 inotify_get_sb(struct file_system_type *fs_type, int flags,
               const char *dev_name, void *data, struct vfsmount *mnt)
 {
-       return get_sb_pseudo(fs_type, "inotify", NULL, 0xBAD1DEA, mnt);
+       return get_sb_pseudo(fs_type, "inotify", NULL,
+                       INOTIFYFS_SUPER_MAGIC, mnt);
 }
 
 static struct file_system_type inotify_fs_type = {
@@ -708,10 +718,10 @@ static int __init inotify_user_setup(void)
 
        watch_cachep = kmem_cache_create("inotify_watch_cache",
                                         sizeof(struct inotify_user_watch),
-                                        0, SLAB_PANIC, NULL, NULL);
+                                        0, SLAB_PANIC, NULL);
        event_cachep = kmem_cache_create("inotify_event_cache",
                                         sizeof(struct inotify_kernel_event),
-                                        0, SLAB_PANIC, NULL, NULL);
+                                        0, SLAB_PANIC, NULL);
 
        return 0;
 }