take grabbing f->f_path to do_dentry_open()
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 20 Jul 2012 19:28:46 +0000 (23:28 +0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 29 Jul 2012 17:24:18 +0000 (21:24 +0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/open.c

index 1e914b397e129f311875eb15d0c7679ace93aa3e..8d2c8970029c0bc345b58702318e6555102e2a10 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -654,6 +654,7 @@ static int do_dentry_open(struct file *f,
        if (unlikely(f->f_flags & O_PATH))
                f->f_mode = FMODE_PATH;
 
+       path_get(&f->f_path);
        inode = f->f_path.dentry->d_inode;
        if (f->f_mode & FMODE_WRITE) {
                error = __get_file_write_access(inode, f->f_path.mnt);
@@ -739,9 +740,7 @@ int finish_open(struct file *file, struct dentry *dentry,
        int error;
        BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */
 
-       mntget(file->f_path.mnt);
-       file->f_path.dentry = dget(dentry);
-
+       file->f_path.dentry = dentry;
        error = do_dentry_open(file, open, current_cred());
        if (!error)
                *opened |= FILE_OPENED;
@@ -784,7 +783,6 @@ struct file *dentry_open(const struct path *path, int flags,
 
        f->f_flags = flags;
        f->f_path = *path;
-       path_get(&f->f_path);
        error = do_dentry_open(f, NULL, cred);
        if (!error) {
                error = open_check_o_direct(f);