From: Al Viro Date: Fri, 30 Mar 2012 18:13:15 +0000 (-0400) Subject: untangling do_lookup() - eliminate a loop. X-Git-Tag: v3.4-rc1~2^2~8 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=acc9cb3cd425f479d8fc4a441bff45dce23aa6dd;p=platform%2Fkernel%2Flinux-3.10.git untangling do_lookup() - eliminate a loop. d_lookup() *will* fail after successful d_invalidate(), if we are holding i_mutex all along. IOW, we don't need to jump back to l: - we know what path will be taken there and can do that (i.e. d_alloc_and_lookup()) directly. Signed-off-by: Al Viro --- diff --git a/fs/namei.c b/fs/namei.c index 48fc0fb..9ce43a3 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1173,7 +1173,6 @@ retry: BUG_ON(nd->inode != dir); mutex_lock(&dir->i_mutex); -l: dentry = d_lookup(parent, name); if (likely(!dentry)) { dentry = d_alloc_and_lookup(parent, name, nd); @@ -1204,9 +1203,14 @@ l: } if (!d_invalidate(dentry)) { dput(dentry); - dentry = NULL; - need_reval = 1; - goto l; + dentry = d_alloc_and_lookup(parent, name, nd); + if (IS_ERR(dentry)) { + mutex_unlock(&dir->i_mutex); + return PTR_ERR(dentry); + } + /* known good */ + need_reval = 0; + status = 1; } } mutex_unlock(&dir->i_mutex);