link_path_walk: split "return from recursive call" path
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 19 Apr 2015 00:40:04 +0000 (20:40 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 11 May 2015 02:19:58 +0000 (22:19 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

index 9844bb2f041f1b55a4a5b7818ea17c9154e35d88..5b0edd3313388016896b1a289886f85802c0763b 100644 (file)
@@ -1826,23 +1826,6 @@ Walked:
                                last->name = name;
                                name = s;
                                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)) {
@@ -1852,13 +1835,24 @@ back:
        }
        terminate_walk(nd);
 Err:
-       if (likely(!nd->depth))
-               return err;
-       goto back;
+       while (unlikely(nd->depth)) {
+               put_link(nd, &last->link, last->cookie);
+               current->link_count--;
+               nd->depth--;
+               last--;
+       }
+       return err;
 OK:
-       if (likely(!nd->depth))
-               return 0;
-       goto back;
+       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;
 }
 
 static int path_init(int dfd, const struct filename *name, unsigned int flags,