aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Chen <tim.c.chen@linux.intel.com>2011-04-15 11:39:29 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2011-04-21 14:32:47 -0700
commit0b76f8fcb3f302aaf18c65337a472b32d8a74b67 (patch)
tree902469d6ad9fa8d3d2e0eaadcdd874ca3df3b2f0
parent669479155adaf2c0e21934ef1911c9e583d10f5e (diff)
vfs: Fix absolute RCU path walk failures due to uninitialized seq number
commit c1530019e311c91d14b24d8e74d233152d806e45 upstream. During RCU walk in path_lookupat and path_openat, the rcu lookup frequently failed if looking up an absolute path, because when root directory was looked up, seq number was not properly set in nameidata. We dropped out of RCU walk in nameidata_drop_rcu due to mismatch in directory entry's seq number. We reverted to slow path walk that need to take references. With the following patch, I saw a 50% increase in an exim mail server benchmark throughput on a 4-socket Nehalem-EX system. Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com> Reviewed-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--fs/namei.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/namei.c b/fs/namei.c
index a4689eb2df2..3095ca8a31a 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -712,6 +712,7 @@ static __always_inline void set_root_rcu(struct nameidata *nd)
do {
seq = read_seqcount_begin(&fs->seq);
nd->root = fs->root;
+ nd->seq = __read_seqcount_begin(&nd->root.dentry->d_seq);
} while (read_seqcount_retry(&fs->seq, seq));
}
}