Home Home > GIT Browse > linux-next
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKernel Build Daemon <kbuild@suse.de>2019-01-18 07:13:22 +0100
committerKernel Build Daemon <kbuild@suse.de>2019-01-18 07:13:22 +0100
commitcfaa51ac73480a329be48b9f417a7ad2f7e2fd64 (patch)
treebd0c7f51da8c647bf024572e814b9db312324754
parent0f543384210496d46f411900211feb7f7afe717c (diff)
parent067f33d6bdea4c9a9e4f24c436a0f6f805151c5d (diff)
Merge branch 'SLE12-SP4' into SLE12-SP4-AZURErpm-4.12.14-6.6--sle12-sp4-updatesrpm-4.12.14-6.6
-rw-r--r--patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch89
-rw-r--r--series.conf1
2 files changed, 90 insertions, 0 deletions
diff --git a/patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch b/patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch
new file mode 100644
index 0000000000..8e301f2acf
--- /dev/null
+++ b/patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch
@@ -0,0 +1,89 @@
+From b469e7e47c8a075cc08bcd1e85d4365134bdcdd5 Mon Sep 17 00:00:00 2001
+From: Amir Goldstein <amir73il@gmail.com>
+Date: Tue, 30 Oct 2018 20:29:53 +0200
+Subject: [PATCH] fanotify: fix handling of events on child sub-directory
+Git-commit: b469e7e47c8a075cc08bcd1e85d4365134bdcdd5
+Patch-mainline: v4.20-rc3
+References: bsc#1122019
+
+When an event is reported on a sub-directory and the parent inode has
+a mark mask with FS_EVENT_ON_CHILD|FS_ISDIR, the event will be sent to
+fsnotify() even if the event type is not in the parent mark mask
+(e.g. FS_OPEN).
+
+Further more, if that event happened on a mount or a filesystem with
+a mount/sb mark that does have that event type in their mask, the "on
+child" event will be reported on the mount/sb mark. That is not
+desired, because user will get a duplicate event for the same action.
+
+Note that the event reported on the victim inode is never merged with
+the event reported on the parent inode, because of the check in
+Should_merge(): old_fsn->inode == new_fsn->inode.
+
+Fix this by looking for a match of an actual event type (i.e. not just
+FS_ISDIR) in parent's inode mark mask and by not reporting an "on child"
+event to group if event type is only found on mount/sb marks.
+
+[backport hint: The bug seems to have always been in fanotify, but this
+ patch will only apply cleanly to v4.19.y]
+
+Cc: <stable@vger.kernel.org> # v4.19
+Signed-off-by: Amir Goldstein <amir73il@gmail.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Acked-by: Jan Kara <jack@suse.cz>
+
+---
+ fs/notify/fanotify/fanotify.c | 10 +++++++---
+ fs/notify/fsnotify.c | 7 ++++---
+ 2 files changed, 11 insertions(+), 6 deletions(-)
+
+--- a/fs/notify/fanotify/fanotify.c
++++ b/fs/notify/fanotify/fanotify.c
+@@ -106,8 +106,8 @@ static bool fanotify_should_send_event(s
+ return false;
+
+ /*
+- * if the event is for a child and this inode doesn't care about
+- * events on the child, don't send it!
++ * If the event is for a child and this mark doesn't care about
++ * events on a child, don't send it!
+ */
+ if (inode_mark &&
+ (!(event_mask & FS_EVENT_ON_CHILD) ||
+@@ -116,7 +116,11 @@ static bool fanotify_should_send_event(s
+ marks_ignored_mask |= inode_mark->ignored_mask;
+ }
+
+- if (vfsmnt_mark) {
++ /*
++ * Mount marks don't care about event on children. Ignore them as
++ * otherwise we could report some events twice.
++ */
++ if (vfsmnt_mark && !(event_mask & FS_EVENT_ON_CHILD)) {
+ marks_mask |= vfsmnt_mark->mask;
+ marks_ignored_mask |= vfsmnt_mark->ignored_mask;
+ }
+--- a/fs/notify/fsnotify.c
++++ b/fs/notify/fsnotify.c
+@@ -163,9 +163,9 @@ int __fsnotify_parent(const struct path
+ parent = dget_parent(dentry);
+ p_inode = parent->d_inode;
+
+- if (unlikely(!fsnotify_inode_watches_children(p_inode)))
++ if (unlikely(!fsnotify_inode_watches_children(p_inode))) {
+ __fsnotify_update_child_dentry_flags(p_inode);
+- else if (p_inode->i_fsnotify_mask & mask) {
++ } else if (p_inode->i_fsnotify_mask & mask & ALL_FSNOTIFY_EVENTS) {
+ struct name_snapshot name;
+
+ /* we are notifying a parent so come up with the new mask which
+@@ -300,7 +300,8 @@ int fsnotify(struct inode *to_tell, __u3
+ inode_node = srcu_dereference(inode_conn->list.first,
+ &fsnotify_mark_srcu);
+
+- if (mnt) {
++ /* An event "on child" is not intended for a mount mark */
++ if (mnt && !(mask & FS_EVENT_ON_CHILD)) {
+ inode_conn = srcu_dereference(to_tell->i_fsnotify_marks,
+ &fsnotify_mark_srcu);
+ if (inode_conn)
diff --git a/series.conf b/series.conf
index 87aa5c9244..a50d22ce0e 100644
--- a/series.conf
+++ b/series.conf
@@ -19621,6 +19621,7 @@
patches.fixes/crypto-simd-correctly-take-reqsize-of-wrapped-skciph.patch
patches.fixes/crypto-user-fix-leaking-uninitialized-memory-to-user.patch
patches.fixes/gfs2-Put-bitmap-buffers-in-put_super.patch
+ patches.fixes/fanotify-fix-handling-of-events-on-child-sub-directo.patch
patches.fixes/ocfs2-free-up-write-context-when-direct-IO-failed.patch
patches.suse/mm-vmstat.c-fix-NUMA-statistics-updates.patch
patches.fixes/lib-ubsan.c-don-t-mark-__ubsan_handle_builtin_unreac.patch