-----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCAAdFiEEq1nRK9aeMoq1VSgcnJ2qBz9kQNkFAl7Y2McACgkQnJ2qBz9k
 QNlHzwf/e4oz9oRCXPqBwh6C318nl6ksQO5ooW+Dhb535cr/Cn99nuZa3GrvW+aq
 eSbypsvZQMguk0/okEc4jcTgLmEw+KubpBXOi/DJZ9dzGQrvjT2nBkQmaTqwp9dO
 WMZcJLmszkrtokjKD4lVjyQArcwqQF/v/moEKIImw5A6CY4R4odTaUOCPnTwF7P6
 OXsDPwRfAccJ25ZUZ8hjc+fRl/Ncex6szciaJ08T4btlaAtc5UIn5Sy/u8BqNNiw
 0VRheD4sJ2c25hLOIQJ5RETIeuYaRcR/BA3vm+k1d2iIiw4ubj9+ppwiaWOryA9U
 5fXnBmXKuUUrwFihzmiLSckIpm3IPg==
 =kghV
 -----END PGP SIGNATURE-----

Merge tag 'fsnotify_for_v5.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs

Pull fsnotify updates from Jan Kara:
 "Several smaller fixes and cleanups for fsnotify subsystem"

* tag 'fsnotify_for_v5.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
  fanotify: fix ignore mask logic for events on child and on dir
  fanotify: don't write with size under sizeof(response)
  fsnotify: Remove proc_fs.h include
  fanotify: remove reference to fill_event_metadata()
  fsnotify: add mutex destroy
  fanotify: prefix should_merge()
  fanotify: Replace zero-length array with flexible-array
  inotify: Fix error return code assignment flow.
  fsnotify: Add missing annotation for fsnotify_finish_user_wait() and for fsnotify_prepare_user_wait()
This commit is contained in:
Linus Torvalds 2020-06-04 13:51:54 -07:00
commit 07c8f3bfef
7 changed files with 19 additions and 12 deletions

View file

@ -70,7 +70,7 @@ static bool fanotify_name_event_equal(struct fanotify_name_event *fne1,
return !memcmp(fne1->name, fne2->name, fne1->name_len); return !memcmp(fne1->name, fne2->name, fne1->name_len);
} }
static bool should_merge(struct fsnotify_event *old_fsn, static bool fanotify_should_merge(struct fsnotify_event *old_fsn,
struct fsnotify_event *new_fsn) struct fsnotify_event *new_fsn)
{ {
struct fanotify_event *old, *new; struct fanotify_event *old, *new;
@ -129,7 +129,7 @@ static int fanotify_merge(struct list_head *list, struct fsnotify_event *event)
return 0; return 0;
list_for_each_entry_reverse(test_event, list, list) { list_for_each_entry_reverse(test_event, list, list) {
if (should_merge(test_event, event)) { if (fanotify_should_merge(test_event, event)) {
FANOTIFY_E(test_event)->mask |= new->mask; FANOTIFY_E(test_event)->mask |= new->mask;
return 1; return 1;
} }
@ -232,6 +232,10 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group,
if (!fsnotify_iter_should_report_type(iter_info, type)) if (!fsnotify_iter_should_report_type(iter_info, type))
continue; continue;
mark = iter_info->marks[type]; mark = iter_info->marks[type];
/* Apply ignore mask regardless of ISDIR and ON_CHILD flags */
marks_ignored_mask |= mark->ignored_mask;
/* /*
* If the event is on dir and this mark doesn't care about * If the event is on dir and this mark doesn't care about
* events on dir, don't send it! * events on dir, don't send it!
@ -249,7 +253,6 @@ static u32 fanotify_group_event_mask(struct fsnotify_group *group,
continue; continue;
marks_mask |= mark->mask; marks_mask |= mark->mask;
marks_ignored_mask |= mark->ignored_mask;
} }
test_mask = event_mask & marks_mask & ~marks_ignored_mask; test_mask = event_mask & marks_mask & ~marks_ignored_mask;

View file

@ -89,7 +89,7 @@ struct fanotify_name_event {
__kernel_fsid_t fsid; __kernel_fsid_t fsid;
struct fanotify_fh dir_fh; struct fanotify_fh dir_fh;
u8 name_len; u8 name_len;
char name[0]; char name[];
}; };
static inline struct fanotify_name_event * static inline struct fanotify_name_event *

View file

@ -328,7 +328,7 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group,
ret = -EFAULT; ret = -EFAULT;
/* /*
* Sanity check copy size in case get_one_event() and * Sanity check copy size in case get_one_event() and
* fill_event_metadata() event_len sizes ever get out of sync. * event_len sizes ever get out of sync.
*/ */
if (WARN_ON_ONCE(metadata.event_len > count)) if (WARN_ON_ONCE(metadata.event_len > count))
goto out_close_fd; goto out_close_fd;
@ -487,8 +487,10 @@ static ssize_t fanotify_write(struct file *file, const char __user *buf, size_t
group = file->private_data; group = file->private_data;
if (count > sizeof(response)) if (count < sizeof(response))
count = sizeof(response); return -EINVAL;
count = sizeof(response);
pr_debug("%s: group=%p count=%zu\n", __func__, group, count); pr_debug("%s: group=%p count=%zu\n", __func__, group, count);

View file

@ -11,7 +11,6 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/proc_fs.h>
#include <linux/exportfs.h> #include <linux/exportfs.h>
#include "inotify/inotify.h" #include "inotify/inotify.h"

View file

@ -25,6 +25,7 @@ static void fsnotify_final_destroy_group(struct fsnotify_group *group)
group->ops->free_group_priv(group); group->ops->free_group_priv(group);
mem_cgroup_put(group->memcg); mem_cgroup_put(group->memcg);
mutex_destroy(&group->mark_mutex);
kfree(group); kfree(group);
} }

View file

@ -764,20 +764,18 @@ SYSCALL_DEFINE2(inotify_rm_watch, int, fd, __s32, wd)
struct fsnotify_group *group; struct fsnotify_group *group;
struct inotify_inode_mark *i_mark; struct inotify_inode_mark *i_mark;
struct fd f; struct fd f;
int ret = 0; int ret = -EINVAL;
f = fdget(fd); f = fdget(fd);
if (unlikely(!f.file)) if (unlikely(!f.file))
return -EBADF; return -EBADF;
/* verify that this is indeed an inotify instance */ /* verify that this is indeed an inotify instance */
ret = -EINVAL;
if (unlikely(f.file->f_op != &inotify_fops)) if (unlikely(f.file->f_op != &inotify_fops))
goto out; goto out;
group = f.file->private_data; group = f.file->private_data;
ret = -EINVAL;
i_mark = inotify_idr_find(group, wd); i_mark = inotify_idr_find(group, wd);
if (unlikely(!i_mark)) if (unlikely(!i_mark))
goto out; goto out;

View file

@ -325,13 +325,16 @@ static void fsnotify_put_mark_wake(struct fsnotify_mark *mark)
} }
bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info) bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info)
__releases(&fsnotify_mark_srcu)
{ {
int type; int type;
fsnotify_foreach_obj_type(type) { fsnotify_foreach_obj_type(type) {
/* This can fail if mark is being removed */ /* This can fail if mark is being removed */
if (!fsnotify_get_mark_safe(iter_info->marks[type])) if (!fsnotify_get_mark_safe(iter_info->marks[type])) {
__release(&fsnotify_mark_srcu);
goto fail; goto fail;
}
} }
/* /*
@ -350,6 +353,7 @@ bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info)
} }
void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info) void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info)
__acquires(&fsnotify_mark_srcu)
{ {
int type; int type;