Commit f0a9ba70 authored by Al Viro's avatar Al Viro

lift terminate_walk() into callers of walk_component()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 70291aec
...@@ -1587,20 +1587,16 @@ static int walk_component(struct nameidata *nd, int follow) ...@@ -1587,20 +1587,16 @@ static int walk_component(struct nameidata *nd, int follow)
* to be able to know about the current root directory and * to be able to know about the current root directory and
* parent relationships. * parent relationships.
*/ */
if (unlikely(nd->last_type != LAST_NORM)) { if (unlikely(nd->last_type != LAST_NORM))
err = handle_dots(nd, nd->last_type); return handle_dots(nd, nd->last_type);
if (err)
goto out_err;
return 0;
}
err = lookup_fast(nd, &path, &inode); err = lookup_fast(nd, &path, &inode);
if (unlikely(err)) { if (unlikely(err)) {
if (err < 0) if (err < 0)
goto out_err; return err;
err = lookup_slow(nd, &path); err = lookup_slow(nd, &path);
if (err < 0) if (err < 0)
goto out_err; return err;
inode = path.dentry->d_inode; inode = path.dentry->d_inode;
err = -ENOENT; err = -ENOENT;
...@@ -1612,8 +1608,7 @@ static int walk_component(struct nameidata *nd, int follow) ...@@ -1612,8 +1608,7 @@ static int walk_component(struct nameidata *nd, int follow)
if (nd->flags & LOOKUP_RCU) { if (nd->flags & LOOKUP_RCU) {
if (unlikely(nd->path.mnt != path.mnt || if (unlikely(nd->path.mnt != path.mnt ||
unlazy_walk(nd, path.dentry))) { unlazy_walk(nd, path.dentry))) {
err = -ECHILD; return -ECHILD;
goto out_err;
} }
} }
BUG_ON(inode != path.dentry->d_inode); BUG_ON(inode != path.dentry->d_inode);
...@@ -1626,8 +1621,6 @@ static int walk_component(struct nameidata *nd, int follow) ...@@ -1626,8 +1621,6 @@ static int walk_component(struct nameidata *nd, int follow)
out_path_put: out_path_put:
path_to_nameidata(&path, nd); path_to_nameidata(&path, nd);
out_err:
terminate_walk(nd);
return err; return err;
} }
...@@ -1819,7 +1812,7 @@ static int link_path_walk(const char *name, struct nameidata *nd) ...@@ -1819,7 +1812,7 @@ static int link_path_walk(const char *name, struct nameidata *nd)
err = walk_component(nd, LOOKUP_FOLLOW); err = walk_component(nd, LOOKUP_FOLLOW);
Walked: Walked:
if (err < 0) if (err < 0)
goto Err; break;
if (err) { if (err) {
const char *s; const char *s;
...@@ -2020,11 +2013,15 @@ static int trailing_symlink(struct nameidata *nd) ...@@ -2020,11 +2013,15 @@ static int trailing_symlink(struct nameidata *nd)
static inline int lookup_last(struct nameidata *nd) static inline int lookup_last(struct nameidata *nd)
{ {
int err;
if (nd->last_type == LAST_NORM && nd->last.name[nd->last.len]) if (nd->last_type == LAST_NORM && nd->last.name[nd->last.len])
nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
nd->flags &= ~LOOKUP_PARENT; nd->flags &= ~LOOKUP_PARENT;
return walk_component(nd, nd->flags & LOOKUP_FOLLOW); err = walk_component(nd, nd->flags & LOOKUP_FOLLOW);
if (err < 0)
terminate_walk(nd);
return err;
} }
/* Returns 0 and nd will be valid on success; Retuns error, otherwise. */ /* Returns 0 and nd will be valid on success; Retuns error, otherwise. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment