aboutsummaryrefslogtreecommitdiffstats
path: root/fs/notify/fanotify/fanotify_user.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/notify/fanotify/fanotify_user.c')
-rw-r--r--fs/notify/fanotify/fanotify_user.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index bff8567aa42d..cf275500a665 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -487,20 +487,27 @@ static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark,
487 unsigned int flags, 487 unsigned int flags,
488 int *destroy) 488 int *destroy)
489{ 489{
490 __u32 oldmask; 490 __u32 oldmask = 0;
491 491
492 spin_lock(&fsn_mark->lock); 492 spin_lock(&fsn_mark->lock);
493 if (!(flags & FAN_MARK_IGNORED_MASK)) { 493 if (!(flags & FAN_MARK_IGNORED_MASK)) {
494 __u32 tmask = fsn_mark->mask & ~mask;
495
496 if (flags & FAN_MARK_ONDIR)
497 tmask &= ~FAN_ONDIR;
498
494 oldmask = fsn_mark->mask; 499 oldmask = fsn_mark->mask;
495 fsnotify_set_mark_mask_locked(fsn_mark, (oldmask & ~mask)); 500 fsnotify_set_mark_mask_locked(fsn_mark, tmask);
496 } else { 501 } else {
497 oldmask = fsn_mark->ignored_mask; 502 __u32 tmask = fsn_mark->ignored_mask & ~mask;
498 fsnotify_set_mark_ignored_mask_locked(fsn_mark, (oldmask & ~mask)); 503 if (flags & FAN_MARK_ONDIR)
504 tmask &= ~FAN_ONDIR;
505
506 fsnotify_set_mark_ignored_mask_locked(fsn_mark, tmask);
499 } 507 }
508 *destroy = !(fsn_mark->mask | fsn_mark->ignored_mask);
500 spin_unlock(&fsn_mark->lock); 509 spin_unlock(&fsn_mark->lock);
501 510
502 *destroy = !(oldmask & ~mask);
503
504 return mask & oldmask; 511 return mask & oldmask;
505} 512}
506 513
@@ -569,20 +576,22 @@ static __u32 fanotify_mark_add_to_mask(struct fsnotify_mark *fsn_mark,
569 576
570 spin_lock(&fsn_mark->lock); 577 spin_lock(&fsn_mark->lock);
571 if (!(flags & FAN_MARK_IGNORED_MASK)) { 578 if (!(flags & FAN_MARK_IGNORED_MASK)) {
579 __u32 tmask = fsn_mark->mask | mask;
580
581 if (flags & FAN_MARK_ONDIR)
582 tmask |= FAN_ONDIR;
583
572 oldmask = fsn_mark->mask; 584 oldmask = fsn_mark->mask;
573 fsnotify_set_mark_mask_locked(fsn_mark, (oldmask | mask)); 585 fsnotify_set_mark_mask_locked(fsn_mark, tmask);
574 } else { 586 } else {
575 __u32 tmask = fsn_mark->ignored_mask | mask; 587 __u32 tmask = fsn_mark->ignored_mask | mask;
588 if (flags & FAN_MARK_ONDIR)
589 tmask |= FAN_ONDIR;
590
576 fsnotify_set_mark_ignored_mask_locked(fsn_mark, tmask); 591 fsnotify_set_mark_ignored_mask_locked(fsn_mark, tmask);
577 if (flags & FAN_MARK_IGNORED_SURV_MODIFY) 592 if (flags & FAN_MARK_IGNORED_SURV_MODIFY)
578 fsn_mark->flags |= FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY; 593 fsn_mark->flags |= FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY;
579 } 594 }
580
581 if (!(flags & FAN_MARK_ONDIR)) {
582 __u32 tmask = fsn_mark->ignored_mask | FAN_ONDIR;
583 fsnotify_set_mark_ignored_mask_locked(fsn_mark, tmask);
584 }
585
586 spin_unlock(&fsn_mark->lock); 595 spin_unlock(&fsn_mark->lock);
587 596
588 return mask & ~oldmask; 597 return mask & ~oldmask;