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

Commit 24643087 authored by Al Viro's avatar Al Viro
Browse files

in do_lookup() split RCU and non-RCU cases of need_revalidate



and use unlikely() instead of gotos, for fsck sake...

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 844a3917
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -1259,9 +1259,15 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
			return -ECHILD;

		nd->seq = seq;
		if (dentry->d_flags & DCACHE_OP_REVALIDATE)
			goto need_revalidate;
done2:
		if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) {
			dentry = do_revalidate(dentry, nd);
			if (!dentry)
				goto need_lookup;
			if (IS_ERR(dentry))
				goto fail;
			if (!(nd->flags & LOOKUP_RCU))
				goto done;
		}
		path->mnt = mnt;
		path->dentry = dentry;
		if (likely(__follow_mount_rcu(nd, path, inode, false)))
@@ -1274,8 +1280,13 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
	if (!dentry)
		goto need_lookup;
found:
	if (dentry->d_flags & DCACHE_OP_REVALIDATE)
		goto need_revalidate;
	if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) {
		dentry = do_revalidate(dentry, nd);
		if (!dentry)
			goto need_lookup;
		if (IS_ERR(dentry))
			goto fail;
	}
done:
	path->mnt = mnt;
	path->dentry = dentry;
@@ -1317,16 +1328,6 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
	mutex_unlock(&dir->i_mutex);
	goto found;

need_revalidate:
	dentry = do_revalidate(dentry, nd);
	if (!dentry)
		goto need_lookup;
	if (IS_ERR(dentry))
		goto fail;
	if (nd->flags & LOOKUP_RCU)
		goto done2;
	goto done;

fail:
	return PTR_ERR(dentry);
}