stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH 3.10 099/180] fix d_walk()/non-delayed __d_free() race
@ 2016-08-22 13:56 Jari Ruusu
  2016-08-22 14:07 ` Willy Tarreau
  2016-08-27  9:31 ` Willy Tarreau
  0 siblings, 2 replies; 7+ messages in thread
From: Jari Ruusu @ 2016-08-22 13:56 UTC (permalink / raw)
  To: Willy Tarreau, linux-kernel, stable
  Cc: Al Viro, Ben Hutchings, Greg Kroah-Hartman

This patch for 3.10 branch appears to be missing one important

+       dentry->d_flags |= DCACHE_RCUACCESS;

in fs/dcache.c __d_materialise_dentry() function. When Ben Hutchings
backported Al Viro's original fix to stable branches that he maintains,
he added that one additional line to both 3.2 and 3.16 branches. Please
consider including that additional one line fix for 3.10 stable branch
also.


Ben Hutchings said this on his 3.2.82-rc1 patch:
[bwh: Backported to 3.2:
 - Adjust context
 - Also set the flag in __d_materialise_dentry())]

http://marc.info/?l=linux-kernel&m=147117565612275&w=2


Ben Hutchings said this on his 3.16.37-rc1 patch:
[bwh: Backported to 3.16:
 - Adjust context
 - Also set the flag in __d_materialise_dentry())]

http://marc.info/?l=linux-kernel&m=147117433412006&w=2


Also mentioned by Sasha Levin on 3.18 and 4.1 commits:
Cc: stable@vger.kernel.org # v3.2+ (and watch out for __d_materialise_dentry())

http://marc.info/?l=linux-stable-commits&m=146648034410827&w=2
http://marc.info/?l=linux-stable-commits&m=146647471009771&w=2

-- 
Jari Ruusu  4096R/8132F189 12D6 4C3A DCDA 0AA4 27BD  ACDF F073 3C80 8132 F189

^ permalink raw reply	[flat|nested] 7+ messages in thread
* Patch "fix d_walk()/non-delayed __d_free() race" has been added to the 3.14-stable tree
@ 2016-06-18 16:57 gregkh
  0 siblings, 0 replies; 7+ messages in thread
From: gregkh @ 2016-06-18 16:57 UTC (permalink / raw)
  To: viro, gregkh; +Cc: stable, stable-commits


This is a note to let you know that I've just added the patch titled

    fix d_walk()/non-delayed __d_free() race

to the 3.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     fix-d_walk-non-delayed-__d_free-race.patch
and it can be found in the queue-3.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@vger.kernel.org> know about it.


>From 3d56c25e3bb0726a5c5e16fc2d9e38f8ed763085 Mon Sep 17 00:00:00 2001
From: Al Viro <viro@zeniv.linux.org.uk>
Date: Tue, 7 Jun 2016 21:26:55 -0400
Subject: fix d_walk()/non-delayed __d_free() race

From: Al Viro <viro@zeniv.linux.org.uk>

commit 3d56c25e3bb0726a5c5e16fc2d9e38f8ed763085 upstream.

Ascend-to-parent logics in d_walk() depends on all encountered child
dentries not getting freed without an RCU delay.  Unfortunately, in
quite a few cases it is not true, with hard-to-hit oopsable race as
the result.

Fortunately, the fix is simiple; right now the rule is "if it ever
been hashed, freeing must be delayed" and changing it to "if it
ever had a parent, freeing must be delayed" closes that hole and
covers all cases the old rule used to cover.  Moreover, pipes and
sockets remain _not_ covered, so we do not introduce RCU delay in
the cases which are the reason for having that delay conditional
in the first place.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 fs/dcache.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1500,7 +1500,7 @@ struct dentry *d_alloc(struct dentry * p
 	struct dentry *dentry = __d_alloc(parent->d_sb, name);
 	if (!dentry)
 		return NULL;
-
+	dentry->d_flags |= DCACHE_RCUACCESS;
 	spin_lock(&parent->d_lock);
 	/*
 	 * don't need child lock because it is not subject
@@ -2352,7 +2352,6 @@ static void __d_rehash(struct dentry * e
 {
 	BUG_ON(!d_unhashed(entry));
 	hlist_bl_lock(b);
-	entry->d_flags |= DCACHE_RCUACCESS;
 	hlist_bl_add_head_rcu(&entry->d_hash, b);
 	hlist_bl_unlock(b);
 }
@@ -2536,6 +2535,7 @@ static void __d_move(struct dentry * den
 
 	/* ... and switch the parents */
 	if (IS_ROOT(dentry)) {
+		dentry->d_flags |= DCACHE_RCUACCESS;
 		dentry->d_parent = target->d_parent;
 		target->d_parent = target;
 		INIT_LIST_HEAD(&target->d_child);


Patches currently in stable-queue which might be from viro@zeniv.linux.org.uk are

queue-3.14/fix-d_walk-non-delayed-__d_free-race.patch

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-09-09 14:36 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-08-22 13:56 [PATCH 3.10 099/180] fix d_walk()/non-delayed __d_free() race Jari Ruusu
2016-08-22 14:07 ` Willy Tarreau
2016-08-27  9:31 ` Willy Tarreau
2016-08-27 11:38   ` Ben Hutchings
2016-08-27 21:12     ` Willy Tarreau
2016-09-09 14:36   ` Patch "fix d_walk()/non-delayed __d_free() race" has been added to the 3.14-stable tree gregkh
  -- strict thread matches above, loose matches on Subject: below --
2016-06-18 16:57 gregkh

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).