diff options
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/namei.c b/fs/namei.c index 157f3debbf98..48fc0fb8c9d1 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1173,6 +1173,7 @@ 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); @@ -1193,11 +1194,11 @@ retry: need_reval = 0; status = 1; } - mutex_unlock(&dir->i_mutex); if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval) status = d_revalidate(dentry, nd); if (unlikely(status <= 0)) { if (status < 0) { + mutex_unlock(&dir->i_mutex); dput(dentry); return status; } @@ -1205,9 +1206,10 @@ retry: dput(dentry); dentry = NULL; need_reval = 1; - goto retry; + goto l; } } + mutex_unlock(&dir->i_mutex); goto done; } if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval) |