diff options
author | Amir Goldstein <amir73il@gmail.com> | 2018-10-03 17:25:34 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2018-10-04 07:28:29 -0400 |
commit | a72fd224e37bf6a0630bce302deebbccbc236ba2 (patch) | |
tree | f4d2451ae1391a8369e9b34c3fefc58a72f680e0 /fs/notify | |
parent | 007d1e8395eaa59b0e7ad9eb2b53a40859446a88 (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.c | 32 |
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 | ||