Commit 0a9164cb authored by Gabriel Krisman Bertazi's avatar Gabriel Krisman Bertazi Committed by Jan Kara

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.comSuggested-by: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarJens Axboe <axboe@kernel.dk>
Signed-off-by: default avatarGabriel Krisman Bertazi <krisman@collabora.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 46d71602
...@@ -1188,19 +1188,9 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode, ...@@ -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, ...@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment