summaryrefslogtreecommitdiffstats
path: root/fs/notify
diff options
context:
space:
mode:
authorAmir Goldstein <amir73il@gmail.com>2018-10-03 17:25:34 -0400
committerJan Kara <jack@suse.cz>2018-10-04 07:28:29 -0400
commita72fd224e37bf6a0630bce302deebbccbc236ba2 (patch)
treef4d2451ae1391a8369e9b34c3fefc58a72f680e0 /fs/notify
parent007d1e8395eaa59b0e7ad9eb2b53a40859446a88 (diff)
fanotify: simplify handling of FAN_ONDIR
fanotify mark add/remove code jumps through hoops to avoid setting the FS_ISDIR in the commulative object mask. That was just papering over a bug in fsnotify() handling of the FS_ISDIR extra flag. This bug is now fixed, so all the hoops can be removed along with the unneeded internal flag FAN_MARK_ONDIR. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/notify')
-rw-r--r--fs/notify/fanotify/fanotify_user.c32
1 files changed, 5 insertions, 27 deletions
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index 15719d4aa4b5..34b511407035 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -506,18 +506,10 @@ static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark,
506 506
507 spin_lock(&fsn_mark->lock); 507 spin_lock(&fsn_mark->lock);
508 if (!(flags & FAN_MARK_IGNORED_MASK)) { 508 if (!(flags & FAN_MARK_IGNORED_MASK)) {
509 __u32 tmask = fsn_mark->mask & ~mask;
510
511 if (flags & FAN_MARK_ONDIR)
512 tmask &= ~FAN_ONDIR;
513
514 oldmask = fsn_mark->mask; 509 oldmask = fsn_mark->mask;
515 fsn_mark->mask = tmask; 510 fsn_mark->mask &= ~mask;
516 } else { 511 } else {
517 __u32 tmask = fsn_mark->ignored_mask & ~mask; 512 fsn_mark->ignored_mask &= ~mask;
518 if (flags & FAN_MARK_ONDIR)
519 tmask &= ~FAN_ONDIR;
520 fsn_mark->ignored_mask = tmask;
521 } 513 }
522 *destroy = !(fsn_mark->mask | fsn_mark->ignored_mask); 514 *destroy = !(fsn_mark->mask | fsn_mark->ignored_mask);
523 spin_unlock(&fsn_mark->lock); 515 spin_unlock(&fsn_mark->lock);
@@ -586,19 +578,10 @@ static __u32 fanotify_mark_add_to_mask(struct fsnotify_mark *fsn_mark,
586 578
587 spin_lock(&fsn_mark->lock); 579 spin_lock(&fsn_mark->lock);
588 if (!(flags & FAN_MARK_IGNORED_MASK)) { 580 if (!(flags & FAN_MARK_IGNORED_MASK)) {
589 __u32 tmask = fsn_mark->mask | mask;
590
591 if (flags & FAN_MARK_ONDIR)
592 tmask |= FAN_ONDIR;
593
594 oldmask = fsn_mark->mask; 581 oldmask = fsn_mark->mask;
595 fsn_mark->mask = tmask; 582 fsn_mark->mask |= mask;
596 } else { 583 } else {
597 __u32 tmask = fsn_mark->ignored_mask | mask; 584 fsn_mark->ignored_mask |= mask;
598 if (flags & FAN_MARK_ONDIR)
599 tmask |= FAN_ONDIR;
600
601 fsn_mark->ignored_mask = tmask;
602 if (flags & FAN_MARK_IGNORED_SURV_MODIFY) 585 if (flags & FAN_MARK_IGNORED_SURV_MODIFY)
603 fsn_mark->flags |= FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY; 586 fsn_mark->flags |= FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY;
604 } 587 }
@@ -820,7 +803,7 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
820 struct fsnotify_group *group; 803 struct fsnotify_group *group;
821 struct fd f; 804 struct fd f;
822 struct path path; 805 struct path path;
823 u32 valid_mask = FAN_ALL_EVENTS | FAN_EVENT_ON_CHILD; 806 u32 valid_mask = FAN_ALL_EVENTS | FAN_EVENT_ON_CHILD | FAN_ONDIR;
824 unsigned int mark_type = flags & FAN_MARK_TYPE_MASK; 807 unsigned int mark_type = flags & FAN_MARK_TYPE_MASK;
825 int ret; 808 int ret;
826 809
@@ -857,11 +840,6 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
857 return -EINVAL; 840 return -EINVAL;
858 } 841 }
859 842
860 if (mask & FAN_ONDIR) {
861 flags |= FAN_MARK_ONDIR;
862 mask &= ~FAN_ONDIR;
863 }
864
865 if (IS_ENABLED(CONFIG_FANOTIFY_ACCESS_PERMISSIONS)) 843 if (IS_ENABLED(CONFIG_FANOTIFY_ACCESS_PERMISSIONS))
866 valid_mask |= FAN_ALL_PERM_EVENTS; 844 valid_mask |= FAN_ALL_PERM_EVENTS;
867 845