Commit 3dca1a74 authored by Amir Goldstein's avatar Amir Goldstein Committed by Jan Kara

fsnotify: generalize send_to_group()

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: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 47d9c7cc
...@@ -189,46 +189,44 @@ static int send_to_group(struct inode *to_tell, ...@@ -189,46 +189,44 @@ static int send_to_group(struct inode *to_tell,
const unsigned char *file_name, const unsigned char *file_name,
struct fsnotify_iter_info *iter_info) struct fsnotify_iter_info *iter_info)
{ {
struct fsnotify_mark *inode_mark = fsnotify_iter_inode_mark(iter_info);
struct fsnotify_mark *vfsmount_mark = fsnotify_iter_vfsmount_mark(iter_info);
struct fsnotify_group *group = NULL; struct fsnotify_group *group = NULL;
__u32 test_mask = (mask & ~FS_EVENT_ON_CHILD); __u32 test_mask = (mask & ~FS_EVENT_ON_CHILD);
__u32 marks_mask = 0; __u32 marks_mask = 0;
__u32 marks_ignored_mask = 0; __u32 marks_ignored_mask = 0;
struct fsnotify_mark *mark;
int type;
if (WARN_ON(!iter_info->report_mask)) if (WARN_ON(!iter_info->report_mask))
return 0; return 0;
/* clear ignored on inode modification */ /* clear ignored on inode modification */
if (mask & FS_MODIFY) { if (mask & FS_MODIFY) {
if (inode_mark && fsnotify_foreach_obj_type(type) {
!(inode_mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY)) if (!fsnotify_iter_should_report_type(iter_info, type))
inode_mark->ignored_mask = 0; continue;
if (vfsmount_mark && mark = iter_info->marks[type];
!(vfsmount_mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY)) if (mark &&
vfsmount_mark->ignored_mask = 0; !(mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY))
} mark->ignored_mask = 0;
}
/* does the inode mark tell us to do something? */
if (inode_mark) {
group = inode_mark->group;
marks_mask |= inode_mark->mask;
marks_ignored_mask |= inode_mark->ignored_mask;
} }
/* does the vfsmount_mark tell us to do something? */ fsnotify_foreach_obj_type(type) {
if (vfsmount_mark) { if (!fsnotify_iter_should_report_type(iter_info, type))
group = vfsmount_mark->group; continue;
marks_mask |= vfsmount_mark->mask; mark = iter_info->marks[type];
marks_ignored_mask |= vfsmount_mark->ignored_mask; /* does the object mark tell us to do something? */
if (mark) {
group = mark->group;
marks_mask |= mark->mask;
marks_ignored_mask |= mark->ignored_mask;
}
} }
pr_debug("%s: group=%p to_tell=%p mask=%x inode_mark=%p" pr_debug("%s: group=%p to_tell=%p mask=%x marks_mask=%x marks_ignored_mask=%x"
" vfsmount_mark=%p marks_mask=%x marks_ignored_mask=%x"
" data=%p data_is=%d cookie=%d\n", " data=%p data_is=%d cookie=%d\n",
__func__, group, to_tell, mask, inode_mark, vfsmount_mark, __func__, group, to_tell, mask, marks_mask, marks_ignored_mask,
marks_mask, marks_ignored_mask, data, data, data_is, cookie);
data_is, cookie);
if (!(test_mask & marks_mask & ~marks_ignored_mask)) if (!(test_mask & marks_mask & ~marks_ignored_mask))
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment