lift fput() on late failures into path_openat()
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 8 Jun 2018 16:56:55 +0000 (12:56 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 12 Jul 2018 14:04:17 +0000 (10:04 -0400)
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

index 503c4b968415047636a2bfe718b351235eee8760..bb77f6cc3ea811a6bd423a88f4e26fb841eaf243 100644 (file)
@@ -3407,8 +3407,6 @@ opened:
        if (!error && will_truncate)
                error = handle_truncate(file);
 out:
-       if (unlikely(error) && (*opened & FILE_OPENED))
-               fput(file);
        if (unlikely(error > 0)) {
                WARN_ON(1);
                error = -EINVAL;
@@ -3484,8 +3482,6 @@ static int do_tmpfile(struct nameidata *nd, unsigned flags,
        if (error)
                goto out2;
        error = open_check_o_direct(file);
-       if (error)
-               fput(file);
 out2:
        mnt_drop_write(path.mnt);
 out:
@@ -3545,20 +3541,20 @@ static struct file *path_openat(struct nameidata *nd,
        }
        terminate_walk(nd);
 out2:
-       if (!(opened & FILE_OPENED)) {
-               BUG_ON(!error);
-               fput(file);
+       if (likely(!error)) {
+               if (likely(opened & FILE_OPENED))
+                       return file;
+               WARN_ON(1);
+               error = -EINVAL;
        }
-       if (unlikely(error)) {
-               if (error == -EOPENSTALE) {
-                       if (flags & LOOKUP_RCU)
-                               error = -ECHILD;
-                       else
-                               error = -ESTALE;
-               }
-               file = ERR_PTR(error);
+       fput(file);
+       if (error == -EOPENSTALE) {
+               if (flags & LOOKUP_RCU)
+                       error = -ECHILD;
+               else
+                       error = -ESTALE;
        }
-       return file;
+       return ERR_PTR(error);
 }
 
 struct file *do_filp_open(int dfd, struct filename *pathname,