link_path_walk: split "return from recursive call" path

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2015-04-18 20:40:04 -04:00
parent 32cd74685c
commit 07681481b8
1 changed files with 17 additions and 23 deletions

View File

@ -1826,23 +1826,6 @@ Walked:
last->name = name; last->name = name;
name = s; name = s;
goto start; goto start;
back:
name = last->name;
if (unlikely(err)) {
put_link(nd, &last->link, last->cookie);
current->link_count--;
nd->depth--;
last--;
goto Err;
} else {
err = walk_component(nd, LOOKUP_FOLLOW);
put_link(nd, &last->link, last->cookie);
current->link_count--;
nd->depth--;
last--;
goto Walked;
}
} }
} }
if (!d_can_lookup(nd->path.dentry)) { if (!d_can_lookup(nd->path.dentry)) {
@ -1852,13 +1835,24 @@ back:
} }
terminate_walk(nd); terminate_walk(nd);
Err: Err:
if (likely(!nd->depth)) while (unlikely(nd->depth)) {
put_link(nd, &last->link, last->cookie);
current->link_count--;
nd->depth--;
last--;
}
return err; return err;
goto back;
OK: OK:
if (likely(!nd->depth)) if (unlikely(nd->depth)) {
name = last->name;
err = walk_component(nd, LOOKUP_FOLLOW);
put_link(nd, &last->link, last->cookie);
current->link_count--;
nd->depth--;
last--;
goto Walked;
}
return 0; return 0;
goto back;
} }
static int path_init(int dfd, const struct filename *name, unsigned int flags, static int path_init(int dfd, const struct filename *name, unsigned int flags,