From: Miklos Szeredi <mszeredi@redhat.com>
To: linux-fsdevel@vger.kernel.org
Cc: Jan Kara <jack@suse.cz>, Amir Goldstein <amir73il@gmail.com>,
Xiong Zhou <xzhou@redhat.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH v2 4/7] fsnotify: skip unattached marks
Date: Wed, 25 Oct 2017 10:41:36 +0200 [thread overview]
Message-ID: <1508920899-8115-5-git-send-email-mszeredi@redhat.com> (raw)
In-Reply-To: <1508920899-8115-1-git-send-email-mszeredi@redhat.com>
After having gone through a ref-unref for the mark, dereferencing the group
(e.g. in fsnotify_compare_groups()) is wrong since the group may be
completely gone by that time. So before continuing to traverse the mark
list, check if the mark is still attached.
This is done in the generic case, not just when we go through
fsnotify_prepare_user_wait()/fsnotify_finish_user_wait(), otherwise it
would introduce unnecessary complexity. And it shouldn't hurt to skip
unattached marks anyway ("flags" is very likely in same cacheline as
neighbouring "ignored_mask", which is pulled in anyway).
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Fixes: 9385a84d7e1f ("fsnotify: Pass fsnotify_iter_info into handle_event handler")
Cc: <stable@vger.kernel.org> # v4.12
---
fs/notify/fsnotify.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c
index 48ec61f4c4d5..0ab6a7179e4d 100644
--- a/fs/notify/fsnotify.c
+++ b/fs/notify/fsnotify.c
@@ -328,12 +328,16 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
inode_mark = hlist_entry(srcu_dereference(inode_node, &fsnotify_mark_srcu),
struct fsnotify_mark, obj_list);
inode_group = inode_mark->group;
+ if (!(inode_mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED))
+ goto skip_inode;
}
if (vfsmount_node) {
vfsmount_mark = hlist_entry(srcu_dereference(vfsmount_node, &fsnotify_mark_srcu),
struct fsnotify_mark, obj_list);
vfsmount_group = vfsmount_mark->group;
+ if (!(vfsmount_mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED))
+ goto skip_vfsmount;
}
iter_info.inode_mark = inode_mark;
@@ -357,10 +361,11 @@ int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
if (ret && (mask & ALL_FSNOTIFY_PERM_EVENTS))
goto out;
-
+skip_inode:
if (inode_group)
inode_node = srcu_dereference(inode_node->next,
&fsnotify_mark_srcu);
+skip_vfsmount:
if (vfsmount_group)
vfsmount_node = srcu_dereference(vfsmount_node->next,
&fsnotify_mark_srcu);
--
2.5.5
next prev parent reply other threads:[~2017-10-25 8:41 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-25 8:41 [PATCH v2 0/7] fix fanotify issues with the series in v4.12 Miklos Szeredi
2017-10-25 8:41 ` [PATCH v2 1/7] fsnotify: clean up fsnotify_prepare/finish_user_wait() Miklos Szeredi
2017-10-25 12:06 ` Amir Goldstein
2017-10-25 12:07 ` Amir Goldstein
2017-10-25 14:15 ` Miklos Szeredi
2017-10-25 8:41 ` [PATCH v2 2/7] fsnotify: pin both inode and vfsmount mark Miklos Szeredi
2017-10-30 13:34 ` Jan Kara
2017-10-30 13:42 ` Miklos Szeredi
2017-10-30 14:05 ` Jan Kara
2017-10-25 8:41 ` [PATCH v2 3/7] fsnotify: fix pinning group in fsnotify_prepare_user_wait() Miklos Szeredi
2017-10-25 8:41 ` Miklos Szeredi [this message]
2017-10-30 14:00 ` [PATCH v2 4/7] fsnotify: skip unattached marks Jan Kara
2017-10-30 14:27 ` Miklos Szeredi
2017-10-25 8:41 ` [PATCH v2 5/7] fanotify: fix fsnotify_prepare_user_wait() failure Miklos Szeredi
2017-10-25 8:41 ` [PATCH v2 6/7] fsnotify: clean up fsnotify() Miklos Szeredi
2017-10-25 11:46 ` Amir Goldstein
2017-10-25 8:41 ` [PATCH v2 7/7] fanotify: clean up CONFIG_FANOTIFY_ACCESS_PERMISSIONS ifdefs Miklos Szeredi
2017-10-25 11:44 ` Amir Goldstein
2017-10-25 14:19 ` Miklos Szeredi
2017-10-30 17:20 ` Jan Kara
2017-10-25 14:31 ` [PATCH v2 0/7] fix fanotify issues with the series in v4.12 Miklos Szeredi
2017-10-25 15:13 ` Amir Goldstein
2017-10-27 11:53 ` Jan Kara
2017-10-30 15:56 ` Miklos Szeredi
2017-10-30 17:27 ` Jan Kara
2017-10-30 20:18 ` Miklos Szeredi
2017-10-31 9:54 ` Jan Kara
2017-10-31 11:02 ` Amir Goldstein
2017-10-31 16:27 ` Jan Kara
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1508920899-8115-5-git-send-email-mszeredi@redhat.com \
--to=mszeredi@redhat.com \
--cc=amir73il@gmail.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=xzhou@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome