diff options
| -rw-r--r-- | fs/namei.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/fs/namei.c b/fs/namei.c index f5e4397dcd7e..0b4d19d47e67 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1656,6 +1656,9 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | |||
| 1656 | 1656 | ||
| 1657 | *is_link = 0; | 1657 | *is_link = 0; |
| 1658 | 1658 | ||
| 1659 | if (nd->last_type == LAST_BIND) | ||
| 1660 | goto ok; | ||
| 1661 | |||
| 1659 | error = -EISDIR; | 1662 | error = -EISDIR; |
| 1660 | if (nd->last_type != LAST_NORM || nd->last.name[nd->last.len]) | 1663 | if (nd->last_type != LAST_NORM || nd->last.name[nd->last.len]) |
| 1661 | goto exit; | 1664 | goto exit; |
| @@ -1733,6 +1736,7 @@ static struct file *do_last(struct nameidata *nd, struct path *path, | |||
| 1733 | error = -EISDIR; | 1736 | error = -EISDIR; |
| 1734 | if (S_ISDIR(path->dentry->d_inode->i_mode)) | 1737 | if (S_ISDIR(path->dentry->d_inode->i_mode)) |
| 1735 | goto exit; | 1738 | goto exit; |
| 1739 | ok: | ||
| 1736 | filp = finish_open(nd, open_flag, acc_mode); | 1740 | filp = finish_open(nd, open_flag, acc_mode); |
| 1737 | return filp; | 1741 | return filp; |
| 1738 | 1742 | ||
| @@ -1808,7 +1812,7 @@ struct file *do_filp_open(int dfd, const char *pathname, | |||
| 1808 | release_open_intent(&nd); | 1812 | release_open_intent(&nd); |
| 1809 | if (error) | 1813 | if (error) |
| 1810 | return ERR_PTR(error); | 1814 | return ERR_PTR(error); |
| 1811 | goto ok; | 1815 | return finish_open(&nd, open_flag, acc_mode); |
| 1812 | } | 1816 | } |
| 1813 | 1817 | ||
| 1814 | /* | 1818 | /* |
| @@ -1853,21 +1857,14 @@ reval: | |||
| 1853 | path_put(&nd.root); | 1857 | path_put(&nd.root); |
| 1854 | return filp; | 1858 | return filp; |
| 1855 | 1859 | ||
| 1856 | ok: | ||
| 1857 | filp = finish_open(&nd, open_flag, acc_mode); | ||
| 1858 | if (nd.root.mnt) | ||
| 1859 | path_put(&nd.root); | ||
| 1860 | return filp; | ||
| 1861 | |||
| 1862 | exit_dput: | 1860 | exit_dput: |
| 1863 | path_put_conditional(&path, &nd); | 1861 | path_put_conditional(&path, &nd); |
| 1864 | exit: | ||
| 1865 | if (!IS_ERR(nd.intent.open.file)) | 1862 | if (!IS_ERR(nd.intent.open.file)) |
| 1866 | release_open_intent(&nd); | 1863 | release_open_intent(&nd); |
| 1867 | exit_parent: | 1864 | exit_parent: |
| 1865 | path_put(&nd.path); | ||
| 1868 | if (nd.root.mnt) | 1866 | if (nd.root.mnt) |
| 1869 | path_put(&nd.root); | 1867 | path_put(&nd.root); |
| 1870 | path_put(&nd.path); | ||
| 1871 | return ERR_PTR(error); | 1868 | return ERR_PTR(error); |
| 1872 | 1869 | ||
| 1873 | do_link: | 1870 | do_link: |
| @@ -1905,8 +1902,6 @@ do_link: | |||
| 1905 | return ERR_PTR(error); | 1902 | return ERR_PTR(error); |
| 1906 | } | 1903 | } |
| 1907 | nd.flags &= ~LOOKUP_PARENT; | 1904 | nd.flags &= ~LOOKUP_PARENT; |
| 1908 | if (nd.last_type == LAST_BIND) | ||
| 1909 | goto ok; | ||
| 1910 | filp = do_last(&nd, &path, open_flag, acc_mode, mode, | 1905 | filp = do_last(&nd, &path, open_flag, acc_mode, mode, |
| 1911 | pathname, &is_link); | 1906 | pathname, &is_link); |
| 1912 | if (nd.last_type == LAST_NORM) | 1907 | if (nd.last_type == LAST_NORM) |
