提交 209a7fb2 编写于 作者: A Al Viro

lookup_fast(): clean up the logics around the fallback to non-rcu mode

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 ad1633a1
...@@ -1558,12 +1558,7 @@ static int lookup_fast(struct nameidata *nd, ...@@ -1558,12 +1558,7 @@ static int lookup_fast(struct nameidata *nd,
*seqp = seq; *seqp = seq;
if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE))
status = d_revalidate(dentry, nd->flags); status = d_revalidate(dentry, nd->flags);
if (unlikely(status <= 0)) { if (likely(status > 0)) {
if (unlazy_walk(nd, dentry, seq))
return -ECHILD;
if (status == -ECHILD)
status = d_revalidate(dentry, nd->flags);
} else {
/* /*
* Note: do negative dentry check after revalidation in * Note: do negative dentry check after revalidation in
* case that drops it. * case that drops it.
...@@ -1574,9 +1569,12 @@ static int lookup_fast(struct nameidata *nd, ...@@ -1574,9 +1569,12 @@ static int lookup_fast(struct nameidata *nd,
path->dentry = dentry; path->dentry = dentry;
if (likely(__follow_mount_rcu(nd, path, inode, seqp))) if (likely(__follow_mount_rcu(nd, path, inode, seqp)))
return 1; return 1;
if (unlazy_walk(nd, dentry, seq))
return -ECHILD;
} }
if (unlazy_walk(nd, dentry, seq))
return -ECHILD;
if (unlikely(status == -ECHILD))
/* we'd been told to redo it in non-rcu mode */
status = d_revalidate(dentry, nd->flags);
} else { } else {
dentry = __d_lookup(parent, &nd->last); dentry = __d_lookup(parent, &nd->last);
if (unlikely(!dentry)) if (unlikely(!dentry))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册