summaryrefslogtreecommitdiffstats
path: root/fs/open.c
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2012-05-21 17:30:17 +0200
committerAl Viro <viro@zeniv.linux.org.uk>2012-06-01 18:12:01 +0200
commit91daee988db38b0207eec719a3160b163c077007 (patch)
tree932e374dc322cb2ecd4d343c9c4a52b0d62467ff /fs/open.c
parentvfs: do_dentry_open(): don't put filp (diff)
downloadlinux-91daee988db38b0207eec719a3160b163c077007.tar.xz
linux-91daee988db38b0207eec719a3160b163c077007.zip
vfs: nameidata_to_filp(): inline __dentry_open()
Copy __dentry_open() into nameidata_to_filp(). Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/open.c')
-rw-r--r--fs/open.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/fs/open.c b/fs/open.c
index 511c548b0997..9fd34b76b959 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -828,9 +828,25 @@ struct file *nameidata_to_filp(struct nameidata *nd)
/* Has the filesystem initialised the file for us? */
if (filp->f_path.dentry == NULL) {
+ struct file *res;
+
path_get(&nd->path);
- filp = __dentry_open(nd->path.dentry, nd->path.mnt, filp,
- NULL, cred);
+ res = do_dentry_open(nd->path.dentry, nd->path.mnt,
+ filp, NULL, cred);
+ if (!IS_ERR(res)) {
+ int error;
+
+ BUG_ON(res != filp);
+
+ error = open_check_o_direct(filp);
+ if (error) {
+ fput(filp);
+ filp = ERR_PTR(error);
+ }
+ } else {
+ put_filp(filp);
+ filp = res;
+ }
}
return filp;
}