aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilly Tarreau2016-08-27 04:31:35 -0500
committerGreg Kroah-Hartman2016-09-11 02:59:58 -0500
commit7cac57a69919afdf3bdda5242afdd535b2d9a2b0 (patch)
tree7e1935d9d312cc89985df52a80b10d7880421988
parent78a4260f1fad5cfc6ad7cf6e01a93a2fed0d0e3e (diff)
downloadti-linux-kernel-7cac57a69919afdf3bdda5242afdd535b2d9a2b0.tar.gz
ti-linux-kernel-7cac57a69919afdf3bdda5242afdd535b2d9a2b0.tar.xz
ti-linux-kernel-7cac57a69919afdf3bdda5242afdd535b2d9a2b0.zip
fix d_walk()/non-delayed __d_free() race
I checked Jari's explanation below and found that v3.14.77 and v3.12.62 are missing the same fix as 3.10. In fact Al's original commit 3d56c25 ("fix d_walk()/non-delayed __d_free() race") used to mention to check this __d_materialise_dentry() function in the Cc: stable line, but this got lost during the backports. Normally all of our 3 kernels need to apply the following patch that Ben correctly put in 3.16 and 3.2. I'm fixing the backport in 3.10.103 right now. On Mon, Aug 22, 2016 at 04:56:57PM +0300, Jari Ruusu wrote: > 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 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/dcache.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index 47c06888dc05..4d170433c647 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -2652,6 +2652,7 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
2652 switch_names(dentry, anon); 2652 switch_names(dentry, anon);
2653 swap(dentry->d_name.hash, anon->d_name.hash); 2653 swap(dentry->d_name.hash, anon->d_name.hash);
2654 2654
2655 dentry->d_flags |= DCACHE_RCUACCESS;
2655 dentry->d_parent = dentry; 2656 dentry->d_parent = dentry;
2656 list_del_init(&dentry->d_child); 2657 list_del_init(&dentry->d_child);
2657 anon->d_parent = dparent; 2658 anon->d_parent = dparent;