]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commit
block: bio_iov_iter_get_pages: pin more pages for multi-segment IOs
authorMartin Wilck <mwilck@suse.com>
Tue, 9 Oct 2018 16:04:00 +0000 (18:04 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 10 Oct 2018 08:33:04 +0000 (10:33 +0200)
commit6c9de34aa42c9f82cfa9d0836b8434b6b10cbca1
tree943814b4e6e6f1d826c5da225c7f266cfd118040
parentba0a2578e96f7090bdc1edf2ff96bce4229f08bf
block: bio_iov_iter_get_pages: pin more pages for multi-segment IOs

BugLink: https://bugs.launchpad.net/bugs/1796542
bio_iov_iter_get_pages() currently only adds pages for the next non-zero
segment from the iov_iter to the bio. That's suboptimal for callers,
which typically try to pin as many pages as fit into the bio. This patch
converts the current bio_iov_iter_get_pages() into a static helper, and
introduces a new helper that allocates as many pages as

 1) fit into the bio,
 2) are present in the iov_iter,
 3) and can be pinned by MM.

Error is returned only if zero pages could be pinned. Because of 3), a
zero return value doesn't necessarily mean all pages have been pinned.
Callers that have to pin every page in the iov_iter must still call this
function in a loop (this is currently the case).

This change matters most for __blkdev_direct_IO_simple(), which calls
bio_iov_iter_get_pages() only once. If it obtains less pages than
requested, it returns a "short write" or "short read", and
__generic_file_write_iter() falls back to buffered writes, which may
lead to data corruption.

Fixes: 72ecad22d9f1 ("block: support a full bio worth of IO for simplified bdev direct-io")
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit 17d51b10d7773e4618bcac64648f30f12d4078fb)
Signed-off-by: Colin Ian King <colin.king@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
block/bio.c