|
@@ -1558,8 +1558,6 @@ static int lookup_fast(struct nameidata *nd,
|
|
negative = d_is_negative(dentry);
|
|
negative = d_is_negative(dentry);
|
|
if (read_seqcount_retry(&dentry->d_seq, seq))
|
|
if (read_seqcount_retry(&dentry->d_seq, seq))
|
|
return -ECHILD;
|
|
return -ECHILD;
|
|
- if (negative)
|
|
|
|
- return -ENOENT;
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
* This sequence count validates that the parent had no
|
|
* This sequence count validates that the parent had no
|
|
@@ -1580,6 +1578,12 @@ static int lookup_fast(struct nameidata *nd,
|
|
goto unlazy;
|
|
goto unlazy;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ /*
|
|
|
|
+ * Note: do negative dentry check after revalidation in
|
|
|
|
+ * case that drops it.
|
|
|
|
+ */
|
|
|
|
+ if (negative)
|
|
|
|
+ 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)))
|