mirror of https://gitee.com/openkylin/linux.git
direct-io: don't force writeback for reads beyond EOF
If a DIO read starts past EOF, the kernel won't attempt it, so we don't need to flush dirty pages before failing the syscall. Link: https://lore.kernel.org/r/20201008062620.2928326-3-krisman@collabora.com Suggested-by: Jan Kara <jack@suse.cz> Reviewed-by: Jan Kara <jack@suse.cz> Reviewed-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
46d716025a
commit
0a9164cb7f
|
@ -1188,19 +1188,9 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
|
||||||
memset(dio, 0, offsetof(struct dio, pages));
|
memset(dio, 0, offsetof(struct dio, pages));
|
||||||
|
|
||||||
dio->flags = flags;
|
dio->flags = flags;
|
||||||
if (dio->flags & DIO_LOCKING) {
|
if (dio->flags & DIO_LOCKING && iov_iter_rw(iter) == READ) {
|
||||||
if (iov_iter_rw(iter) == READ) {
|
/* will be released by direct_io_worker */
|
||||||
struct address_space *mapping =
|
inode_lock(inode);
|
||||||
iocb->ki_filp->f_mapping;
|
|
||||||
|
|
||||||
/* will be released by direct_io_worker */
|
|
||||||
inode_lock(inode);
|
|
||||||
|
|
||||||
retval = filemap_write_and_wait_range(mapping, offset,
|
|
||||||
end - 1);
|
|
||||||
if (retval)
|
|
||||||
goto fail_dio;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Once we sampled i_size check for reads beyond EOF */
|
/* Once we sampled i_size check for reads beyond EOF */
|
||||||
|
@ -1210,6 +1200,14 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
|
||||||
goto fail_dio;
|
goto fail_dio;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dio->flags & DIO_LOCKING && iov_iter_rw(iter) == READ) {
|
||||||
|
struct address_space *mapping = iocb->ki_filp->f_mapping;
|
||||||
|
|
||||||
|
retval = filemap_write_and_wait_range(mapping, offset, end - 1);
|
||||||
|
if (retval)
|
||||||
|
goto fail_dio;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For file extending writes updating i_size before data writeouts
|
* For file extending writes updating i_size before data writeouts
|
||||||
* complete can expose uninitialized blocks in dumb filesystems.
|
* complete can expose uninitialized blocks in dumb filesystems.
|
||||||
|
|
Loading…
Reference in New Issue