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

link_path_walk: turn inner loop into explicit goto



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 12b09578
Loading
Loading
Loading
Loading
+32 −29
Original line number Diff line number Diff line
@@ -1775,6 +1775,10 @@ static int link_path_walk(const char *name, struct nameidata *nd)
			return err;

		if (err) {
			struct path link;
			void *cookie;
			const char *s;

			if (unlikely(current->link_count >= MAX_NESTED_LINKS)) {
				path_put_conditional(&nd->link, nd);
				path_put(&nd->path);
@@ -1785,10 +1789,9 @@ static int link_path_walk(const char *name, struct nameidata *nd)
			nd->depth++;
			current->link_count++;

			do {
				struct path link = nd->link;
				void *cookie;
				const char *s = get_link(&link, nd, &cookie);
loop:	/* will be gone very soon */
			link = nd->link;
			s = get_link(&link, nd, &cookie);

			if (unlikely(IS_ERR(s))) {
				err = PTR_ERR(s);
@@ -1800,7 +1803,6 @@ static int link_path_walk(const char *name, struct nameidata *nd)
			if (unlikely(!s)) {
				/* jumped */
				put_link(nd, &link, cookie);
					break;
			} else {
				if (*s == '/') {
					if (!nd->root.mnt)
@@ -1814,12 +1816,13 @@ static int link_path_walk(const char *name, struct nameidata *nd)
				err = link_path_walk(s, nd);
				if (unlikely(err)) {
					put_link(nd, &link, cookie);
						break;
					}
				} else {
					err = walk_component(nd, LOOKUP_FOLLOW);
					put_link(nd, &link, cookie);
					if (err > 0)
						goto loop;
				}
			}
			} while (err > 0);

			current->link_count--;
			nd->depth--;