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

Commit 086e183a authored by Al Viro's avatar Al Viro
Browse files

pull dropping RCU on success of link_path_walk() into path_lookupat()



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 16c2cd71
Loading
Loading
Loading
Loading
+12 −18
Original line number Diff line number Diff line
@@ -539,14 +539,6 @@ static int nameidata_drop_rcu_last(struct nameidata *nd)
	return -ECHILD;
}

/* Try to drop out of rcu-walk mode if we were in it, otherwise do nothing.  */
static inline int nameidata_drop_rcu_last_maybe(struct nameidata *nd)
{
	if (likely(nd->flags & LOOKUP_RCU))
		return nameidata_drop_rcu_last(nd);
	return 0;
}

/**
 * release_open_intent - free up open intent resources
 * @nd: pointer to nameidata
@@ -1339,7 +1331,7 @@ static int link_path_walk(const char *name, struct nameidata *nd)
	while (*name=='/')
		name++;
	if (!*name)
		goto return_base;
		return 0;

	if (nd->depth)
		lookup_flags = LOOKUP_FOLLOW | (nd->flags & LOOKUP_CONTINUE);
@@ -1448,7 +1440,7 @@ static int link_path_walk(const char *name, struct nameidata *nd)
				} else
					follow_dotdot(nd);
			}
			goto return_base;
			return 0;
		}
		err = do_lookup(nd, &this, &next, &inode);
		if (err)
@@ -1471,13 +1463,10 @@ static int link_path_walk(const char *name, struct nameidata *nd)
			if (!nd->inode->i_op->lookup)
				break;
		}
		goto return_base;
		return 0;
lookup_parent:
		nd->last = this;
		nd->last_type = type;
return_base:
		if (nameidata_drop_rcu_last_maybe(nd))
			return -ECHILD;
		return 0;
out_dput:
		if (!(nd->flags & LOOKUP_RCU))
@@ -1598,11 +1587,16 @@ static int path_lookupat(int dfd, const char *name,

	if (nd->flags & LOOKUP_RCU) {
		/* RCU dangling. Cancel it. */
		if (!retval) {
			if (nameidata_drop_rcu_last(nd))
				retval = -ECHILD;
		} else {
			nd->flags &= ~LOOKUP_RCU;
			nd->root.mnt = NULL;
			rcu_read_unlock();
			br_read_unlock(vfsmount_lock);
		}
	}

	if (!retval)
		retval = handle_reval_path(nd);