Skip to content

Commit

Permalink
fsnotify: clear ignored mask on modify
Browse files Browse the repository at this point in the history
On inode modification we clear the ignored mask for all of the marks on the
inode.  This allows userspace to ignore accesses to inodes until there is
something different.

Signed-off-by: Eric Paris <eparis@redhat.com>
  • Loading branch information
Eric Paris committed Jul 28, 2010
1 parent b9e4e3b commit e898386
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions fs/notify/fsnotify.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,33 @@ void __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask)
}
EXPORT_SYMBOL_GPL(__fsnotify_parent);

void __fsnotify_flush_ignored_mask(struct inode *inode, void *data, int data_is)
{
struct fsnotify_mark *mark;
struct hlist_node *node;

if (!hlist_empty(&inode->i_fsnotify_marks)) {
spin_lock(&inode->i_lock);
hlist_for_each_entry(mark, node, &inode->i_fsnotify_marks, i.i_list) {
mark->ignored_mask = 0;
}
spin_unlock(&inode->i_lock);
}

if (data_is == FSNOTIFY_EVENT_PATH) {
struct vfsmount *mnt;

mnt = ((struct path *)data)->mnt;
if (mnt && !hlist_empty(&mnt->mnt_fsnotify_marks)) {
spin_lock(&mnt->mnt_root->d_lock);
hlist_for_each_entry(mark, node, &mnt->mnt_fsnotify_marks, m.m_list) {
mark->ignored_mask = 0;
}
spin_unlock(&mnt->mnt_root->d_lock);
}
}
}

static void send_to_group(struct fsnotify_group *group, struct inode *to_tell,
struct vfsmount *mnt, __u32 mask, void *data,
int data_is, u32 cookie, const char *file_name,
Expand Down Expand Up @@ -170,6 +197,7 @@ static bool needed_by_vfsmount(__u32 test_mask, struct vfsmount *mnt)

return (test_mask & mnt->mnt_fsnotify_mask);
}

/*
* This is the main call to fsnotify. The VFS calls into hook specific functions
* in linux/fsnotify.h. Those functions then in turn call here. Here will call
Expand All @@ -190,6 +218,9 @@ void fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is, const
list_empty(&fsnotify_vfsmount_groups))
return;

if (mask & FS_MODIFY)
__fsnotify_flush_ignored_mask(to_tell, data, data_is);

/* if none of the directed listeners or vfsmount listeners care */
if (!(test_mask & fsnotify_inode_mask) &&
!(test_mask & fsnotify_vfsmount_mask))
Expand Down

0 comments on commit e898386

Please sign in to comment.