summary refs log tree commit diff
path: root/fs/namei.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-18 19:19:01 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-05-10 22:19:55 -0400
commit12b0957800514535165f98efe7714f2a53bbfbb0 (patch)
treed3cd61a9028eceec8d04eed23aaddbcd385b3e64 /fs/namei.c
parentb0c24c3bdf237182b2f043bfee68bf886b0c9ad3 (diff)
downloadlinux-12b0957800514535165f98efe7714f2a53bbfbb0.tar.gz
link_path_walk: don't bother with walk_component() after jumping link
... it does nothing if nd->last_type is LAST_BIND.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r--fs/namei.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 99374704c17d..ee083f921ef3 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -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--;