|
@@ -28,15 +28,17 @@
|
|
|
|
|
|
#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) {
|