Commit a72fd224 authored by Amir Goldstein's avatar Amir Goldstein Committed by Jan Kara

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: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 007d1e83
...@@ -506,18 +506,10 @@ static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark, ...@@ -506,18 +506,10 @@ static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark,
spin_lock(&fsn_mark->lock); spin_lock(&fsn_mark->lock);
if (!(flags & FAN_MARK_IGNORED_MASK)) { if (!(flags & FAN_MARK_IGNORED_MASK)) {
__u32 tmask = fsn_mark->mask & ~mask;
if (flags & FAN_MARK_ONDIR)
tmask &= ~FAN_ONDIR;
oldmask = fsn_mark->mask; oldmask = fsn_mark->mask;
fsn_mark->mask = tmask; fsn_mark->mask &= ~mask;
} else { } else {
__u32 tmask = fsn_mark->ignored_mask & ~mask; fsn_mark->ignored_mask &= ~mask;
if (flags & FAN_MARK_ONDIR)
tmask &= ~FAN_ONDIR;
fsn_mark->ignored_mask = tmask;
} }
*destroy = !(fsn_mark->mask | fsn_mark->ignored_mask); *destroy = !(fsn_mark->mask | fsn_mark->ignored_mask);
spin_unlock(&fsn_mark->lock); spin_unlock(&fsn_mark->lock);
...@@ -586,19 +578,10 @@ static __u32 fanotify_mark_add_to_mask(struct fsnotify_mark *fsn_mark, ...@@ -586,19 +578,10 @@ static __u32 fanotify_mark_add_to_mask(struct fsnotify_mark *fsn_mark,
spin_lock(&fsn_mark->lock); spin_lock(&fsn_mark->lock);
if (!(flags & FAN_MARK_IGNORED_MASK)) { if (!(flags & FAN_MARK_IGNORED_MASK)) {
__u32 tmask = fsn_mark->mask | mask;
if (flags & FAN_MARK_ONDIR)
tmask |= FAN_ONDIR;
oldmask = fsn_mark->mask; oldmask = fsn_mark->mask;
fsn_mark->mask = tmask; fsn_mark->mask |= mask;
} else { } else {
__u32 tmask = fsn_mark->ignored_mask | mask; fsn_mark->ignored_mask |= mask;
if (flags & FAN_MARK_ONDIR)
tmask |= FAN_ONDIR;
fsn_mark->ignored_mask = tmask;
if (flags & FAN_MARK_IGNORED_SURV_MODIFY) if (flags & FAN_MARK_IGNORED_SURV_MODIFY)
fsn_mark->flags |= FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY; fsn_mark->flags |= FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY;
} }
...@@ -820,7 +803,7 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, ...@@ -820,7 +803,7 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
struct fsnotify_group *group; struct fsnotify_group *group;
struct fd f; struct fd f;
struct path path; struct path path;
u32 valid_mask = FAN_ALL_EVENTS | FAN_EVENT_ON_CHILD; u32 valid_mask = FAN_ALL_EVENTS | FAN_EVENT_ON_CHILD | FAN_ONDIR;
unsigned int mark_type = flags & FAN_MARK_TYPE_MASK; unsigned int mark_type = flags & FAN_MARK_TYPE_MASK;
int ret; int ret;
...@@ -857,11 +840,6 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, ...@@ -857,11 +840,6 @@ static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
return -EINVAL; return -EINVAL;
} }
if (mask & FAN_ONDIR) {
flags |= FAN_MARK_ONDIR;
mask &= ~FAN_ONDIR;
}
if (IS_ENABLED(CONFIG_FANOTIFY_ACCESS_PERMISSIONS)) if (IS_ENABLED(CONFIG_FANOTIFY_ACCESS_PERMISSIONS))
valid_mask |= FAN_ALL_PERM_EVENTS; valid_mask |= FAN_ALL_PERM_EVENTS;
......
...@@ -4,9 +4,6 @@ ...@@ -4,9 +4,6 @@
#include <uapi/linux/fanotify.h> #include <uapi/linux/fanotify.h>
/* not valid from userspace, only kernel internal */
#define FAN_MARK_ONDIR 0x80000000
#define FAN_GROUP_FLAG(group, flag) \ #define FAN_GROUP_FLAG(group, flag) \
((group)->fanotify_data.flags & (flag)) ((group)->fanotify_data.flags & (flag))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment