From: Jeremy Bongio <jbongio@xxxxxxxxxx> ext4 and block fops would both failover to syncronous, buffered writes if the direct IO results in a short write where only a portion of the request was completed. This patch changes the behavior to simply return the number of bytes written if the direct write is short. --- block/fops.c | 3 --- fs/ext4/file.c | 27 --------------------------- 2 files changed, 30 deletions(-) diff --git a/block/fops.c b/block/fops.c index 0cf8cf72cdfa..d32574ba9d71 100644 --- a/block/fops.c +++ b/block/fops.c @@ -704,9 +704,6 @@ static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) if (iocb->ki_flags & IOCB_DIRECT) { ret = blkdev_direct_write(iocb, from); - if (ret >= 0 && iov_iter_count(from)) - ret = direct_write_fallback(iocb, from, ret, - blkdev_buffered_write(iocb, from)); } else { ret = blkdev_buffered_write(iocb, from); } diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 54d6ff22585c..d0760452a11f 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -595,32 +595,6 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from) else inode_unlock(inode); - if (ret >= 0 && iov_iter_count(from)) { - ssize_t err; - loff_t endbyte; - - offset = iocb->ki_pos; - err = ext4_buffered_write_iter(iocb, from); - if (err < 0) - return err; - - /* - * We need to ensure that the pages within the page cache for - * the range covered by this I/O are written to disk and - * invalidated. This is in attempt to preserve the expected - * direct I/O semantics in the case we fallback to buffered I/O - * to complete off the I/O request. - */ - ret += err; - endbyte = offset + err - 1; - err = filemap_write_and_wait_range(iocb->ki_filp->f_mapping, - offset, endbyte); - if (!err) - invalidate_mapping_pages(iocb->ki_filp->f_mapping, - offset >> PAGE_SHIFT, - endbyte >> PAGE_SHIFT); - } - return ret; } @@ -958,4 +932,3 @@ const struct inode_operations ext4_file_inode_operations = { .fileattr_get = ext4_fileattr_get, .fileattr_set = ext4_fileattr_set, }; - -- 2.44.0.769.g3c40516874-goog