mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-14 18:34:02 +00:00
vfs: move fsnotify junk to struct mount
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
52ba1621de
commit
c63181e6b6
6 changed files with 47 additions and 42 deletions
|
@ -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 {
|
||||||
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)
|
||||||
|
|
||||||
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 @@
|
||||||
|
|
||||||
#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,
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
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 @@
|
||||||
|
|
||||||
#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,
|
||||||
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,
|
||||||
/* 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 @@
|
||||||
|
|
||||||
#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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
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,
|
||||||
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,
|
||||||
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 {
|
||||||
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 */
|
||||||
|
|
Loading…
Add table
Reference in a new issue