From: Jan Kara <jack@suse.cz>
To: Kinglong Mee <kinglongmee@gmail.com>
Cc: Jan Kara <jack@suse.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-fsdevel@vger.kernel.org, Jan Kara <jack@suse.cz>
Subject: Re: [PATCH 1/3] fsnotify: Fix oops in fsnotify_clear_marks_by_group_flags()
Date: Mon, 20 Jul 2015 16:46:42 +0200 [thread overview]
Message-ID: <20150720144642.GE3131@quack.suse.cz> (raw)
In-Reply-To: <55AB7A3D.4000008@gmail.com>
On Sun 19-07-15 18:21:49, Kinglong Mee wrote:
> On 7/15/2015 21:21, Jan Kara wrote:
> > From: Jan Kara <jack@suse.cz>
> >
> > fsnotify_clear_marks_by_group_flags() can race with
> > fsnotify_destroy_marks() so when fsnotify_destroy_mark_locked() drops
> > mark_mutex, a mark from the list iterated by
> > fsnotify_clear_marks_by_group_flags() can be freed and we dereference
> > free memory in the loop there.
> >
> > Fix the problem by keeping mark_mutex held in
> > fsnotify_destroy_mark_locked(). The reason why we drop that mutex is
> > that we need to call a ->freeing_mark() callback which may acquire
> > mark_mutex again. To avoid this and similar lock inversion issues, we
> > move the call to ->freeing_mark() callback to the kthread destroying the
> > mark.
> >
> > Reported-by: Ashish Sangwan <a.sangwan@samsung.com>
> > Suggested-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
> > Signed-off-by: Jan Kara <jack@suse.cz>
<snip>
> With this patch, I got so many memleak notice,
>
> unreferenced object 0xffff880035bef640 (size 64):
> comm "fsnotify_mark", pid 26, jiffies 4294673717 (age 628.737s)
> hex dump (first 32 bytes):
> 28 36 3f 76 00 88 ff ff 28 36 3f 76 00 88 ff ff (6?v....(6?v....
> 00 00 00 00 00 00 00 00 00 80 00 00 00 00 ad de ................
> backtrace:
> [<ffffffff816cd34e>] kmemleak_alloc+0x4e/0xb0
> [<ffffffff811ac6b5>] __kmalloc+0x1e5/0x290
> [<ffffffff81204f25>] inotify_handle_event+0x75/0x160
> [<ffffffff81205abc>] inotify_ignored_and_remove_idr+0x5c/0x80
> [<ffffffff8120505e>] inotify_freeing_mark+0xe/0x10
> [<ffffffff81203ca6>] fsnotify_mark_destroy+0xb6/0x150
> [<ffffffff810a4487>] kthread+0xd7/0xf0
> [<ffffffff816d92df>] ret_from_fork+0x3f/0x70
> [<ffffffffffffffff>] 0xffffffffffffffff
>
> It is caused by ->freeing_mark() insert an event to group,
> but snotify_put_mark() kfree the group without free the event.
Thanks for report! You are right that my patch introduces a race between
fsnotify kthread and fsnotify_destroy_group() which can result in leaking
inotify event on group destruction. I haven't yet decided whether the right
fix is not to queue events for dying notification group (as that is
pointless anyway) or whether we should just fix the original problem
differently... Whenever I look at fsnotify code mark handling I get lost in
the maze of locks, lists, and subtle differences between how different
notification systems handle notification marks :( I'll think about it over
night.
Honza
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
next prev parent reply other threads:[~2015-07-21 20:26 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-15 13:21 [PATCH 0/3] fsnotify: Cleanups and fixes Jan Kara
2015-07-15 13:21 ` [PATCH 1/3] fsnotify: Fix oops in fsnotify_clear_marks_by_group_flags() Jan Kara
2015-07-15 20:41 ` Andrew Morton
2015-07-16 6:50 ` Jan Kara
2015-07-19 10:21 ` Kinglong Mee
2015-07-20 14:46 ` Jan Kara [this message]
2015-07-21 20:03 ` Jan Kara
2015-07-21 20:35 ` Jan Kara
2015-07-21 23:14 ` Linus Torvalds
2015-07-22 0:26 ` Greg Kroah-Hartman
2015-07-21 20:36 ` Jan Kara
2015-07-20 15:24 ` Konstantin Khlebnikov
2015-07-15 13:21 ` [PATCH 2/3] fsnotify: Fix check in inotify fdinfo printing Jan Kara
2015-07-15 13:21 ` [PATCH 3/3] fsnotify: Make fsnotify_destroy_mark_locked() safe without refcount 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=20150720144642.GE3131@quack.suse.cz \
--to=jack@suse.cz \
--cc=akpm@linux-foundation.org \
--cc=jack@suse.com \
--cc=kinglongmee@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).