|
@@ -1259,9 +1259,15 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
|
|
|
return -ECHILD;
|
|
|
|
|
|
nd->seq = seq;
|
|
|
- if (dentry->d_flags & DCACHE_OP_REVALIDATE)
|
|
|
- goto need_revalidate;
|
|
|
-done2:
|
|
|
+ if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) {
|
|
|
+ dentry = do_revalidate(dentry, nd);
|
|
|
+ if (!dentry)
|
|
|
+ goto need_lookup;
|
|
|
+ if (IS_ERR(dentry))
|
|
|
+ goto fail;
|
|
|
+ if (!(nd->flags & LOOKUP_RCU))
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
path->mnt = mnt;
|
|
|
path->dentry = dentry;
|
|
|
if (likely(__follow_mount_rcu(nd, path, inode, false)))
|
|
@@ -1274,8 +1280,13 @@ done2:
|
|
|
if (!dentry)
|
|
|
goto need_lookup;
|
|
|
found:
|
|
|
- if (dentry->d_flags & DCACHE_OP_REVALIDATE)
|
|
|
- goto need_revalidate;
|
|
|
+ if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) {
|
|
|
+ dentry = do_revalidate(dentry, nd);
|
|
|
+ if (!dentry)
|
|
|
+ goto need_lookup;
|
|
|
+ if (IS_ERR(dentry))
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
done:
|
|
|
path->mnt = mnt;
|
|
|
path->dentry = dentry;
|
|
@@ -1317,16 +1328,6 @@ need_lookup:
|
|
|
mutex_unlock(&dir->i_mutex);
|
|
|
goto found;
|
|
|
|
|
|
-need_revalidate:
|
|
|
- dentry = do_revalidate(dentry, nd);
|
|
|
- if (!dentry)
|
|
|
- goto need_lookup;
|
|
|
- if (IS_ERR(dentry))
|
|
|
- goto fail;
|
|
|
- if (nd->flags & LOOKUP_RCU)
|
|
|
- goto done2;
|
|
|
- goto done;
|
|
|
-
|
|
|
fail:
|
|
|
return PTR_ERR(dentry);
|
|
|
}
|