forked from Minki/linux
namei: lift (open-coded) terminate_walk() in follow_dotdot_rcu() into callers
follow_dotdot_rcu() does an equivalent of terminate_walk() on failure; shifting it into callers makes for simpler rules and those callers already have terminate_walk() on other failure exits. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
e269f2a73f
commit
70291aecc6
19
fs/namei.c
19
fs/namei.c
@ -1230,10 +1230,6 @@ static int follow_dotdot_rcu(struct nameidata *nd)
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
nd->flags &= ~LOOKUP_RCU;
|
||||
if (!(nd->flags & LOOKUP_ROOT))
|
||||
nd->root.mnt = NULL;
|
||||
rcu_read_unlock();
|
||||
return -ECHILD;
|
||||
}
|
||||
|
||||
@ -1551,8 +1547,7 @@ static inline int handle_dots(struct nameidata *nd, int type)
|
||||
{
|
||||
if (type == LAST_DOTDOT) {
|
||||
if (nd->flags & LOOKUP_RCU) {
|
||||
if (follow_dotdot_rcu(nd))
|
||||
return -ECHILD;
|
||||
return follow_dotdot_rcu(nd);
|
||||
} else
|
||||
follow_dotdot(nd);
|
||||
}
|
||||
@ -1592,8 +1587,12 @@ static int walk_component(struct nameidata *nd, int follow)
|
||||
* to be able to know about the current root directory and
|
||||
* parent relationships.
|
||||
*/
|
||||
if (unlikely(nd->last_type != LAST_NORM))
|
||||
return handle_dots(nd, nd->last_type);
|
||||
if (unlikely(nd->last_type != LAST_NORM)) {
|
||||
err = handle_dots(nd, nd->last_type);
|
||||
if (err)
|
||||
goto out_err;
|
||||
return 0;
|
||||
}
|
||||
err = lookup_fast(nd, &path, &inode);
|
||||
if (unlikely(err)) {
|
||||
if (err < 0)
|
||||
@ -2981,8 +2980,10 @@ static int do_last(struct nameidata *nd,
|
||||
|
||||
if (nd->last_type != LAST_NORM) {
|
||||
error = handle_dots(nd, nd->last_type);
|
||||
if (error)
|
||||
if (unlikely(error)) {
|
||||
terminate_walk(nd);
|
||||
return error;
|
||||
}
|
||||
goto finish_open;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user