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

Commit 31d66bcd authored by Al Viro's avatar Al Viro
Browse files

namei: pass both WALK_GET and WALK_MORE to should_follow_link()



... and pull put_link() logics into it.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 1c4ff1a8
Loading
Loading
Loading
Loading
+7 −11
Original line number Diff line number Diff line
@@ -1725,6 +1725,8 @@ static int pick_link(struct nameidata *nd, struct path *link,
	return 1;
}

enum {WALK_GET = 1, WALK_MORE = 2};

/*
 * Do we need to follow links? We _really_ want to be able
 * to do this check without having to look at inode->i_op,
@@ -1732,12 +1734,14 @@ static int pick_link(struct nameidata *nd, struct path *link,
 * for the common case.
 */
static inline int should_follow_link(struct nameidata *nd, struct path *link,
				     int follow,
				     int flags,
				     struct inode *inode, unsigned seq)
{
	if (!(flags & WALK_MORE) && nd->depth)
		put_link(nd);
	if (likely(!d_is_symlink(link->dentry)))
		return 0;
	if (!follow && !(nd->flags & LOOKUP_FOLLOW))
	if (!(flags & WALK_GET) && !(nd->flags & LOOKUP_FOLLOW))
		return 0;
	/* make sure that d_is_symlink above matches inode */
	if (nd->flags & LOOKUP_RCU) {
@@ -1747,8 +1751,6 @@ static inline int should_follow_link(struct nameidata *nd, struct path *link,
	return pick_link(nd, link, inode, seq);
}

enum {WALK_GET = 1, WALK_MORE = 2};

static int walk_component(struct nameidata *nd, int flags)
{
	struct path path;
@@ -1789,9 +1791,7 @@ static int walk_component(struct nameidata *nd, int flags)
		inode = d_backing_inode(path.dentry);
	}

	if (!(flags & WALK_MORE) && nd->depth)
		put_link(nd);
	err = should_follow_link(nd, &path, flags & WALK_GET, inode, seq);
	err = should_follow_link(nd, &path, flags, inode, seq);
	if (unlikely(err))
		return err;
	path_to_nameidata(&path, nd);
@@ -2616,8 +2616,6 @@ mountpoint_last(struct nameidata *nd)
		dput(path.dentry);
		return -ENOENT;
	}
	if (nd->depth)
		put_link(nd);
	path.mnt = nd->path.mnt;
	error = should_follow_link(nd, &path, 0,
				   d_backing_inode(path.dentry), 0);
@@ -3313,8 +3311,6 @@ static int do_last(struct nameidata *nd,
	seq = 0;	/* out of RCU mode, so the value doesn't matter */
	inode = d_backing_inode(path.dentry);
finish_lookup:
	if (nd->depth)
		put_link(nd);
	error = should_follow_link(nd, &path, 0, inode, seq);
	if (unlikely(error))
		return error;