iomap: return partial I/O count on error in iomap_dio_bio_actor
Subsystems (3)
PATCH v2 1/1 iomap: return partial I/O count on error in iomap_dio_bio_actor
In case of a block device error, written parameter in iomap_end() is zero as opposed to the amount of submitted I/O. Filesystems such as btrfs need to account for the I/O in ordered extents, even if it resulted in an error. Having (incomplete) submitted bytes in written gives the filesystem the amount of data which has been submitted before the error occurred, and the filesystem code can choose how to use it.
The final returned error for iomap_dio_rw() is set by iomap_dio_complete().
Partial writes in direct I/O are considered an error. So, ->iomap_end() using written == 0 as error must be changed to written < length. In this case, ext4 is the only user.
Signed-off-by Goldwyn Rodrigues <[email protected]>
--- fs/ext4/inode.c | 2 +- fs/iomap/direct-io.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
fs/ext4/inode.c +1 -1
@@ -3475,7 +3475,7 @@ static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length,* the I/O. Any blocks that may have been allocated in preparation for * the direct I/O will be reused during buffered I/O. */ -if (flags & (IOMAP_WRITE |IOMAP_DIRECT ) && written ==0 ) +if (flags & (IOMAP_WRITE |IOMAP_DIRECT ) && written < length)return -ENOTBLK ;return 0 ;
fs/iomap/direct-io.c +1 -1
@@ -264,7 +264,7 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,size_t n;if (dio->error) {iov_iter_revert (dio->submit.iter, copied); - copied = ret =0 ; + ret =0 ; goto out; }
Signature · 5 lines
2.25.0 -- Goldwyn