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: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
47d9c7cc45
commit
3dca1a7494
1 changed files with 23 additions and 25 deletions
|
@ -189,46 +189,44 @@ static int send_to_group(struct inode *to_tell,
|
|||
const unsigned char *file_name,
|
||||
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;
|
||||
__u32 test_mask = (mask & ~FS_EVENT_ON_CHILD);
|
||||
__u32 marks_mask = 0;
|
||||
__u32 marks_ignored_mask = 0;
|
||||
struct fsnotify_mark *mark;
|
||||
int type;
|
||||
|
||||
if (WARN_ON(!iter_info->report_mask))
|
||||
return 0;
|
||||
|
||||
/* clear ignored on inode modification */
|
||||
if (mask & FS_MODIFY) {
|
||||
if (inode_mark &&
|
||||
!(inode_mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY))
|
||||
inode_mark->ignored_mask = 0;
|
||||
if (vfsmount_mark &&
|
||||
!(vfsmount_mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY))
|
||||
vfsmount_mark->ignored_mask = 0;
|
||||
fsnotify_foreach_obj_type(type) {
|
||||
if (!fsnotify_iter_should_report_type(iter_info, type))
|
||||
continue;
|
||||
mark = iter_info->marks[type];
|
||||
if (mark &&
|
||||
!(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;
|
||||
fsnotify_foreach_obj_type(type) {
|
||||
if (!fsnotify_iter_should_report_type(iter_info, type))
|
||||
continue;
|
||||
mark = iter_info->marks[type];
|
||||
/* does the object mark tell us to do something? */
|
||||
if (mark) {
|
||||
group = mark->group;
|
||||
marks_mask |= mark->mask;
|
||||
marks_ignored_mask |= mark->ignored_mask;
|
||||
}
|
||||
}
|
||||
|
||||
/* does the vfsmount_mark tell us to do something? */
|
||||
if (vfsmount_mark) {
|
||||
group = vfsmount_mark->group;
|
||||
marks_mask |= vfsmount_mark->mask;
|
||||
marks_ignored_mask |= vfsmount_mark->ignored_mask;
|
||||
}
|
||||
|
||||
pr_debug("%s: group=%p to_tell=%p mask=%x inode_mark=%p"
|
||||
" vfsmount_mark=%p marks_mask=%x marks_ignored_mask=%x"
|
||||
pr_debug("%s: group=%p to_tell=%p mask=%x marks_mask=%x marks_ignored_mask=%x"
|
||||
" data=%p data_is=%d cookie=%d\n",
|
||||
__func__, group, to_tell, mask, inode_mark, vfsmount_mark,
|
||||
marks_mask, marks_ignored_mask, data,
|
||||
data_is, cookie);
|
||||
__func__, group, to_tell, mask, marks_mask, marks_ignored_mask,
|
||||
data, data_is, cookie);
|
||||
|
||||
if (!(test_mask & marks_mask & ~marks_ignored_mask))
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue