do_dentry_open(): take initialization of file->f_path to caller
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 10 Jun 2012 18:32:45 +0000 (14:32 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 14 Jul 2012 12:33:54 +0000 (16:33 +0400)
... and get rid of a couple of arguments and a pointless reassignment
in finish_open() case.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/open.c

index 28fbacbd5e311166cff3c78240a20dc176ea9f26..124ccb1d38a032b66f312d3e0ffdbb336c7db16f 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -667,8 +667,7 @@ int open_check_o_direct(struct file *f)
        return 0;
 }
 
-static int do_dentry_open(struct dentry *dentry, struct vfsmount *mnt,
-                         struct file *f,
+static int do_dentry_open(struct file *f,
                          int (*open)(struct inode *, struct file *),
                          const struct cred *cred)
 {
@@ -682,9 +681,9 @@ static int do_dentry_open(struct dentry *dentry, struct vfsmount *mnt,
        if (unlikely(f->f_flags & O_PATH))
                f->f_mode = FMODE_PATH;
 
-       inode = dentry->d_inode;
+       inode = f->f_path.dentry->d_inode;
        if (f->f_mode & FMODE_WRITE) {
-               error = __get_file_write_access(inode, mnt);
+               error = __get_file_write_access(inode, f->f_path.mnt);
                if (error)
                        goto cleanup_file;
                if (!special_file(inode->i_mode))
@@ -692,8 +691,6 @@ static int do_dentry_open(struct dentry *dentry, struct vfsmount *mnt,
        }
 
        f->f_mapping = inode->i_mapping;
-       f->f_path.dentry = dentry;
-       f->f_path.mnt = mnt;
        f->f_pos = 0;
        file_sb_list_add(f, inode->i_sb);
 
@@ -740,15 +737,14 @@ cleanup_all:
                         * here, so just reset the state.
                         */
                        file_reset_write(f);
-                       mnt_drop_write(mnt);
+                       mnt_drop_write(f->f_path.mnt);
                }
        }
        file_sb_list_del(f);
-       f->f_path.dentry = NULL;
-       f->f_path.mnt = NULL;
 cleanup_file:
-       dput(dentry);
-       mntput(mnt);
+       path_put(&f->f_path);
+       f->f_path.mnt = NULL;
+       f->f_path.dentry = NULL;
        return error;
 }
 
@@ -771,9 +767,9 @@ int finish_open(struct file *file, struct dentry *dentry,
        BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */
 
        mntget(file->f_path.mnt);
-       dget(dentry);
+       file->f_path.dentry = dget(dentry);
 
-       error = do_dentry_open(dentry, file->f_path.mnt, file, open, current_cred());
+       error = do_dentry_open(file, open, current_cred());
        if (!error)
                *opened |= FILE_OPENED;
 
@@ -821,7 +817,9 @@ struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags,
        }
 
        f->f_flags = flags;
-       error = do_dentry_open(dentry, mnt, f, NULL, cred);
+       f->f_path.mnt = mnt;
+       f->f_path.dentry = dentry;
+       error = do_dentry_open(f, NULL, cred);
        if (!error) {
                error = open_check_o_direct(f);
                if (error) {