From: Tim Chen Date: Fri, 15 Apr 2011 18:39:29 +0000 (-0700) Subject: vfs: Fix absolute RCU path walk failures due to uninitialized seq number X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=c1530019e311c91d14b24d8e74d233152d806e45;p=GitHub%2FLineageOS%2Fandroid_kernel_samsung_universal7580.git vfs: Fix absolute RCU path walk failures due to uninitialized seq number 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 Reviewed-by: Andi Kleen Cc: stable@kernel.org (v2.6.38) Signed-off-by: Linus Torvalds --- diff --git a/fs/namei.c b/fs/namei.c index e6cd6113872..54fc993e302 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -697,6 +697,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)); } }