aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/namei.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/namei.c b/fs/namei.c
index e0a33f598cdf..14eab848f7d8 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1802,8 +1802,11 @@ static int link_path_walk(const char *name, struct nameidata *nd)
1802 } 1802 }
1803 } 1803 }
1804 1804
1805 nd->last = this;
1806 nd->last_type = type;
1807
1805 if (!name[len]) 1808 if (!name[len])
1806 goto last_component; 1809 return 0;
1807 /* 1810 /*
1808 * If it wasn't NUL, we know it was '/'. Skip that 1811 * If it wasn't NUL, we know it was '/'. Skip that
1809 * slash, and continue until no more slashes. 1812 * slash, and continue until no more slashes.
@@ -1812,7 +1815,8 @@ static int link_path_walk(const char *name, struct nameidata *nd)
1812 len++; 1815 len++;
1813 } while (unlikely(name[len] == '/')); 1816 } while (unlikely(name[len] == '/'));
1814 if (!name[len]) 1817 if (!name[len])
1815 goto last_component; 1818 return 0;
1819
1816 name += len; 1820 name += len;
1817 1821
1818 err = walk_component(nd, &next, &this, type, LOOKUP_FOLLOW); 1822 err = walk_component(nd, &next, &this, type, LOOKUP_FOLLOW);
@@ -1824,16 +1828,10 @@ static int link_path_walk(const char *name, struct nameidata *nd)
1824 if (err) 1828 if (err)
1825 return err; 1829 return err;
1826 } 1830 }
1827 if (can_lookup(nd->inode)) 1831 if (!can_lookup(nd->inode)) {
1828 continue; 1832 err = -ENOTDIR;
1829 err = -ENOTDIR; 1833 break;
1830 break; 1834 }
1831 /* here ends the main loop */
1832
1833last_component:
1834 nd->last = this;
1835 nd->last_type = type;
1836 return 0;
1837 } 1835 }
1838 terminate_walk(nd); 1836 terminate_walk(nd);
1839 return err; 1837 return err;