link_path_walk: don't bother with walk_component() after jumping link
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 18 Apr 2015 23:19:01 +0000 (19:19 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 11 May 2015 02:19:55 +0000 (22:19 -0400)
... it does nothing if nd->last_type is LAST_BIND.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

index 99374704c17ddf45bdc0fb6e689f28a7b46f8490..ee083f921ef335263fa4e87b74e589fa872e508d 100644 (file)
@@ -1797,7 +1797,11 @@ static int link_path_walk(const char *name, struct nameidata *nd)
                                        return err;
                                }
                                err = 0;
-                               if (likely(s)) {
+                               if (unlikely(!s)) {
+                                       /* jumped */
+                                       put_link(nd, &link, cookie);
+                                       break;
+                               } else {
                                        if (*s == '/') {
                                                if (!nd->root.mnt)
                                                        set_root(nd);
@@ -1812,9 +1816,9 @@ static int link_path_walk(const char *name, struct nameidata *nd)
                                                put_link(nd, &link, cookie);
                                                break;
                                        }
+                                       err = walk_component(nd, LOOKUP_FOLLOW);
+                                       put_link(nd, &link, cookie);
                                }
-                               err = walk_component(nd, LOOKUP_FOLLOW);
-                               put_link(nd, &link, cookie);
                        } while (err > 0);
 
                        current->link_count--;