fanotify: generalize fanotify_should_send_event()
Use fsnotify_foreach_obj_type macros to generalize the code that filters events by marks mask and ignored_mask. This is going to be used for adding mark of super block object type. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
3dca1a7494
commit
837a393438
|
@ -91,14 +91,13 @@ static bool fanotify_should_send_event(struct fsnotify_iter_info *iter_info,
|
|||
u32 event_mask, const void *data,
|
||||
int data_type)
|
||||
{
|
||||
struct fsnotify_mark *inode_mark = fsnotify_iter_inode_mark(iter_info);
|
||||
struct fsnotify_mark *vfsmnt_mark = fsnotify_iter_vfsmount_mark(iter_info);
|
||||
__u32 marks_mask = 0, marks_ignored_mask = 0;
|
||||
const struct path *path = data;
|
||||
struct fsnotify_mark *mark;
|
||||
int type;
|
||||
|
||||
pr_debug("%s: inode_mark=%p vfsmnt_mark=%p mask=%x data=%p"
|
||||
" data_type=%d\n", __func__, inode_mark, vfsmnt_mark,
|
||||
event_mask, data, data_type);
|
||||
pr_debug("%s: report_mask=%x mask=%x data=%p data_type=%d\n",
|
||||
__func__, iter_info->report_mask, event_mask, data, data_type);
|
||||
|
||||
/* if we don't have enough info to send an event to userspace say no */
|
||||
if (data_type != FSNOTIFY_EVENT_PATH)
|
||||
|
@ -109,20 +108,21 @@ static bool fanotify_should_send_event(struct fsnotify_iter_info *iter_info,
|
|||
!d_can_lookup(path->dentry))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* if the event is for a child and this inode doesn't care about
|
||||
* events on the child, don't send it!
|
||||
*/
|
||||
if (inode_mark &&
|
||||
(!(event_mask & FS_EVENT_ON_CHILD) ||
|
||||
(inode_mark->mask & FS_EVENT_ON_CHILD))) {
|
||||
marks_mask |= inode_mark->mask;
|
||||
marks_ignored_mask |= inode_mark->ignored_mask;
|
||||
}
|
||||
fsnotify_foreach_obj_type(type) {
|
||||
if (!fsnotify_iter_should_report_type(iter_info, type))
|
||||
continue;
|
||||
mark = iter_info->marks[type];
|
||||
/*
|
||||
* if the event is for a child and this inode doesn't care about
|
||||
* events on the child, don't send it!
|
||||
*/
|
||||
if (type == FSNOTIFY_OBJ_TYPE_INODE &&
|
||||
(event_mask & FS_EVENT_ON_CHILD) &&
|
||||
!(mark->mask & FS_EVENT_ON_CHILD))
|
||||
continue;
|
||||
|
||||
if (vfsmnt_mark) {
|
||||
marks_mask |= vfsmnt_mark->mask;
|
||||
marks_ignored_mask |= vfsmnt_mark->ignored_mask;
|
||||
marks_mask |= mark->mask;
|
||||
marks_ignored_mask |= mark->ignored_mask;
|
||||
}
|
||||
|
||||
if (d_is_dir(path->dentry) &&
|
||||
|
|
Loading…
Reference in New Issue