vfs: move fsnotify junk to struct mount
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 25 Nov 2011 07:35:16 +0000 (02:35 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 4 Jan 2012 03:57:12 +0000 (22:57 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/mount.h
fs/namespace.c
fs/notify/fanotify/fanotify_user.c
fs/notify/fsnotify.c
fs/notify/vfsmount_mark.c
include/linux/mount.h

index c5fc3f7a9580dca3ae740217fbb5e84b548165e2..e094c863c8af54a94c161ffb93bb3580f3f98d50 100644 (file)
@@ -19,7 +19,6 @@ struct mount {
 #endif
        struct list_head mnt_mounts;    /* list of children, anchored here */
        struct list_head mnt_child;     /* and going through their mnt_child */
-       /* yet to be moved - fsnotify ones go here */
        const char *mnt_devname;        /* Name of device e.g. /dev/dsk/hda1 */
        struct list_head mnt_list;
        struct list_head mnt_expire;    /* link in fs-specific expiry list */
@@ -28,6 +27,10 @@ struct mount {
        struct list_head mnt_slave;     /* slave list entry */
        struct mount *mnt_master;       /* slave is on master->mnt_slave_list */
        struct mnt_namespace *mnt_ns;   /* containing namespace */
+#ifdef CONFIG_FSNOTIFY
+       struct hlist_head mnt_fsnotify_marks;
+       __u32 mnt_fsnotify_mask;
+#endif
        int mnt_id;                     /* mount identifier */
        int mnt_group_id;               /* peer group identifier */
        int mnt_expiry_mark;            /* true if marked for expiry */
index b8a30928d0c1c5cfef12ba5adae50eb87bdfe089..124a12555fe4258b045d460f6778c59ca8b921f7 100644 (file)
@@ -173,54 +173,53 @@ unsigned int mnt_get_count(struct mount *mnt)
 
 static struct mount *alloc_vfsmnt(const char *name)
 {
-       struct mount *p = kmem_cache_zalloc(mnt_cache, GFP_KERNEL);
-       if (p) {
-               struct vfsmount *mnt = &p->mnt;
+       struct mount *mnt = kmem_cache_zalloc(mnt_cache, GFP_KERNEL);
+       if (mnt) {
                int err;
 
-               err = mnt_alloc_id(p);
+               err = mnt_alloc_id(mnt);
                if (err)
                        goto out_free_cache;
 
                if (name) {
-                       p->mnt_devname = kstrdup(name, GFP_KERNEL);
-                       if (!p->mnt_devname)
+                       mnt->mnt_devname = kstrdup(name, GFP_KERNEL);
+                       if (!mnt->mnt_devname)
                                goto out_free_id;
                }
 
 #ifdef CONFIG_SMP
-               p->mnt_pcp = alloc_percpu(struct mnt_pcp);
-               if (!p->mnt_pcp)
+               mnt->mnt_pcp = alloc_percpu(struct mnt_pcp);
+               if (!mnt->mnt_pcp)
                        goto out_free_devname;
 
-               this_cpu_add(p->mnt_pcp->mnt_count, 1);
+               this_cpu_add(mnt->mnt_pcp->mnt_count, 1);
 #else
-               p->mnt_count = 1;
-               p->mnt_writers = 0;
+               mnt->mnt_count = 1;
+               mnt->mnt_writers = 0;
 #endif
 
-               INIT_LIST_HEAD(&p->mnt_hash);
-               INIT_LIST_HEAD(&p->mnt_child);
-               INIT_LIST_HEAD(&p->mnt_mounts);
-               INIT_LIST_HEAD(&p->mnt_list);
-               INIT_LIST_HEAD(&p->mnt_expire);
-               INIT_LIST_HEAD(&p->mnt_share);
-               INIT_LIST_HEAD(&p->mnt_slave_list);
-               INIT_LIST_HEAD(&p->mnt_slave);
+               INIT_LIST_HEAD(&mnt->mnt_hash);
+               INIT_LIST_HEAD(&mnt->mnt_child);
+               INIT_LIST_HEAD(&mnt->mnt_mounts);
+               INIT_LIST_HEAD(&mnt->mnt_list);
+               INIT_LIST_HEAD(&mnt->mnt_expire);
+               INIT_LIST_HEAD(&mnt->mnt_share);
+               INIT_LIST_HEAD(&mnt->mnt_slave_list);
+               INIT_LIST_HEAD(&mnt->mnt_slave);
 #ifdef CONFIG_FSNOTIFY
                INIT_HLIST_HEAD(&mnt->mnt_fsnotify_marks);
 #endif
        }
-       return p;
+       return mnt;
 
 #ifdef CONFIG_SMP
 out_free_devname:
-       kfree(p->mnt_devname);
+       kfree(mnt->mnt_devname);
 #endif
 out_free_id:
-       mnt_free_id(p);
+       mnt_free_id(mnt);
 out_free_cache:
-       kmem_cache_free(mnt_cache, p);
+       kmem_cache_free(mnt_cache, mnt);
        return NULL;
 }
 
index 9fde1c00a29627b88f3023441a8fc840d2f415c6..3568c8a8b1387aea2845d6998b2b7e6d1dc6dcb2 100644 (file)
@@ -16,6 +16,8 @@
 
 #include <asm/ioctls.h>
 
+#include "../../mount.h"
+
 #define FANOTIFY_DEFAULT_MAX_EVENTS    16384
 #define FANOTIFY_DEFAULT_MAX_MARKS     8192
 #define FANOTIFY_DEFAULT_MAX_LISTENERS 128
@@ -546,7 +548,7 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
 
        removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags);
        fsnotify_put_mark(fsn_mark);
-       if (removed & mnt->mnt_fsnotify_mask)
+       if (removed & real_mount(mnt)->mnt_fsnotify_mask)
                fsnotify_recalc_vfsmount_mask(mnt);
 
        return 0;
@@ -623,7 +625,7 @@ static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
        }
        added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
 
-       if (added & ~mnt->mnt_fsnotify_mask)
+       if (added & ~real_mount(mnt)->mnt_fsnotify_mask)
                fsnotify_recalc_vfsmount_mask(mnt);
 err:
        fsnotify_put_mark(fsn_mark);
index 79b47cbb5cd82e8e89bf96de095bf76bcd2c0c47..ccb14d3fc0de99790d282ae17ce984338ca309ab 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <linux/fsnotify_backend.h>
 #include "fsnotify.h"
+#include "../mount.h"
 
 /*
  * Clear all of the marks on an inode when it is being evicted from core
@@ -205,13 +206,13 @@ int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
        struct fsnotify_mark *inode_mark = NULL, *vfsmount_mark = NULL;
        struct fsnotify_group *inode_group, *vfsmount_group;
        struct fsnotify_event *event = NULL;
-       struct vfsmount *mnt;
+       struct mount *mnt;
        int idx, ret = 0;
        /* global tests shouldn't care about events on child only the specific event */
        __u32 test_mask = (mask & ~FS_EVENT_ON_CHILD);
 
        if (data_is == FSNOTIFY_EVENT_PATH)
-               mnt = ((struct path *)data)->mnt;
+               mnt = real_mount(((struct path *)data)->mnt);
        else
                mnt = NULL;
 
@@ -262,11 +263,11 @@ int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
                        /* we didn't use the vfsmount_mark */
                        vfsmount_group = NULL;
                } else if (vfsmount_group > inode_group) {
-                       ret = send_to_group(to_tell, mnt, NULL, vfsmount_mark, mask, data,
+                       ret = send_to_group(to_tell, &mnt->mnt, NULL, vfsmount_mark, mask, data,
                                            data_is, cookie, file_name, &event);
                        inode_group = NULL;
                } else {
-                       ret = send_to_group(to_tell, mnt, inode_mark, vfsmount_mark,
+                       ret = send_to_group(to_tell, &mnt->mnt, inode_mark, vfsmount_mark,
                                            mask, data, data_is, cookie, file_name,
                                            &event);
                }
index 778fe6cae3b0949ea671246efe52bee6cf158985..b7b4b0e8554fb1e8ab6948f2efd35704ed156e56 100644 (file)
 
 #include <linux/fsnotify_backend.h>
 #include "fsnotify.h"
+#include "../mount.h"
 
 void fsnotify_clear_marks_by_mount(struct vfsmount *mnt)
 {
        struct fsnotify_mark *mark, *lmark;
        struct hlist_node *pos, *n;
+       struct mount *m = real_mount(mnt);
        LIST_HEAD(free_list);
 
        spin_lock(&mnt->mnt_root->d_lock);
-       hlist_for_each_entry_safe(mark, pos, n, &mnt->mnt_fsnotify_marks, m.m_list) {
+       hlist_for_each_entry_safe(mark, pos, n, &m->mnt_fsnotify_marks, m.m_list) {
                list_add(&mark->m.free_m_list, &free_list);
                hlist_del_init_rcu(&mark->m.m_list);
                fsnotify_get_mark(mark);
@@ -59,15 +61,16 @@ void fsnotify_clear_vfsmount_marks_by_group(struct fsnotify_group *group)
  */
 static void fsnotify_recalc_vfsmount_mask_locked(struct vfsmount *mnt)
 {
+       struct mount *m = real_mount(mnt);
        struct fsnotify_mark *mark;
        struct hlist_node *pos;
        __u32 new_mask = 0;
 
        assert_spin_locked(&mnt->mnt_root->d_lock);
 
-       hlist_for_each_entry(mark, pos, &mnt->mnt_fsnotify_marks, m.m_list)
+       hlist_for_each_entry(mark, pos, &m->mnt_fsnotify_marks, m.m_list)
                new_mask |= mark->mask;
-       mnt->mnt_fsnotify_mask = new_mask;
+       m->mnt_fsnotify_mask = new_mask;
 }
 
 /*
@@ -101,12 +104,13 @@ void fsnotify_destroy_vfsmount_mark(struct fsnotify_mark *mark)
 static struct fsnotify_mark *fsnotify_find_vfsmount_mark_locked(struct fsnotify_group *group,
                                                                struct vfsmount *mnt)
 {
+       struct mount *m = real_mount(mnt);
        struct fsnotify_mark *mark;
        struct hlist_node *pos;
 
        assert_spin_locked(&mnt->mnt_root->d_lock);
 
-       hlist_for_each_entry(mark, pos, &mnt->mnt_fsnotify_marks, m.m_list) {
+       hlist_for_each_entry(mark, pos, &m->mnt_fsnotify_marks, m.m_list) {
                if (mark->group == group) {
                        fsnotify_get_mark(mark);
                        return mark;
@@ -140,6 +144,7 @@ int fsnotify_add_vfsmount_mark(struct fsnotify_mark *mark,
                               struct fsnotify_group *group, struct vfsmount *mnt,
                               int allow_dups)
 {
+       struct mount *m = real_mount(mnt);
        struct fsnotify_mark *lmark;
        struct hlist_node *node, *last = NULL;
        int ret = 0;
@@ -154,13 +159,13 @@ int fsnotify_add_vfsmount_mark(struct fsnotify_mark *mark,
        mark->m.mnt = mnt;
 
        /* is mark the first mark? */
-       if (hlist_empty(&mnt->mnt_fsnotify_marks)) {
-               hlist_add_head_rcu(&mark->m.m_list, &mnt->mnt_fsnotify_marks);
+       if (hlist_empty(&m->mnt_fsnotify_marks)) {
+               hlist_add_head_rcu(&mark->m.m_list, &m->mnt_fsnotify_marks);
                goto out;
        }
 
        /* should mark be in the middle of the current list? */
-       hlist_for_each_entry(lmark, node, &mnt->mnt_fsnotify_marks, m.m_list) {
+       hlist_for_each_entry(lmark, node, &m->mnt_fsnotify_marks, m.m_list) {
                last = node;
 
                if ((lmark->group == group) && !allow_dups) {
index f18dd1bfcbda12b5a20d4d4f4912b06c624cf143..d7029f4a191a093ef9294104c75756b6d3b7faee 100644 (file)
@@ -51,11 +51,6 @@ struct vfsmount {
        struct dentry *mnt_root;        /* root of the mounted tree */
        struct super_block *mnt_sb;     /* pointer to superblock */
        int mnt_flags;
-       /* 4 bytes hole on 64bits arches without fsnotify */
-#ifdef CONFIG_FSNOTIFY
-       __u32 mnt_fsnotify_mask;
-       struct hlist_head mnt_fsnotify_marks;
-#endif
 };
 
 struct file; /* forward dec */