|
|
@@ -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);
|
|
|
|