Commit 8620c238 authored by Al Viro's avatar Al Viro
Browse files

link_path_walk: move the OK: inside the loop



fewer labels that way; in particular, resuming after the end of
nested symlink is straight-line.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 15439726
Loading
Loading
Loading
Loading
+15 −15
Original line number Diff line number Diff line
@@ -1806,11 +1806,21 @@ static int link_path_walk(const char *name, struct nameidata *nd)
		do {
			name++;
		} while (unlikely(*name == '/'));
		if (!*name)
			goto OK;

		if (unlikely(!*name)) {
OK:
			/* called from path_init(), done */
			if (!nd->depth)
				return 0;
			name = nd->stack[nd->depth - 1].name;
			/* called from trailing_symlink(), done */
			if (!name)
				return 0;
			/* last component of nested symlink */
			err = walk_component(nd, LOOKUP_FOLLOW);
			put_link(nd);
		} else {
			err = walk_component(nd, LOOKUP_FOLLOW);
Walked:
		}
		if (err < 0)
			break;

@@ -1859,16 +1869,6 @@ Walked:
	}
	terminate_walk(nd);
	return err;
OK:
	if (!nd->depth)		/* called from path_init(), done */
		return 0;
	name = nd->stack[nd->depth - 1].name;
	if (!name)		/* called from trailing_symlink(), done */
		return 0;

	err = walk_component(nd, LOOKUP_FOLLOW);
	put_link(nd);
	goto Walked;
}

static int path_init(int dfd, const struct filename *name, unsigned int flags,