From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-block@vger.kernel.org,
"Md. Haris Iqbal" <haris.iqbal@ionos.com>,
Jack Wang <jinpu.wang@ionos.com>, Coly Li <colyli@kernel.org>,
Kent Overstreet <kent.overstreet@linux.dev>,
Mike Snitzer <snitzer@kernel.org>,
Mikulas Patocka <mpatocka@redhat.com>, Chris Mason <clm@fb.com>,
Josef Bacik <josef@toxicpanda.com>,
David Sterba <dsterba@suse.com>,
Andreas Gruenbacher <agruenba@redhat.com>,
Carlos Maiolino <cem@kernel.org>,
Damien Le Moal <dlemoal@kernel.org>,
Naohiro Aota <naohiro.aota@wdc.com>,
Johannes Thumshirn <jth@kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Pavel Machek <pavel@kernel.org>,
slava@dubeyko.com, glaubitz@physik.fu-berlin.de,
frank.li@vivo.com, linux-bcache@vger.kernel.org,
dm-devel@lists.linux.dev, linux-btrfs@vger.kernel.org,
gfs2@lists.linux.dev, linux-fsdevel@vger.kernel.org,
linux-xfs@vger.kernel.org, linux-pm@vger.kernel.org,
Hannes Reinecke <hare@suse.de>,
Johannes Thumshirn <johannes.thumshirn@wdc.com>
Subject: [PATCH 02/19] block: add a bdev_rw_virt helper
Date: Wed, 7 May 2025 14:04:26 +0200 [thread overview]
Message-ID: <20250507120451.4000627-3-hch@lst.de> (raw)
In-Reply-To: <20250507120451.4000627-1-hch@lst.de>
Add a helper to perform synchronous I/O on a kernel direct map range.
Currently this is implemented in various places in usually not very
efficient ways, so provide a generic helper instead.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
block/bio.c | 30 ++++++++++++++++++++++++++++++
include/linux/bio.h | 5 ++++-
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/block/bio.c b/block/bio.c
index bd3d048d0a72..26782ff85dbf 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1319,6 +1319,36 @@ int submit_bio_wait(struct bio *bio)
}
EXPORT_SYMBOL(submit_bio_wait);
+/**
+ * bdev_rw_virt - synchronously read into / write from kernel mapping
+ * @bdev: block device to access
+ * @sector: sector to access
+ * @data: data to read/write
+ * @len: length in byte to read/write
+ * @op: operation (e.g. REQ_OP_READ/REQ_OP_WRITE)
+ *
+ * Performs synchronous I/O to @bdev for @data/@len. @data must be in
+ * the kernel direct mapping and not a vmalloc address.
+ */
+int bdev_rw_virt(struct block_device *bdev, sector_t sector, void *data,
+ size_t len, enum req_op op)
+{
+ struct bio_vec bv;
+ struct bio bio;
+ int error;
+
+ if (WARN_ON_ONCE(is_vmalloc_addr(data)))
+ return -EIO;
+
+ bio_init(&bio, bdev, &bv, 1, op);
+ bio.bi_iter.bi_sector = sector;
+ bio_add_virt_nofail(&bio, data, len);
+ error = submit_bio_wait(&bio);
+ bio_uninit(&bio);
+ return error;
+}
+EXPORT_SYMBOL_GPL(bdev_rw_virt);
+
static void bio_wait_end_io(struct bio *bio)
{
complete(bio->bi_private);
diff --git a/include/linux/bio.h b/include/linux/bio.h
index acca7464080c..ad54e6af20dc 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -402,7 +402,6 @@ static inline int bio_iov_vecs_to_alloc(struct iov_iter *iter, int max_segs)
struct request_queue;
-extern int submit_bio_wait(struct bio *bio);
void bio_init(struct bio *bio, struct block_device *bdev, struct bio_vec *table,
unsigned short max_vecs, blk_opf_t opf);
extern void bio_uninit(struct bio *);
@@ -419,6 +418,10 @@ void bio_add_folio_nofail(struct bio *bio, struct folio *folio, size_t len,
size_t off);
void bio_add_virt_nofail(struct bio *bio, void *vaddr, unsigned len);
+int submit_bio_wait(struct bio *bio);
+int bdev_rw_virt(struct block_device *bdev, sector_t sector, void *data,
+ size_t len, enum req_op op);
+
int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter);
void bio_iov_bvec_set(struct bio *bio, const struct iov_iter *iter);
void __bio_release_pages(struct bio *bio, bool mark_dirty);
--
2.47.2
next prev parent reply other threads:[~2025-05-07 12:05 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
2025-05-07 12:04 ` [PATCH 01/19] block: add a bio_add_virt_nofail helper Christoph Hellwig
2025-05-07 12:04 ` Christoph Hellwig [this message]
2025-05-07 14:01 ` [PATCH 02/19] block: add a bdev_rw_virt helper Jens Axboe
2025-05-08 12:52 ` Matthew Wilcox
2025-05-08 13:10 ` Jens Axboe
2025-05-08 13:23 ` Johannes Thumshirn
2025-05-07 12:04 ` [PATCH 03/19] block: add a bio_add_max_vecs helper Christoph Hellwig
2025-05-07 12:04 ` [PATCH 04/19] block: add a bio_add_vmalloc helpers Christoph Hellwig
2025-05-07 12:04 ` [PATCH 05/19] block: remove the q argument from blk_rq_map_kern Christoph Hellwig
2025-05-07 12:04 ` [PATCH 06/19] block: pass the operation to bio_{map,copy}_kern Christoph Hellwig
2025-05-07 12:04 ` [PATCH 07/19] block: simplify bio_map_kern Christoph Hellwig
2025-05-07 12:04 ` [PATCH 08/19] bcache: use bio_add_virt_nofail Christoph Hellwig
2025-05-07 12:04 ` [PATCH 09/19] rnbd-srv: " Christoph Hellwig
2025-05-07 12:04 ` [PATCH 10/19] gfs2: use bdev_rw_virt in gfs2_read_super Christoph Hellwig
2025-05-07 12:04 ` [PATCH 11/19] zonefs: use bdev_rw_virt in zonefs_read_super Christoph Hellwig
2025-05-07 12:04 ` [PATCH 12/19] PM: hibernate: split and simplify hib_submit_io Christoph Hellwig
2025-05-07 12:04 ` [PATCH 13/19] dm-bufio: use bio_add_virt_nofail Christoph Hellwig
2025-05-07 12:04 ` [PATCH 14/19] dm-integrity: " Christoph Hellwig
2025-05-07 12:04 ` [PATCH 15/19] xfs: simplify xfs_buf_submit_bio Christoph Hellwig
2025-05-07 12:04 ` [PATCH 16/19] xfs: simplify xfs_rw_bdev Christoph Hellwig
2025-05-07 12:04 ` [PATCH 17/19] xfs: simplify building the bio in xlog_write_iclog Christoph Hellwig
2025-05-07 12:04 ` [PATCH 18/19] btrfs: use bdev_rw_virt in scrub_one_super Christoph Hellwig
2025-05-07 12:04 ` [PATCH 19/19] hfsplus: use bdev_rw_virt in hfsplus_submit_bio Christoph Hellwig
2025-05-07 14:02 ` add more bio helpers v3 Jens Axboe
-- strict thread matches above, loose matches on Subject: below --
2025-04-30 21:21 add more bio helpers v2 Christoph Hellwig
2025-04-30 21:21 ` [PATCH 02/19] block: add a bdev_rw_virt helper Christoph Hellwig
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=20250507120451.4000627-3-hch@lst.de \
--to=hch@lst.de \
--cc=agruenba@redhat.com \
--cc=axboe@kernel.dk \
--cc=cem@kernel.org \
--cc=clm@fb.com \
--cc=colyli@kernel.org \
--cc=dlemoal@kernel.org \
--cc=dm-devel@lists.linux.dev \
--cc=dsterba@suse.com \
--cc=frank.li@vivo.com \
--cc=gfs2@lists.linux.dev \
--cc=glaubitz@physik.fu-berlin.de \
--cc=hare@suse.de \
--cc=haris.iqbal@ionos.com \
--cc=jinpu.wang@ionos.com \
--cc=johannes.thumshirn@wdc.com \
--cc=josef@toxicpanda.com \
--cc=jth@kernel.org \
--cc=kent.overstreet@linux.dev \
--cc=linux-bcache@vger.kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=mpatocka@redhat.com \
--cc=naohiro.aota@wdc.com \
--cc=pavel@kernel.org \
--cc=rafael@kernel.org \
--cc=slava@dubeyko.com \
--cc=snitzer@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox