aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2009-12-26 07:01:01 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2010-03-05 09:01:31 -0500
commit67ee3ad21d0d0b2cc0b70708de8aed860fadda44 (patch)
tree842c575f8d7c06b4ebca8c418270da7207359767
parent4296e2cbf2138b5831b83f03e81de916ce1a967d (diff)
Pull handling of LAST_BIND into do_last(), clean up ok: part in do_filp_open()
Note that in case of !O_CREAT we know that nd.root has already been given up Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/namei.c17
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;
1739ok:
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
1856ok:
1857 filp = finish_open(&nd, open_flag, acc_mode);
1858 if (nd.root.mnt)
1859 path_put(&nd.root);
1860 return filp;
1861
1862exit_dput: 1860exit_dput:
1863 path_put_conditional(&path, &nd); 1861 path_put_conditional(&path, &nd);
1864exit:
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);
1867exit_parent: 1864exit_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
1873do_link: 1870do_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)