do_last(): take fput() on error after opening to out:
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 27 Apr 2016 07:14:20 +0000 (03:14 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 2 May 2016 23:51:13 +0000 (19:51 -0400)
make it conditional on *opened & FILE_OPENED; in addition to getting
rid of exit_fput: thing, it simplifies atomic_open() cleanup on
may_open() failure.

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

index 6503767746f6a644421e6df6ca011204977e6c09..38eab154cef7a1fd6ce60813b461608cab1cc549 100644 (file)
@@ -2919,9 +2919,6 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
                acc_mode = 0;
        }
        error = may_open(&file->f_path, acc_mode, open_flag);
-       if (error)
-               fput(file);
-
 out:
        dput(dentry);
        return error;
@@ -3225,18 +3222,13 @@ finish_open_created:
        }
 opened:
        error = open_check_o_direct(file);
-       if (error)
-               goto exit_fput;
-       error = ima_file_check(file, op->acc_mode, *opened);
-       if (error)
-               goto exit_fput;
-
-       if (will_truncate) {
+       if (!error)
+               error = ima_file_check(file, op->acc_mode, *opened);
+       if (!error && will_truncate)
                error = handle_truncate(file);
-               if (error)
-                       goto exit_fput;
-       }
 out:
+       if (unlikely(error) && (*opened & FILE_OPENED))
+               fput(file);
        if (unlikely(error > 0)) {
                WARN_ON(1);
                error = -EINVAL;
@@ -3246,10 +3238,6 @@ out:
        path_put(&save_parent);
        return error;
 
-exit_fput:
-       fput(file);
-       goto out;
-
 stale_open:
        /* If no saved parent or already retried then can't retry */
        if (!save_parent.dentry || retried)