Skip to content

Commit

Permalink
fsnotify: send fsnotify_mark to groups in event handling functions
Browse files Browse the repository at this point in the history
With the change of fsnotify to use srcu walking the marks list instead of
walking the global groups list we now know the mark in question.  The code can
send the mark to the group's handling functions and the groups won't have to
find those marks themselves.

Signed-off-by: Eric Paris <[email protected]>
  • Loading branch information
eparis committed Jul 28, 2010
1 parent 8778abb commit 3a9b16b
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 25 deletions.
4 changes: 3 additions & 1 deletion fs/notify/dnotify/dnotify.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ static void dnotify_recalc_inode_mask(struct fsnotify_mark *fsn_mark)
* events.
*/
static int dnotify_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *mark,
struct fsnotify_event *event)
{
struct fsnotify_mark *fsn_mark = NULL;
Expand Down Expand Up @@ -130,7 +131,8 @@ static int dnotify_handle_event(struct fsnotify_group *group,
*/
static bool dnotify_should_send_event(struct fsnotify_group *group,
struct inode *inode, struct vfsmount *mnt,
__u32 mask, void *data, int data_type)
struct fsnotify_mark *mark, __u32 mask,
void *data, int data_type)
{
struct fsnotify_mark *fsn_mark;
bool send;
Expand Down
8 changes: 5 additions & 3 deletions fs/notify/fanotify/fanotify.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,9 @@ static int fanotify_get_response_from_access(struct fsnotify_group *group,
}
#endif

static int fanotify_handle_event(struct fsnotify_group *group, struct fsnotify_event *event)
static int fanotify_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *mark,
struct fsnotify_event *event)
{
int ret = 0;
struct fsnotify_event *notify_event = NULL;
Expand Down Expand Up @@ -214,8 +216,8 @@ static bool should_send_inode_event(struct fsnotify_group *group, struct inode *
}

static bool fanotify_should_send_event(struct fsnotify_group *group, struct inode *to_tell,
struct vfsmount *mnt, __u32 mask, void *data,
int data_type)
struct vfsmount *mnt, struct fsnotify_mark *mark,
__u32 mask, void *data, int data_type)
{
pr_debug("%s: group=%p to_tell=%p mnt=%p mask=%x data=%p data_type=%d\n",
__func__, group, to_tell, mnt, mask, data, data_type);
Expand Down
19 changes: 10 additions & 9 deletions fs/notify/fsnotify.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,15 +171,16 @@ void __fsnotify_flush_ignored_mask(struct inode *inode, void *data, int data_is)
}

static int send_to_group(struct fsnotify_group *group, struct inode *to_tell,
struct vfsmount *mnt, __u32 mask, void *data,
int data_is, u32 cookie, const unsigned char *file_name,
struct vfsmount *mnt, struct fsnotify_mark *mark,
__u32 mask, void *data, int data_is, u32 cookie,
const unsigned char *file_name,
struct fsnotify_event **event)
{
pr_debug("%s: group=%p to_tell=%p mnt=%p mask=%x data=%p data_is=%d"
" cookie=%d event=%p\n", __func__, group, to_tell, mnt,
mask, data, data_is, cookie, *event);
pr_debug("%s: group=%p to_tell=%p mnt=%p mark=%p mask=%x data=%p"
" data_is=%d cookie=%d event=%p\n", __func__, group, to_tell,
mnt, mark, mask, data, data_is, cookie, *event);

if (!group->ops->should_send_event(group, to_tell, mnt, mask,
if (!group->ops->should_send_event(group, to_tell, mnt, mark, mask,
data, data_is))
return 0;
if (!*event) {
Expand All @@ -189,7 +190,7 @@ static int send_to_group(struct fsnotify_group *group, struct inode *to_tell,
if (!*event)
return -ENOMEM;
}
return group->ops->handle_event(group, *event);
return group->ops->handle_event(group, mark, *event);
}

static bool needed_by_vfsmount(__u32 test_mask, struct vfsmount *mnt)
Expand Down Expand Up @@ -252,7 +253,7 @@ int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
group = mark->group;
if (!group)
continue;
ret = send_to_group(group, to_tell, NULL, mask,
ret = send_to_group(group, to_tell, NULL, mark, mask,
data, data_is, cookie, file_name,
&event);
if (ret)
Expand All @@ -271,7 +272,7 @@ int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
group = mark->group;
if (!group)
continue;
ret = send_to_group(group, to_tell, mnt, mask,
ret = send_to_group(group, to_tell, mnt, mark, mask,
data, data_is, cookie, file_name,
&event);
if (ret)
Expand Down
8 changes: 5 additions & 3 deletions fs/notify/inotify/inotify_fsnotify.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ static struct fsnotify_event *inotify_merge(struct list_head *list,
return last_event;
}

static int inotify_handle_event(struct fsnotify_group *group, struct fsnotify_event *event)
static int inotify_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *mark,
struct fsnotify_event *event)
{
struct fsnotify_mark *fsn_mark;
struct inotify_inode_mark *i_mark;
Expand Down Expand Up @@ -148,8 +150,8 @@ static void inotify_freeing_mark(struct fsnotify_mark *fsn_mark, struct fsnotify
}

static bool inotify_should_send_event(struct fsnotify_group *group, struct inode *inode,
struct vfsmount *mnt, __u32 mask, void *data,
int data_type)
struct vfsmount *mnt, struct fsnotify_mark *mark,
__u32 mask, void *data, int data_type)
{
struct fsnotify_mark *fsn_mark;
bool send;
Expand Down
7 changes: 4 additions & 3 deletions include/linux/fsnotify_backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,10 @@ struct fsnotify_event_private_data;
*/
struct fsnotify_ops {
bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode,
struct vfsmount *mnt, __u32 mask, void *data,
int data_type);
int (*handle_event)(struct fsnotify_group *group, struct fsnotify_event *event);
struct vfsmount *mnt, struct fsnotify_mark *mark,
__u32 mask, void *data, int data_type);
int (*handle_event)(struct fsnotify_group *group, struct fsnotify_mark *mark,
struct fsnotify_event *event);
void (*free_group_priv)(struct fsnotify_group *group);
void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group);
void (*free_event_priv)(struct fsnotify_event_private_data *priv);
Expand Down
8 changes: 5 additions & 3 deletions kernel/audit_tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -903,7 +903,9 @@ static void evict_chunk(struct audit_chunk *chunk)
mutex_unlock(&audit_filter_mutex);
}

static int audit_tree_handle_event(struct fsnotify_group *group, struct fsnotify_event *event)
static int audit_tree_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *mark,
struct fsnotify_event *event)
{
BUG();
return -EOPNOTSUPP;
Expand All @@ -918,8 +920,8 @@ static void audit_tree_freeing_mark(struct fsnotify_mark *entry, struct fsnotify
}

static bool audit_tree_send_event(struct fsnotify_group *group, struct inode *inode,
struct vfsmount *mnt, __u32 mask, void *data,
int data_type)
struct vfsmount *mnt, struct fsnotify_mark *mark,
__u32 mask, void *data, int data_type)
{
return 0;
}
Expand Down
8 changes: 5 additions & 3 deletions kernel/audit_watch.c
Original file line number Diff line number Diff line change
Expand Up @@ -511,8 +511,8 @@ void audit_remove_watch_rule(struct audit_krule *krule)
}

static bool audit_watch_should_send_event(struct fsnotify_group *group, struct inode *inode,
struct vfsmount *mnt, __u32 mask, void *data,
int data_type)
struct vfsmount *mnt, struct fsnotify_mark *mark,
__u32 mask, void *data, int data_type)
{
struct fsnotify_mark *entry;
bool send;
Expand All @@ -531,7 +531,9 @@ static bool audit_watch_should_send_event(struct fsnotify_group *group, struct i
}

/* Update watch data in audit rules based on fsnotify events. */
static int audit_watch_handle_event(struct fsnotify_group *group, struct fsnotify_event *event)
static int audit_watch_handle_event(struct fsnotify_group *group,
struct fsnotify_mark *mark,
struct fsnotify_event *event)
{
struct inode *inode;
__u32 mask = event->mask;
Expand Down

0 comments on commit 3a9b16b

Please sign in to comment.