Commit b023e172 authored by Al Viro's avatar Al Viro

lookup_fast(): consolidate the RCU success case

1) in case of __follow_mount_rcu() failure, lookup_fast() proceeds
to call unlazy_child() and, should it succeed, handle_mounts().
Note that we have status > 0 (or we wouldn't be calling
__follow_mount_rcu() at all), so all stuff conditional upon
non-positive status won't be even touched.

Consolidate just that sequence after the call of __follow_mount_rcu().

2) calling d_is_negative() and keeping its result is pointless -
we either don't get past checking ->d_seq (and don't use the results of
d_is_negative() at all), or we are guaranteed that ->d_inode and
type bits of ->d_flags had been consistent at the time of d_is_negative()
call.  IOW, we could only get to the use of its result if it's
equal to !inode.  The same ->d_seq check guarantees that after that point
this CPU won't observe ->d_flags values older than ->d_inode update.
So 'negative' variable is completely pointless these days.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent db3c9ade
...@@ -1631,7 +1631,6 @@ static int lookup_fast(struct nameidata *nd, ...@@ -1631,7 +1631,6 @@ static int lookup_fast(struct nameidata *nd,
*/ */
if (nd->flags & LOOKUP_RCU) { if (nd->flags & LOOKUP_RCU) {
unsigned seq; unsigned seq;
bool negative;
dentry = __d_lookup_rcu(parent, &nd->last, &seq); dentry = __d_lookup_rcu(parent, &nd->last, &seq);
if (unlikely(!dentry)) { if (unlikely(!dentry)) {
if (unlazy_walk(nd)) if (unlazy_walk(nd))
...@@ -1644,7 +1643,6 @@ static int lookup_fast(struct nameidata *nd, ...@@ -1644,7 +1643,6 @@ static int lookup_fast(struct nameidata *nd,
* the dentry name information from lookup. * the dentry name information from lookup.
*/ */
*inode = d_backing_inode(dentry); *inode = d_backing_inode(dentry);
negative = d_is_negative(dentry);
if (unlikely(read_seqcount_retry(&dentry->d_seq, seq))) if (unlikely(read_seqcount_retry(&dentry->d_seq, seq)))
return -ECHILD; return -ECHILD;
...@@ -1665,12 +1663,15 @@ static int lookup_fast(struct nameidata *nd, ...@@ -1665,12 +1663,15 @@ static int lookup_fast(struct nameidata *nd,
* Note: do negative dentry check after revalidation in * Note: do negative dentry check after revalidation in
* case that drops it. * case that drops it.
*/ */
if (unlikely(negative)) if (unlikely(!*inode))
return -ENOENT; return -ENOENT;
path->mnt = mnt; path->mnt = mnt;
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_child(nd, dentry, seq))
return -ECHILD;
return handle_mounts(nd, dentry, path, inode, seqp);
} }
if (unlazy_child(nd, dentry, seq)) if (unlazy_child(nd, dentry, seq))
return -ECHILD; return -ECHILD;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment