diff options
Diffstat (limited to 'fs/notify/fanotify/fanotify_user.c')
-rw-r--r-- | fs/notify/fanotify/fanotify_user.c | 35 |
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; |