mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
lookup_fast(): don't bother with inode
Note that validation of ->d_seq after ->d_inode fetch is gone, along with fetching of ->d_inode itself. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
b16c001de0
commit
4cb6402480
22
fs/namei.c
22
fs/namei.c
@ -1621,8 +1621,7 @@ static struct dentry *__lookup_hash(const struct qstr *name,
|
||||
return dentry;
|
||||
}
|
||||
|
||||
static struct dentry *lookup_fast(struct nameidata *nd,
|
||||
struct inode **inode)
|
||||
static struct dentry *lookup_fast(struct nameidata *nd)
|
||||
{
|
||||
struct dentry *dentry, *parent = nd->path.dentry;
|
||||
int status = 1;
|
||||
@ -1640,22 +1639,11 @@ static struct dentry *lookup_fast(struct nameidata *nd,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* This sequence count validates that the inode matches
|
||||
* the dentry name information from lookup.
|
||||
*/
|
||||
*inode = d_backing_inode(dentry);
|
||||
if (read_seqcount_retry(&dentry->d_seq, nd->next_seq))
|
||||
return ERR_PTR(-ECHILD);
|
||||
|
||||
/*
|
||||
* This sequence count validates that the parent had no
|
||||
* changes while we did the lookup of the dentry above.
|
||||
*
|
||||
* The memory barrier in read_seqcount_begin of child is
|
||||
* enough, we can use __read_seqcount_retry here.
|
||||
*/
|
||||
if (__read_seqcount_retry(&parent->d_seq, nd->seq))
|
||||
if (read_seqcount_retry(&parent->d_seq, nd->seq))
|
||||
return ERR_PTR(-ECHILD);
|
||||
|
||||
status = d_revalidate(dentry, nd->flags);
|
||||
@ -1997,7 +1985,6 @@ static const char *handle_dots(struct nameidata *nd, int type)
|
||||
static const char *walk_component(struct nameidata *nd, int flags)
|
||||
{
|
||||
struct dentry *dentry;
|
||||
struct inode *inode;
|
||||
/*
|
||||
* "." and ".." are special - ".." especially so because it has
|
||||
* to be able to know about the current root directory and
|
||||
@ -2008,7 +1995,7 @@ static const char *walk_component(struct nameidata *nd, int flags)
|
||||
put_link(nd);
|
||||
return handle_dots(nd, nd->last_type);
|
||||
}
|
||||
dentry = lookup_fast(nd, &inode);
|
||||
dentry = lookup_fast(nd);
|
||||
if (IS_ERR(dentry))
|
||||
return ERR_CAST(dentry);
|
||||
if (unlikely(!dentry)) {
|
||||
@ -3396,7 +3383,6 @@ static const char *open_last_lookups(struct nameidata *nd,
|
||||
struct dentry *dir = nd->path.dentry;
|
||||
int open_flag = op->open_flag;
|
||||
bool got_write = false;
|
||||
struct inode *inode;
|
||||
struct dentry *dentry;
|
||||
const char *res;
|
||||
|
||||
@ -3412,7 +3398,7 @@ static const char *open_last_lookups(struct nameidata *nd,
|
||||
if (nd->last.name[nd->last.len])
|
||||
nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
|
||||
/* we _can_ be in RCU mode here */
|
||||
dentry = lookup_fast(nd, &inode);
|
||||
dentry = lookup_fast(nd);
|
||||
if (IS_ERR(dentry))
|
||||
return ERR_CAST(dentry);
|
||||
if (likely(dentry))
|
||||
|
Loading…
Reference in New Issue
Block a user