Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81e6f520 authored by Al Viro's avatar Al Viro
Browse files

untangling do_lookup() - take __lookup_hash()-calling case out of line.



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent a3255546
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -1208,22 +1208,14 @@ unlazy:
		dentry = __d_lookup(parent, name);
	}

	if (dentry && unlikely(d_need_lookup(dentry))) {
	if (unlikely(!dentry))
		goto need_lookup;

	if (unlikely(d_need_lookup(dentry))) {
		dput(dentry);
		dentry = NULL;
		goto need_lookup;
	}
retry:
	if (unlikely(!dentry)) {
		struct inode *dir = parent->d_inode;
		BUG_ON(nd->inode != dir);

		mutex_lock(&dir->i_mutex);
		dentry = __lookup_hash(name, parent, nd);
		mutex_unlock(&dir->i_mutex);
		if (IS_ERR(dentry))
			return PTR_ERR(dentry);
		goto done;
	}
	if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)
		status = d_revalidate(dentry, nd);
	if (unlikely(status <= 0)) {
@@ -1233,8 +1225,7 @@ retry:
		}
		if (!d_invalidate(dentry)) {
			dput(dentry);
			dentry = NULL;
			goto retry;
			goto need_lookup;
		}
	}
done:
@@ -1249,6 +1240,16 @@ done:
		nd->flags |= LOOKUP_JUMPED;
	*inode = path->dentry->d_inode;
	return 0;

need_lookup:
	BUG_ON(nd->inode != parent->d_inode);

	mutex_lock(&parent->d_inode->i_mutex);
	dentry = __lookup_hash(name, parent, nd);
	mutex_unlock(&parent->d_inode->i_mutex);
	if (IS_ERR(dentry))
		return PTR_ERR(dentry);
	goto done;
}

static inline int may_lookup(struct nameidata *nd)