All of lore.kernel.org
 help / color / mirror / Atom feed
From: Keith Busch <kbusch@fb.com>
To: <linux-fsdevel@vger.kernel.org>, <linux-block@vger.kernel.org>,
	<linux-nvme@lists.infradead.org>
Cc: <axboe@kernel.dk>, Kernel Team <Kernel-team@fb.com>, <hch@lst.de>,
	<willy@infradead.org>, <sagi@grimberg.me>,
	Keith Busch <kbusch@kernel.org>
Subject: [PATCH 11/12] iomap: add direct-io partial sector read support
Date: Thu, 30 Jun 2022 13:42:11 -0700	[thread overview]
Message-ID: <20220630204212.1265638-12-kbusch@fb.com> (raw)
In-Reply-To: <20220630204212.1265638-1-kbusch@fb.com>

From: Keith Busch <kbusch@kernel.org>

Enable direct io to read partial sectors if the block device supports bit
buckets.

Signed-off-by: Keith Busch <kbusch@kernel.org>
---
 fs/iomap/direct-io.c | 36 ++++++++++++++++++++++++++++--------
 1 file changed, 28 insertions(+), 8 deletions(-)

diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
index 10a113358365..212e63b78950 100644
--- a/fs/iomap/direct-io.c
+++ b/fs/iomap/direct-io.c
@@ -251,9 +251,12 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
 	int nr_pages, ret = 0;
 	size_t copied = 0;
 	size_t orig_count;
+	u16 skip = 0, trunc = 0;
 
 	if (blkdev_dio_unaligned(bdev, pos | length, dio->submit.iter))
-		return -EINVAL;
+		if (!blkdev_bit_bucket(bdev, pos, length, dio->submit.iter,
+				       &skip, &trunc))
+			return -EINVAL;
 
 	if (iomap->type == IOMAP_UNWRITTEN) {
 		dio->flags |= IOMAP_DIO_UNWRITTEN;
@@ -310,9 +313,10 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
 	 */
 	bio_opf = iomap_dio_bio_opflags(dio, iomap, use_fua);
 
-	nr_pages = bio_iov_vecs_to_alloc(dio->submit.iter, BIO_MAX_VECS);
+	nr_pages = bio_iov_vecs_to_alloc_partial(dio->submit.iter, BIO_MAX_VECS,
+						 skip, trunc);
 	do {
-		size_t n;
+		size_t n, bucket_bytes = 0;
 		if (dio->error) {
 			iov_iter_revert(dio->submit.iter, copied);
 			copied = ret = 0;
@@ -327,6 +331,15 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
 		bio->bi_private = dio;
 		bio->bi_end_io = iomap_dio_bio_end_io;
 
+		if (skip || trunc) {
+			bio_set_flag(bio, BIO_BIT_BUCKET);
+			if (skip) {
+				bucket_bytes += skip;
+				blk_add_bb_page(bio, skip);
+				skip = 0;
+			}
+		}
+
 		ret = bio_iov_iter_get_pages(bio, dio->submit.iter);
 		if (unlikely(ret)) {
 			/*
@@ -339,6 +352,12 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
 			goto zero_tail;
 		}
 
+		if (trunc && !iov_iter_count(dio->submit.iter)) {
+			blk_add_bb_page(bio, trunc);
+			bucket_bytes += trunc;
+			trunc = 0;
+		}
+
 		n = bio->bi_iter.bi_size;
 		if (dio->flags & IOMAP_DIO_WRITE) {
 			task_io_account_write(n);
@@ -347,18 +366,19 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
 				bio_set_pages_dirty(bio);
 		}
 
-		dio->size += n;
-		copied += n;
+		dio->size += n - bucket_bytes;
+		copied += n - bucket_bytes;
 
-		nr_pages = bio_iov_vecs_to_alloc(dio->submit.iter,
-						 BIO_MAX_VECS);
+		nr_pages = bio_iov_vecs_to_alloc_partial(dio->submit.iter,
+							 BIO_MAX_VECS, skip,
+							 trunc);
 		/*
 		 * We can only poll for single bio I/Os.
 		 */
 		if (nr_pages)
 			dio->iocb->ki_flags &= ~IOCB_HIPRI;
 		iomap_dio_submit_bio(iter, dio, bio, pos);
-		pos += n;
+		pos += n - bucket_bytes;
 	} while (nr_pages);
 
 	/*
-- 
2.30.2


  parent reply	other threads:[~2022-06-30 20:43 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-30 20:42 [PATCH 00/12] block: support for partial sector reads Keith Busch
2022-06-30 20:42 ` [PATCH 01/12] block: move direct io alignment check to common Keith Busch
2022-06-30 20:42 ` [PATCH 02/12] iomap: save copy of bdev for direct io Keith Busch
2022-06-30 20:42 ` [PATCH 03/12] iomap: get logical block size directly Keith Busch
2022-06-30 20:42 ` [PATCH 04/12] iomap: use common blkdev alignment check Keith Busch
2022-06-30 20:42 ` [PATCH 05/12] block: add bit bucket capabilities Keith Busch
2022-06-30 20:42 ` [PATCH 06/12] nvme: add support for bit buckets Keith Busch
2022-06-30 20:42 ` [PATCH 07/12] block: allow copying pre-registered bvecs Keith Busch
2022-07-01  2:40   ` Keith Busch
2022-06-30 20:42 ` [PATCH 08/12] block: add bio number of vecs helper for partials Keith Busch
2022-06-30 20:42 ` [PATCH 09/12] block: add partial sector parameter helper Keith Busch
2022-06-30 20:42 ` [PATCH 10/12] block: add direct-io partial sector read support Keith Busch
2022-06-30 20:42 ` Keith Busch [this message]
2022-06-30 20:42 ` [PATCH 12/12] block: export and document bit_bucket attribute Keith Busch

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220630204212.1265638-12-kbusch@fb.com \
    --to=kbusch@fb.com \
    --cc=Kernel-team@fb.com \
    --cc=axboe@kernel.dk \
    --cc=hch@lst.de \
    --cc=kbusch@kernel.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=sagi@grimberg.me \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.