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

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

fs/namei.c: new helper - legitimize_root()



identical logics in unlazy_walk() and unlazy_child()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent ce6595a2
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -641,6 +641,13 @@ static bool legitimize_links(struct nameidata *nd)
	return true;
}

static bool legitimize_root(struct nameidata *nd)
{
	if (!nd->root.mnt || (nd->flags & LOOKUP_ROOT))
		return true;
	return legitimize_path(nd, &nd->root, nd->root_seq);
}

/*
 * Path walking has 2 modes, rcu-walk and ref-walk (see
 * Documentation/filesystems/path-lookup.txt).  In situations when we can't
@@ -674,10 +681,8 @@ static int unlazy_walk(struct nameidata *nd)
		goto out2;
	if (unlikely(!legitimize_path(nd, &nd->path, nd->seq)))
		goto out1;
	if (nd->root.mnt && !(nd->flags & LOOKUP_ROOT)) {
		if (unlikely(!legitimize_path(nd, &nd->root, nd->root_seq)))
	if (unlikely(!legitimize_root(nd)))
		goto out;
	}
	rcu_read_unlock();
	BUG_ON(nd->inode != parent->d_inode);
	return 0;
@@ -736,13 +741,11 @@ static int unlazy_child(struct nameidata *nd, struct dentry *dentry, unsigned se
	 * Sequence counts matched. Now make sure that the root is
	 * still valid and get it if required.
	 */
	if (nd->root.mnt && !(nd->flags & LOOKUP_ROOT)) {
		if (unlikely(!legitimize_path(nd, &nd->root, nd->root_seq))) {
	if (unlikely(!legitimize_root(nd))) {
		rcu_read_unlock();
		dput(dentry);
		return -ECHILD;
	}
	}

	rcu_read_unlock();
	return 0;