From: Al Viro <v...@zeniv.linux.org.uk>

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 <v...@zeniv.linux.org.uk>
---
 fs/namei.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index e4ca3b1..e53f146 100644
--- a/fs/namei.c
+++ b/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;
 }
 
@@ -1543,8 +1539,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);
        }
@@ -1584,8 +1579,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)
@@ -2973,8 +2972,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;
        }
 
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to