Skip to content

Commit

Permalink
new helper: __lookup_slow()
Browse files Browse the repository at this point in the history
lookup_slow() sans locking/unlocking the directory

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Apr 6, 2018
1 parent 3c95f0d commit 88d8331
Showing 1 changed file with 18 additions and 9 deletions.
27 changes: 18 additions & 9 deletions fs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -1593,22 +1593,21 @@ static int lookup_fast(struct nameidata *nd,
}

/* Fast lookup failed, do it the slow way */
static struct dentry *lookup_slow(const struct qstr *name,
struct dentry *dir,
unsigned int flags)
static struct dentry *__lookup_slow(const struct qstr *name,
struct dentry *dir,
unsigned int flags)
{
struct dentry *dentry = ERR_PTR(-ENOENT), *old;
struct dentry *dentry, *old;
struct inode *inode = dir->d_inode;
DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);

inode_lock_shared(inode);
/* Don't go there if it's already dead */
if (unlikely(IS_DEADDIR(inode)))
goto out;
return ERR_PTR(-ENOENT);
again:
dentry = d_alloc_parallel(dir, name, &wq);
if (IS_ERR(dentry))
goto out;
return dentry;
if (unlikely(!d_in_lookup(dentry))) {
if (!(flags & LOOKUP_NO_REVAL)) {
int error = d_revalidate(dentry, flags);
Expand All @@ -1630,11 +1629,21 @@ static struct dentry *lookup_slow(const struct qstr *name,
dentry = old;
}
}
out:
inode_unlock_shared(inode);
return dentry;
}

static struct dentry *lookup_slow(const struct qstr *name,
struct dentry *dir,
unsigned int flags)
{
struct inode *inode = dir->d_inode;
struct dentry *res;
inode_lock_shared(inode);
res = __lookup_slow(name, dir, flags);
inode_unlock_shared(inode);
return res;
}

static inline int may_lookup(struct nameidata *nd)
{
if (nd->flags & LOOKUP_RCU) {
Expand Down

0 comments on commit 88d8331

Please sign in to comment.