mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 14:41:39 +00:00
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: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
db3c9ade50
commit
b023e1728b
@ -1631,7 +1631,6 @@ static int lookup_fast(struct nameidata *nd,
|
||||
*/
|
||||
if (nd->flags & LOOKUP_RCU) {
|
||||
unsigned seq;
|
||||
bool negative;
|
||||
dentry = __d_lookup_rcu(parent, &nd->last, &seq);
|
||||
if (unlikely(!dentry)) {
|
||||
if (unlazy_walk(nd))
|
||||
@ -1644,7 +1643,6 @@ static int lookup_fast(struct nameidata *nd,
|
||||
* the dentry name information from lookup.
|
||||
*/
|
||||
*inode = d_backing_inode(dentry);
|
||||
negative = d_is_negative(dentry);
|
||||
if (unlikely(read_seqcount_retry(&dentry->d_seq, seq)))
|
||||
return -ECHILD;
|
||||
|
||||
@ -1665,12 +1663,15 @@ static int lookup_fast(struct nameidata *nd,
|
||||
* Note: do negative dentry check after revalidation in
|
||||
* case that drops it.
|
||||
*/
|
||||
if (unlikely(negative))
|
||||
if (unlikely(!*inode))
|
||||
return -ENOENT;
|
||||
path->mnt = mnt;
|
||||
path->dentry = dentry;
|
||||
if (likely(__follow_mount_rcu(nd, path, inode, seqp)))
|
||||
return 1;
|
||||
if (unlazy_child(nd, dentry, seq))
|
||||
return -ECHILD;
|
||||
return handle_mounts(nd, dentry, path, inode, seqp);
|
||||
}
|
||||
if (unlazy_child(nd, dentry, seq))
|
||||
return -ECHILD;
|
||||
|
Loading…
Reference in New Issue
Block a user