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

Commit 1a8edf40 authored by Al Viro's avatar Al Viro
Browse files

do_lookup() fix



do_lookup() has a path leading from LOOKUP_RCU case to non-RCU
crossing of mountpoints, which breaks things badly.  If we
hit need_revalidate: and do nothing in there, we need to come
back into LOOKUP_RCU half of things, not to done: in non-RCU
one.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent d73b3884
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1089,6 +1089,7 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
		nd->seq = seq;
		if (dentry->d_flags & DCACHE_OP_REVALIDATE)
			goto need_revalidate;
done2:
		path->mnt = mnt;
		path->dentry = dentry;
		__follow_mount_rcu(nd, path, inode);
@@ -1143,6 +1144,8 @@ need_revalidate:
		goto need_lookup;
	if (IS_ERR(dentry))
		goto fail;
	if (nd->flags & LOOKUP_RCU)
		goto done2;
	goto done;

fail: