Skip to content

Commit 92183a4

Browse files
amir73iljankara
authored andcommitted
fsnotify: fix ignore mask logic in send_to_group()
The ignore mask logic in send_to_group() does not match the logic in fanotify_should_send_event(). In the latter, a vfsmount mark ignore mask precedes an inode mark mask and in the former, it does not. That difference may cause events to be sent to fanotify backend for no reason. Fix the logic in send_to_group() to match that of fanotify_should_send_event(). Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
1 parent 5ac7c2f commit 92183a4

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

fs/notify/fsnotify.c

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,9 @@ static int send_to_group(struct inode *to_tell,
192192
struct fsnotify_iter_info *iter_info)
193193
{
194194
struct fsnotify_group *group = NULL;
195-
__u32 inode_test_mask = 0;
196-
__u32 vfsmount_test_mask = 0;
195+
__u32 test_mask = (mask & ~FS_EVENT_ON_CHILD);
196+
__u32 marks_mask = 0;
197+
__u32 marks_ignored_mask = 0;
197198

198199
if (unlikely(!inode_mark && !vfsmount_mark)) {
199200
BUG();
@@ -213,29 +214,25 @@ static int send_to_group(struct inode *to_tell,
213214
/* does the inode mark tell us to do something? */
214215
if (inode_mark) {
215216
group = inode_mark->group;
216-
inode_test_mask = (mask & ~FS_EVENT_ON_CHILD);
217-
inode_test_mask &= inode_mark->mask;
218-
inode_test_mask &= ~inode_mark->ignored_mask;
217+
marks_mask |= inode_mark->mask;
218+
marks_ignored_mask |= inode_mark->ignored_mask;
219219
}
220220

221221
/* does the vfsmount_mark tell us to do something? */
222222
if (vfsmount_mark) {
223-
vfsmount_test_mask = (mask & ~FS_EVENT_ON_CHILD);
224223
group = vfsmount_mark->group;
225-
vfsmount_test_mask &= vfsmount_mark->mask;
226-
vfsmount_test_mask &= ~vfsmount_mark->ignored_mask;
227-
if (inode_mark)
228-
vfsmount_test_mask &= ~inode_mark->ignored_mask;
224+
marks_mask |= vfsmount_mark->mask;
225+
marks_ignored_mask |= vfsmount_mark->ignored_mask;
229226
}
230227

231228
pr_debug("%s: group=%p to_tell=%p mask=%x inode_mark=%p"
232-
" inode_test_mask=%x vfsmount_mark=%p vfsmount_test_mask=%x"
229+
" vfsmount_mark=%p marks_mask=%x marks_ignored_mask=%x"
233230
" data=%p data_is=%d cookie=%d\n",
234-
__func__, group, to_tell, mask, inode_mark,
235-
inode_test_mask, vfsmount_mark, vfsmount_test_mask, data,
231+
__func__, group, to_tell, mask, inode_mark, vfsmount_mark,
232+
marks_mask, marks_ignored_mask, data,
236233
data_is, cookie);
237234

238-
if (!inode_test_mask && !vfsmount_test_mask)
235+
if (!(test_mask & marks_mask & ~marks_ignored_mask))
239236
return 0;
240237

241238
return group->ops->handle_event(group, to_tell, inode_mark,

0 commit comments

Comments
 (0)