提交 c63181e6 编写于 作者: A Al Viro

vfs: move fsnotify junk to struct mount

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 52ba1621
...@@ -19,7 +19,6 @@ struct mount { ...@@ -19,7 +19,6 @@ struct mount {
#endif #endif
struct list_head mnt_mounts; /* list of children, anchored here */ struct list_head mnt_mounts; /* list of children, anchored here */
struct list_head mnt_child; /* and going through their mnt_child */ 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 */ const char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */
struct list_head mnt_list; struct list_head mnt_list;
struct list_head mnt_expire; /* link in fs-specific expiry list */ struct list_head mnt_expire; /* link in fs-specific expiry list */
...@@ -28,6 +27,10 @@ struct mount { ...@@ -28,6 +27,10 @@ struct mount {
struct list_head mnt_slave; /* slave list entry */ struct list_head mnt_slave; /* slave list entry */
struct mount *mnt_master; /* slave is on master->mnt_slave_list */ struct mount *mnt_master; /* slave is on master->mnt_slave_list */
struct mnt_namespace *mnt_ns; /* containing namespace */ 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_id; /* mount identifier */
int mnt_group_id; /* peer group identifier */ int mnt_group_id; /* peer group identifier */
int mnt_expiry_mark; /* true if marked for expiry */ int mnt_expiry_mark; /* true if marked for expiry */
......
...@@ -173,54 +173,53 @@ unsigned int mnt_get_count(struct mount *mnt) ...@@ -173,54 +173,53 @@ unsigned int mnt_get_count(struct mount *mnt)
static struct mount *alloc_vfsmnt(const char *name) static struct mount *alloc_vfsmnt(const char *name)
{ {
struct mount *p = kmem_cache_zalloc(mnt_cache, GFP_KERNEL); struct mount *mnt = kmem_cache_zalloc(mnt_cache, GFP_KERNEL);
if (p) { if (mnt) {
struct vfsmount *mnt = &p->mnt;
int err; int err;
err = mnt_alloc_id(p); err = mnt_alloc_id(mnt);
if (err) if (err)
goto out_free_cache; goto out_free_cache;
if (name) { if (name) {
p->mnt_devname = kstrdup(name, GFP_KERNEL); mnt->mnt_devname = kstrdup(name, GFP_KERNEL);
if (!p->mnt_devname) if (!mnt->mnt_devname)
goto out_free_id; goto out_free_id;
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
p->mnt_pcp = alloc_percpu(struct mnt_pcp); mnt->mnt_pcp = alloc_percpu(struct mnt_pcp);
if (!p->mnt_pcp) if (!mnt->mnt_pcp)
goto out_free_devname; goto out_free_devname;
this_cpu_add(p->mnt_pcp->mnt_count, 1); this_cpu_add(mnt->mnt_pcp->mnt_count, 1);
#else #else
p->mnt_count = 1; mnt->mnt_count = 1;
p->mnt_writers = 0; mnt->mnt_writers = 0;
#endif #endif
INIT_LIST_HEAD(&p->mnt_hash); INIT_LIST_HEAD(&mnt->mnt_hash);
INIT_LIST_HEAD(&p->mnt_child); INIT_LIST_HEAD(&mnt->mnt_child);
INIT_LIST_HEAD(&p->mnt_mounts); INIT_LIST_HEAD(&mnt->mnt_mounts);
INIT_LIST_HEAD(&p->mnt_list); INIT_LIST_HEAD(&mnt->mnt_list);
INIT_LIST_HEAD(&p->mnt_expire); INIT_LIST_HEAD(&mnt->mnt_expire);
INIT_LIST_HEAD(&p->mnt_share); INIT_LIST_HEAD(&mnt->mnt_share);
INIT_LIST_HEAD(&p->mnt_slave_list); INIT_LIST_HEAD(&mnt->mnt_slave_list);
INIT_LIST_HEAD(&p->mnt_slave); INIT_LIST_HEAD(&mnt->mnt_slave);
#ifdef CONFIG_FSNOTIFY #ifdef CONFIG_FSNOTIFY
INIT_HLIST_HEAD(&mnt->mnt_fsnotify_marks); INIT_HLIST_HEAD(&mnt->mnt_fsnotify_marks);
#endif #endif
} }
return p; return mnt;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
out_free_devname: out_free_devname:
kfree(p->mnt_devname); kfree(mnt->mnt_devname);
#endif #endif
out_free_id: out_free_id:
mnt_free_id(p); mnt_free_id(mnt);
out_free_cache: out_free_cache:
kmem_cache_free(mnt_cache, p); kmem_cache_free(mnt_cache, mnt);
return NULL; return NULL;
} }
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#include <asm/ioctls.h> #include <asm/ioctls.h>
#include "../../mount.h"
#define FANOTIFY_DEFAULT_MAX_EVENTS 16384 #define FANOTIFY_DEFAULT_MAX_EVENTS 16384
#define FANOTIFY_DEFAULT_MAX_MARKS 8192 #define FANOTIFY_DEFAULT_MAX_MARKS 8192
#define FANOTIFY_DEFAULT_MAX_LISTENERS 128 #define FANOTIFY_DEFAULT_MAX_LISTENERS 128
...@@ -546,7 +548,7 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group, ...@@ -546,7 +548,7 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags); removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags);
fsnotify_put_mark(fsn_mark); fsnotify_put_mark(fsn_mark);
if (removed & mnt->mnt_fsnotify_mask) if (removed & real_mount(mnt)->mnt_fsnotify_mask)
fsnotify_recalc_vfsmount_mask(mnt); fsnotify_recalc_vfsmount_mask(mnt);
return 0; return 0;
...@@ -623,7 +625,7 @@ static int fanotify_add_vfsmount_mark(struct fsnotify_group *group, ...@@ -623,7 +625,7 @@ static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
} }
added = fanotify_mark_add_to_mask(fsn_mark, mask, flags); 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); fsnotify_recalc_vfsmount_mask(mnt);
err: err:
fsnotify_put_mark(fsn_mark); fsnotify_put_mark(fsn_mark);
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/fsnotify_backend.h> #include <linux/fsnotify_backend.h>
#include "fsnotify.h" #include "fsnotify.h"
#include "../mount.h"
/* /*
* Clear all of the marks on an inode when it is being evicted from core * 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, ...@@ -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_mark *inode_mark = NULL, *vfsmount_mark = NULL;
struct fsnotify_group *inode_group, *vfsmount_group; struct fsnotify_group *inode_group, *vfsmount_group;
struct fsnotify_event *event = NULL; struct fsnotify_event *event = NULL;
struct vfsmount *mnt; struct mount *mnt;
int idx, ret = 0; int idx, ret = 0;
/* global tests shouldn't care about events on child only the specific event */ /* global tests shouldn't care about events on child only the specific event */
__u32 test_mask = (mask & ~FS_EVENT_ON_CHILD); __u32 test_mask = (mask & ~FS_EVENT_ON_CHILD);
if (data_is == FSNOTIFY_EVENT_PATH) if (data_is == FSNOTIFY_EVENT_PATH)
mnt = ((struct path *)data)->mnt; mnt = real_mount(((struct path *)data)->mnt);
else else
mnt = NULL; mnt = NULL;
...@@ -262,11 +263,11 @@ int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, ...@@ -262,11 +263,11 @@ int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
/* we didn't use the vfsmount_mark */ /* we didn't use the vfsmount_mark */
vfsmount_group = NULL; vfsmount_group = NULL;
} else if (vfsmount_group > inode_group) { } 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); data_is, cookie, file_name, &event);
inode_group = NULL; inode_group = NULL;
} else { } 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, mask, data, data_is, cookie, file_name,
&event); &event);
} }
......
...@@ -28,15 +28,17 @@ ...@@ -28,15 +28,17 @@
#include <linux/fsnotify_backend.h> #include <linux/fsnotify_backend.h>
#include "fsnotify.h" #include "fsnotify.h"
#include "../mount.h"
void fsnotify_clear_marks_by_mount(struct vfsmount *mnt) void fsnotify_clear_marks_by_mount(struct vfsmount *mnt)
{ {
struct fsnotify_mark *mark, *lmark; struct fsnotify_mark *mark, *lmark;
struct hlist_node *pos, *n; struct hlist_node *pos, *n;
struct mount *m = real_mount(mnt);
LIST_HEAD(free_list); LIST_HEAD(free_list);
spin_lock(&mnt->mnt_root->d_lock); 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); list_add(&mark->m.free_m_list, &free_list);
hlist_del_init_rcu(&mark->m.m_list); hlist_del_init_rcu(&mark->m.m_list);
fsnotify_get_mark(mark); fsnotify_get_mark(mark);
...@@ -59,15 +61,16 @@ void fsnotify_clear_vfsmount_marks_by_group(struct fsnotify_group *group) ...@@ -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) static void fsnotify_recalc_vfsmount_mask_locked(struct vfsmount *mnt)
{ {
struct mount *m = real_mount(mnt);
struct fsnotify_mark *mark; struct fsnotify_mark *mark;
struct hlist_node *pos; struct hlist_node *pos;
__u32 new_mask = 0; __u32 new_mask = 0;
assert_spin_locked(&mnt->mnt_root->d_lock); 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; 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) ...@@ -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, static struct fsnotify_mark *fsnotify_find_vfsmount_mark_locked(struct fsnotify_group *group,
struct vfsmount *mnt) struct vfsmount *mnt)
{ {
struct mount *m = real_mount(mnt);
struct fsnotify_mark *mark; struct fsnotify_mark *mark;
struct hlist_node *pos; struct hlist_node *pos;
assert_spin_locked(&mnt->mnt_root->d_lock); 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) { if (mark->group == group) {
fsnotify_get_mark(mark); fsnotify_get_mark(mark);
return mark; return mark;
...@@ -140,6 +144,7 @@ int fsnotify_add_vfsmount_mark(struct fsnotify_mark *mark, ...@@ -140,6 +144,7 @@ int fsnotify_add_vfsmount_mark(struct fsnotify_mark *mark,
struct fsnotify_group *group, struct vfsmount *mnt, struct fsnotify_group *group, struct vfsmount *mnt,
int allow_dups) int allow_dups)
{ {
struct mount *m = real_mount(mnt);
struct fsnotify_mark *lmark; struct fsnotify_mark *lmark;
struct hlist_node *node, *last = NULL; struct hlist_node *node, *last = NULL;
int ret = 0; int ret = 0;
...@@ -154,13 +159,13 @@ int fsnotify_add_vfsmount_mark(struct fsnotify_mark *mark, ...@@ -154,13 +159,13 @@ int fsnotify_add_vfsmount_mark(struct fsnotify_mark *mark,
mark->m.mnt = mnt; mark->m.mnt = mnt;
/* is mark the first mark? */ /* is mark the first mark? */
if (hlist_empty(&mnt->mnt_fsnotify_marks)) { if (hlist_empty(&m->mnt_fsnotify_marks)) {
hlist_add_head_rcu(&mark->m.m_list, &mnt->mnt_fsnotify_marks); hlist_add_head_rcu(&mark->m.m_list, &m->mnt_fsnotify_marks);
goto out; goto out;
} }
/* should mark be in the middle of the current list? */ /* 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; last = node;
if ((lmark->group == group) && !allow_dups) { if ((lmark->group == group) && !allow_dups) {
......
...@@ -51,11 +51,6 @@ struct vfsmount { ...@@ -51,11 +51,6 @@ struct vfsmount {
struct dentry *mnt_root; /* root of the mounted tree */ struct dentry *mnt_root; /* root of the mounted tree */
struct super_block *mnt_sb; /* pointer to superblock */ struct super_block *mnt_sb; /* pointer to superblock */
int mnt_flags; 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 */ struct file; /* forward dec */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册