]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/ext4/inode.c
ext4: fix a race in the ext4 shutdown path
[linux.git] / fs / ext4 / inode.c
index 534a9130f62578931a24477f317c17b42c71ffc3..4c2f8b57bdc7331ae6ac2f2335f823c119c40607 100644 (file)
@@ -3767,10 +3767,18 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter)
                /* Credits for sb + inode write */
                handle = ext4_journal_start(inode, EXT4_HT_INODE, 2);
                if (IS_ERR(handle)) {
-                       /* This is really bad luck. We've written the data
-                        * but cannot extend i_size. Bail out and pretend
-                        * the write failed... */
-                       ret = PTR_ERR(handle);
+                       /*
+                        * We wrote the data but cannot extend
+                        * i_size. Bail out. In async io case, we do
+                        * not return error here because we have
+                        * already submmitted the corresponding
+                        * bio. Returning error here makes the caller
+                        * think that this IO is done and failed
+                        * resulting in race with bio's completion
+                        * handler.
+                        */
+                       if (!ret)
+                               ret = PTR_ERR(handle);
                        if (inode->i_nlink)
                                ext4_orphan_del(NULL, inode);