* [PATCH 01/19] block: add a bio_add_virt_nofail helper
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 02/19] block: add a bdev_rw_virt helper Christoph Hellwig
` (18 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Hannes Reinecke, Johannes Thumshirn
Add a helper to add a directly mapped kernel virtual address to a
bio so that callers don't have to convert to pages or folios.
For now only the _nofail variant is provided as that is what all the
obvious callers want.
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 | 16 ++++++++++++++++
include/linux/bio.h | 2 ++
2 files changed, 18 insertions(+)
diff --git a/block/bio.c b/block/bio.c
index 1e42aefc7377..bd3d048d0a72 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -991,6 +991,22 @@ void __bio_add_page(struct bio *bio, struct page *page,
}
EXPORT_SYMBOL_GPL(__bio_add_page);
+/**
+ * bio_add_virt_nofail - add data in the direct kernel mapping to a bio
+ * @bio: destination bio
+ * @vaddr: data to add
+ * @len: length of the data to add, may cross pages
+ *
+ * Add the data at @vaddr to @bio. The caller must have ensure a segment
+ * is available for the added data. No merging into an existing segment
+ * will be performed.
+ */
+void bio_add_virt_nofail(struct bio *bio, void *vaddr, unsigned len)
+{
+ __bio_add_page(bio, virt_to_page(vaddr), len, offset_in_page(vaddr));
+}
+EXPORT_SYMBOL_GPL(bio_add_virt_nofail);
+
/**
* bio_add_page - attempt to add page(s) to bio
* @bio: destination bio
diff --git a/include/linux/bio.h b/include/linux/bio.h
index cafc7c215de8..acca7464080c 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -417,6 +417,8 @@ void __bio_add_page(struct bio *bio, struct page *page,
unsigned int len, unsigned int off);
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 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
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 02/19] block: add a bdev_rw_virt helper
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
2025-05-07 14:01 ` Jens Axboe
2025-05-07 12:04 ` [PATCH 03/19] block: add a bio_add_max_vecs helper Christoph Hellwig
` (17 subsequent siblings)
19 siblings, 1 reply; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Hannes Reinecke, Johannes Thumshirn
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
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 02/19] block: add a bdev_rw_virt helper
2025-05-07 12:04 ` [PATCH 02/19] block: add a bdev_rw_virt helper Christoph Hellwig
@ 2025-05-07 14:01 ` Jens Axboe
2025-05-08 12:52 ` Matthew Wilcox
0 siblings, 1 reply; 26+ messages in thread
From: Jens Axboe @ 2025-05-07 14:01 UTC (permalink / raw)
To: Christoph Hellwig
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Hannes Reinecke, Johannes Thumshirn
On 5/7/25 6:04 AM, Christoph Hellwig wrote:
> +/**
> + * 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)
I applied the series, but did notice a lot of these - I know some parts
like to use the 2-tab approach, but I still very much like to line these
up. Just a style note for future patches, let's please have it remain
consistent and not drift towards that.
--
Jens Axboe
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 02/19] block: add a bdev_rw_virt helper
2025-05-07 14:01 ` Jens Axboe
@ 2025-05-08 12:52 ` Matthew Wilcox
2025-05-08 13:10 ` Jens Axboe
2025-05-08 13:23 ` Johannes Thumshirn
0 siblings, 2 replies; 26+ messages in thread
From: Matthew Wilcox @ 2025-05-08 12:52 UTC (permalink / raw)
To: Jens Axboe
Cc: Christoph Hellwig, linux-block, Md. Haris Iqbal, Jack Wang,
Coly Li, Kent Overstreet, Mike Snitzer, Mikulas Patocka,
Chris Mason, Josef Bacik, David Sterba, Andreas Gruenbacher,
Carlos Maiolino, Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Hannes Reinecke, Johannes Thumshirn
On Wed, May 07, 2025 at 08:01:52AM -0600, Jens Axboe wrote:
> On 5/7/25 6:04 AM, Christoph Hellwig wrote:
> > +int bdev_rw_virt(struct block_device *bdev, sector_t sector, void *data,
> > + size_t len, enum req_op op)
>
> I applied the series, but did notice a lot of these - I know some parts
> like to use the 2-tab approach, but I still very much like to line these
> up. Just a style note for future patches, let's please have it remain
> consistent and not drift towards that.
The problem with "line it up" is that if we want to make it return
void or add __must_check to it or ... then we either have to reindent
(and possibly reflow) all trailing lines which makes the patch review
harder than it needs to be. Or the trailing arguments then don't line
up the paren, getting to the situation we don't want.
I can't wait until we're using rust and the argument goes away because
it's just "whatever rustfmt says".
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 02/19] block: add a bdev_rw_virt helper
2025-05-08 12:52 ` Matthew Wilcox
@ 2025-05-08 13:10 ` Jens Axboe
2025-05-08 13:23 ` Johannes Thumshirn
1 sibling, 0 replies; 26+ messages in thread
From: Jens Axboe @ 2025-05-08 13:10 UTC (permalink / raw)
To: Matthew Wilcox
Cc: Christoph Hellwig, linux-block, Md. Haris Iqbal, Jack Wang,
Coly Li, Kent Overstreet, Mike Snitzer, Mikulas Patocka,
Chris Mason, Josef Bacik, David Sterba, Andreas Gruenbacher,
Carlos Maiolino, Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Hannes Reinecke, Johannes Thumshirn
On 5/8/25 6:52 AM, Matthew Wilcox wrote:
> On Wed, May 07, 2025 at 08:01:52AM -0600, Jens Axboe wrote:
>> On 5/7/25 6:04 AM, Christoph Hellwig wrote:
>>> +int bdev_rw_virt(struct block_device *bdev, sector_t sector, void *data,
>>> + size_t len, enum req_op op)
>>
>> I applied the series, but did notice a lot of these - I know some parts
>> like to use the 2-tab approach, but I still very much like to line these
>> up. Just a style note for future patches, let's please have it remain
>> consistent and not drift towards that.
>
> The problem with "line it up" is that if we want to make it return
> void or add __must_check to it or ... then we either have to reindent
> (and possibly reflow) all trailing lines which makes the patch review
> harder than it needs to be. Or the trailing arguments then don't line
> up the paren, getting to the situation we don't want.
Yeah I'm well aware of why people like the 2 tab approach, I just don't
like to look at it aesthetically. And I've been dealing that kind of
reflowing for decades, never been a big deal.
> I can't wait until we're using rust and the argument goes away because
> it's just "whatever rustfmt says".
Heh one can hope, but I suspect hoping for a generic style for the whole
kernel across sub-systems is a tad naive ;-)
--
Jens Axboe
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 02/19] block: add a bdev_rw_virt helper
2025-05-08 12:52 ` Matthew Wilcox
2025-05-08 13:10 ` Jens Axboe
@ 2025-05-08 13:23 ` Johannes Thumshirn
1 sibling, 0 replies; 26+ messages in thread
From: Johannes Thumshirn @ 2025-05-08 13:23 UTC (permalink / raw)
To: Matthew Wilcox, Jens Axboe
Cc: hch, linux-block@vger.kernel.org, Md. Haris Iqbal, Jack Wang,
Coly Li, Kent Overstreet, Mike Snitzer, Mikulas Patocka,
Chris Mason, Josef Bacik, David Sterba, Andreas Gruenbacher,
Carlos Maiolino, Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, 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
On 08.05.25 14:53, Matthew Wilcox wrote:
> I can't wait until we're using rust and the argument goes away because
> it's just "whatever rustfmt says".
git clang-format?
/me hides
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 03/19] block: add a bio_add_max_vecs helper
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 ` [PATCH 02/19] block: add a bdev_rw_virt helper Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 04/19] block: add a bio_add_vmalloc helpers Christoph Hellwig
` (16 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Add a helper to check how many bio_vecs are needed to add a kernel
virtual address range to a bio, accounting for the always contiguous
direct mapping and vmalloc mappings that usually need a bio_vec
per page sized chunk.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
include/linux/bio.h | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/include/linux/bio.h b/include/linux/bio.h
index ad54e6af20dc..128b1c6ca648 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -418,6 +418,21 @@ 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);
+/**
+ * bio_add_max_vecs - number of bio_vecs needed to add data to a bio
+ * @kaddr: kernel virtual address to add
+ * @len: length in bytes to add
+ *
+ * Calculate how many bio_vecs need to be allocated to add the kernel virtual
+ * address range in [@kaddr:@len] in the worse case.
+ */
+static inline unsigned int bio_add_max_vecs(void *kaddr, unsigned int len)
+{
+ if (is_vmalloc_addr(kaddr))
+ return DIV_ROUND_UP(offset_in_page(kaddr) + len, PAGE_SIZE);
+ return 1;
+}
+
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);
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 04/19] block: add a bio_add_vmalloc helpers
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (2 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 03/19] block: add a bio_add_max_vecs helper Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 05/19] block: remove the q argument from blk_rq_map_kern Christoph Hellwig
` (15 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Add a helper to add a vmalloc region to a bio, abstracting away the
vmalloc addresses from the underlying pages and another one wrapping
it for the simple case where all data fits into a single bio.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
block/bio.c | 55 +++++++++++++++++++++++++++++++++++++++++++++
include/linux/bio.h | 3 +++
2 files changed, 58 insertions(+)
diff --git a/block/bio.c b/block/bio.c
index 26782ff85dbf..988f5de3c02c 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1076,6 +1076,61 @@ bool bio_add_folio(struct bio *bio, struct folio *folio, size_t len,
}
EXPORT_SYMBOL(bio_add_folio);
+/**
+ * bio_add_vmalloc_chunk - add a vmalloc chunk to a bio
+ * @bio: destination bio
+ * @vaddr: vmalloc address to add
+ * @len: total length in bytes of the data to add
+ *
+ * Add data starting at @vaddr to @bio and return how many bytes were added.
+ * This may be less than the amount originally asked. Returns 0 if no data
+ * could be added to @bio.
+ *
+ * This helper calls flush_kernel_vmap_range() for the range added. For reads
+ * the caller still needs to manually call invalidate_kernel_vmap_range() in
+ * the completion handler.
+ */
+unsigned int bio_add_vmalloc_chunk(struct bio *bio, void *vaddr, unsigned len)
+{
+ unsigned int offset = offset_in_page(vaddr);
+
+ len = min(len, PAGE_SIZE - offset);
+ if (bio_add_page(bio, vmalloc_to_page(vaddr), len, offset) < len)
+ return 0;
+ if (op_is_write(bio_op(bio)))
+ flush_kernel_vmap_range(vaddr, len);
+ return len;
+}
+EXPORT_SYMBOL_GPL(bio_add_vmalloc_chunk);
+
+/**
+ * bio_add_vmalloc - add a vmalloc region to a bio
+ * @bio: destination bio
+ * @vaddr: vmalloc address to add
+ * @len: total length in bytes of the data to add
+ *
+ * Add data starting at @vaddr to @bio. Return %true on success or %false if
+ * @bio does not have enough space for the payload.
+ *
+ * This helper calls flush_kernel_vmap_range() for the range added. For reads
+ * the caller still needs to manually call invalidate_kernel_vmap_range() in
+ * the completion handler.
+ */
+bool bio_add_vmalloc(struct bio *bio, void *vaddr, unsigned int len)
+{
+ do {
+ unsigned int added = bio_add_vmalloc_chunk(bio, vaddr, len);
+
+ if (!added)
+ return false;
+ vaddr += added;
+ len -= added;
+ } while (len);
+
+ return true;
+}
+EXPORT_SYMBOL_GPL(bio_add_vmalloc);
+
void __bio_release_pages(struct bio *bio, bool mark_dirty)
{
struct folio_iter fi;
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 128b1c6ca648..5d880903bcc5 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -433,6 +433,9 @@ static inline unsigned int bio_add_max_vecs(void *kaddr, unsigned int len)
return 1;
}
+unsigned int bio_add_vmalloc_chunk(struct bio *bio, void *vaddr, unsigned len);
+bool bio_add_vmalloc(struct bio *bio, void *vaddr, unsigned int 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);
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 05/19] block: remove the q argument from blk_rq_map_kern
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (3 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 04/19] block: add a bio_add_vmalloc helpers Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 06/19] block: pass the operation to bio_{map,copy}_kern Christoph Hellwig
` (14 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Hannes Reinecke, Johannes Thumshirn
Remove the q argument from blk_rq_map_kern and the internal helpers
called by it as the queue can trivially be derived from the request.
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/blk-map.c | 22 +++++++++-------------
drivers/block/pktcdvd.c | 2 +-
drivers/block/ublk_drv.c | 3 +--
drivers/block/virtio_blk.c | 4 ++--
drivers/nvme/host/core.c | 2 +-
drivers/scsi/scsi_ioctl.c | 2 +-
drivers/scsi/scsi_lib.c | 3 +--
include/linux/blk-mq.h | 4 ++--
8 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/block/blk-map.c b/block/blk-map.c
index cadbf11b50a3..9002cfe855b9 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -319,7 +319,6 @@ static void bio_map_kern_endio(struct bio *bio)
/**
* bio_map_kern - map kernel address into bio
- * @q: the struct request_queue for the bio
* @data: pointer to buffer to map
* @len: length in bytes
* @gfp_mask: allocation flags for bio allocation
@@ -327,8 +326,7 @@ static void bio_map_kern_endio(struct bio *bio)
* Map the kernel address into a bio suitable for io to a block
* device. Returns an error pointer in case of error.
*/
-static struct bio *bio_map_kern(struct request_queue *q, void *data,
- unsigned int len, gfp_t gfp_mask)
+static struct bio *bio_map_kern(void *data, unsigned int len, gfp_t gfp_mask)
{
unsigned long kaddr = (unsigned long)data;
unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
@@ -402,7 +400,6 @@ static void bio_copy_kern_endio_read(struct bio *bio)
/**
* bio_copy_kern - copy kernel address into bio
- * @q: the struct request_queue for the bio
* @data: pointer to buffer to copy
* @len: length in bytes
* @gfp_mask: allocation flags for bio and page allocation
@@ -411,8 +408,8 @@ static void bio_copy_kern_endio_read(struct bio *bio)
* copy the kernel address into a bio suitable for io to a block
* device. Returns an error pointer in case of error.
*/
-static struct bio *bio_copy_kern(struct request_queue *q, void *data,
- unsigned int len, gfp_t gfp_mask, int reading)
+static struct bio *bio_copy_kern(void *data, unsigned int len, gfp_t gfp_mask,
+ int reading)
{
unsigned long kaddr = (unsigned long)data;
unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
@@ -687,7 +684,6 @@ EXPORT_SYMBOL(blk_rq_unmap_user);
/**
* blk_rq_map_kern - map kernel data to a request, for passthrough requests
- * @q: request queue where request should be inserted
* @rq: request to fill
* @kbuf: the kernel buffer
* @len: length of user data
@@ -698,23 +694,23 @@ EXPORT_SYMBOL(blk_rq_unmap_user);
* buffer is used. Can be called multiple times to append multiple
* buffers.
*/
-int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,
- unsigned int len, gfp_t gfp_mask)
+int blk_rq_map_kern(struct request *rq, void *kbuf, unsigned int len,
+ gfp_t gfp_mask)
{
int reading = rq_data_dir(rq) == READ;
unsigned long addr = (unsigned long) kbuf;
struct bio *bio;
int ret;
- if (len > (queue_max_hw_sectors(q) << 9))
+ if (len > (queue_max_hw_sectors(rq->q) << SECTOR_SHIFT))
return -EINVAL;
if (!len || !kbuf)
return -EINVAL;
- if (!blk_rq_aligned(q, addr, len) || object_is_on_stack(kbuf))
- bio = bio_copy_kern(q, kbuf, len, gfp_mask, reading);
+ if (!blk_rq_aligned(rq->q, addr, len) || object_is_on_stack(kbuf))
+ bio = bio_copy_kern(kbuf, len, gfp_mask, reading);
else
- bio = bio_map_kern(q, kbuf, len, gfp_mask);
+ bio = bio_map_kern(kbuf, len, gfp_mask);
if (IS_ERR(bio))
return PTR_ERR(bio);
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index 65b96c083b3c..d5cc7bd2875c 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -725,7 +725,7 @@ static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *
scmd = blk_mq_rq_to_pdu(rq);
if (cgc->buflen) {
- ret = blk_rq_map_kern(q, rq, cgc->buffer, cgc->buflen,
+ ret = blk_rq_map_kern(rq, cgc->buffer, cgc->buflen,
GFP_NOIO);
if (ret)
goto out;
diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
index 3650bab40dd0..cb612151e9a1 100644
--- a/drivers/block/ublk_drv.c
+++ b/drivers/block/ublk_drv.c
@@ -368,8 +368,7 @@ static int ublk_report_zones(struct gendisk *disk, sector_t sector,
if (ret)
goto free_req;
- ret = blk_rq_map_kern(disk->queue, req, buffer, buffer_length,
- GFP_KERNEL);
+ ret = blk_rq_map_kern(req, buffer, buffer_length, GFP_KERNEL);
if (ret)
goto erase_desc;
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 7cffea01d868..30bca8cb7106 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -571,7 +571,7 @@ static int virtblk_submit_zone_report(struct virtio_blk *vblk,
vbr->out_hdr.type = cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_ZONE_REPORT);
vbr->out_hdr.sector = cpu_to_virtio64(vblk->vdev, sector);
- err = blk_rq_map_kern(q, req, report_buf, report_len, GFP_KERNEL);
+ err = blk_rq_map_kern(req, report_buf, report_len, GFP_KERNEL);
if (err)
goto out;
@@ -817,7 +817,7 @@ static int virtblk_get_id(struct gendisk *disk, char *id_str)
vbr->out_hdr.type = cpu_to_virtio32(vblk->vdev, VIRTIO_BLK_T_GET_ID);
vbr->out_hdr.sector = 0;
- err = blk_rq_map_kern(q, req, id_str, VIRTIO_BLK_ID_BYTES, GFP_KERNEL);
+ err = blk_rq_map_kern(req, id_str, VIRTIO_BLK_ID_BYTES, GFP_KERNEL);
if (err)
goto out;
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index a8444d1e8398..af871d268fcb 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1174,7 +1174,7 @@ int __nvme_submit_sync_cmd(struct request_queue *q, struct nvme_command *cmd,
req->cmd_flags &= ~REQ_FAILFAST_DRIVER;
if (buffer && bufflen) {
- ret = blk_rq_map_kern(q, req, buffer, bufflen, GFP_KERNEL);
+ ret = blk_rq_map_kern(req, buffer, bufflen, GFP_KERNEL);
if (ret)
goto out;
}
diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c
index 2fa45556e1ea..0ddc95bafc71 100644
--- a/drivers/scsi/scsi_ioctl.c
+++ b/drivers/scsi/scsi_ioctl.c
@@ -601,7 +601,7 @@ static int sg_scsi_ioctl(struct request_queue *q, bool open_for_write,
}
if (bytes) {
- err = blk_rq_map_kern(q, rq, buffer, bytes, GFP_NOIO);
+ err = blk_rq_map_kern(rq, buffer, bytes, GFP_NOIO);
if (err)
goto error;
}
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 39320dccbdd5..6f006cca0b5e 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -313,8 +313,7 @@ int scsi_execute_cmd(struct scsi_device *sdev, const unsigned char *cmd,
return PTR_ERR(req);
if (bufflen) {
- ret = blk_rq_map_kern(sdev->request_queue, req,
- buffer, bufflen, GFP_NOIO);
+ ret = blk_rq_map_kern(req, buffer, bufflen, GFP_NOIO);
if (ret)
goto out;
}
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index ef84d53095a6..fb87a2fe1c44 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -1034,8 +1034,8 @@ int blk_rq_map_user_io(struct request *, struct rq_map_data *,
int blk_rq_map_user_iov(struct request_queue *, struct request *,
struct rq_map_data *, const struct iov_iter *, gfp_t);
int blk_rq_unmap_user(struct bio *);
-int blk_rq_map_kern(struct request_queue *, struct request *, void *,
- unsigned int, gfp_t);
+int blk_rq_map_kern(struct request *rq, void *kbuf, unsigned int len,
+ gfp_t gfp);
int blk_rq_append_bio(struct request *rq, struct bio *bio);
void blk_execute_rq_nowait(struct request *rq, bool at_head);
blk_status_t blk_execute_rq(struct request *rq, bool at_head);
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 06/19] block: pass the operation to bio_{map,copy}_kern
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (4 preceding siblings ...)
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 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 07/19] block: simplify bio_map_kern Christoph Hellwig
` (13 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Hannes Reinecke, Johannes Thumshirn
That way the bio can be allocated with the right operation already
set and there is no need to pass the separated 'reading' argument.
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/blk-map.c | 30 ++++++++++++++----------------
1 file changed, 14 insertions(+), 16 deletions(-)
diff --git a/block/blk-map.c b/block/blk-map.c
index 9002cfe855b9..6f0bfe66b226 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -321,12 +321,14 @@ static void bio_map_kern_endio(struct bio *bio)
* bio_map_kern - map kernel address into bio
* @data: pointer to buffer to map
* @len: length in bytes
+ * @op: bio/request operation
* @gfp_mask: allocation flags for bio allocation
*
* Map the kernel address into a bio suitable for io to a block
* device. Returns an error pointer in case of error.
*/
-static struct bio *bio_map_kern(void *data, unsigned int len, gfp_t gfp_mask)
+static struct bio *bio_map_kern(void *data, unsigned int len,
+ enum req_op op, gfp_t gfp_mask)
{
unsigned long kaddr = (unsigned long)data;
unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
@@ -340,7 +342,7 @@ static struct bio *bio_map_kern(void *data, unsigned int len, gfp_t gfp_mask)
bio = bio_kmalloc(nr_pages, gfp_mask);
if (!bio)
return ERR_PTR(-ENOMEM);
- bio_init(bio, NULL, bio->bi_inline_vecs, nr_pages, 0);
+ bio_init(bio, NULL, bio->bi_inline_vecs, nr_pages, op);
if (is_vmalloc) {
flush_kernel_vmap_range(data, len);
@@ -402,14 +404,14 @@ static void bio_copy_kern_endio_read(struct bio *bio)
* bio_copy_kern - copy kernel address into bio
* @data: pointer to buffer to copy
* @len: length in bytes
+ * @op: bio/request operation
* @gfp_mask: allocation flags for bio and page allocation
- * @reading: data direction is READ
*
* copy the kernel address into a bio suitable for io to a block
* device. Returns an error pointer in case of error.
*/
-static struct bio *bio_copy_kern(void *data, unsigned int len, gfp_t gfp_mask,
- int reading)
+static struct bio *bio_copy_kern(void *data, unsigned int len, enum req_op op,
+ gfp_t gfp_mask)
{
unsigned long kaddr = (unsigned long)data;
unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
@@ -428,7 +430,7 @@ static struct bio *bio_copy_kern(void *data, unsigned int len, gfp_t gfp_mask,
bio = bio_kmalloc(nr_pages, gfp_mask);
if (!bio)
return ERR_PTR(-ENOMEM);
- bio_init(bio, NULL, bio->bi_inline_vecs, nr_pages, 0);
+ bio_init(bio, NULL, bio->bi_inline_vecs, nr_pages, op);
while (len) {
struct page *page;
@@ -441,7 +443,7 @@ static struct bio *bio_copy_kern(void *data, unsigned int len, gfp_t gfp_mask,
if (!page)
goto cleanup;
- if (!reading)
+ if (op_is_write(op))
memcpy(page_address(page), p, bytes);
if (bio_add_page(bio, page, bytes, 0) < bytes)
@@ -451,11 +453,11 @@ static struct bio *bio_copy_kern(void *data, unsigned int len, gfp_t gfp_mask,
p += bytes;
}
- if (reading) {
+ if (op_is_write(op)) {
+ bio->bi_end_io = bio_copy_kern_endio;
+ } else {
bio->bi_end_io = bio_copy_kern_endio_read;
bio->bi_private = data;
- } else {
- bio->bi_end_io = bio_copy_kern_endio;
}
return bio;
@@ -697,7 +699,6 @@ EXPORT_SYMBOL(blk_rq_unmap_user);
int blk_rq_map_kern(struct request *rq, void *kbuf, unsigned int len,
gfp_t gfp_mask)
{
- int reading = rq_data_dir(rq) == READ;
unsigned long addr = (unsigned long) kbuf;
struct bio *bio;
int ret;
@@ -708,16 +709,13 @@ int blk_rq_map_kern(struct request *rq, void *kbuf, unsigned int len,
return -EINVAL;
if (!blk_rq_aligned(rq->q, addr, len) || object_is_on_stack(kbuf))
- bio = bio_copy_kern(kbuf, len, gfp_mask, reading);
+ bio = bio_copy_kern(kbuf, len, req_op(rq), gfp_mask);
else
- bio = bio_map_kern(kbuf, len, gfp_mask);
+ bio = bio_map_kern(kbuf, len, req_op(rq), gfp_mask);
if (IS_ERR(bio))
return PTR_ERR(bio);
- bio->bi_opf &= ~REQ_OP_MASK;
- bio->bi_opf |= req_op(rq);
-
ret = blk_rq_append_bio(rq, bio);
if (unlikely(ret)) {
bio_uninit(bio);
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 07/19] block: simplify bio_map_kern
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (5 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 06/19] block: pass the operation to bio_{map,copy}_kern Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 08/19] bcache: use bio_add_virt_nofail Christoph Hellwig
` (12 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Rewrite bio_map_kern using the new bio_add_* helpers and drop the
kerneldoc comment that is superfluous for an internal helper.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
block/blk-map.c | 56 ++++++++-----------------------------------------
1 file changed, 9 insertions(+), 47 deletions(-)
diff --git a/block/blk-map.c b/block/blk-map.c
index 6f0bfe66b226..23e5d5ebe59e 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -317,64 +317,26 @@ static void bio_map_kern_endio(struct bio *bio)
kfree(bio);
}
-/**
- * bio_map_kern - map kernel address into bio
- * @data: pointer to buffer to map
- * @len: length in bytes
- * @op: bio/request operation
- * @gfp_mask: allocation flags for bio allocation
- *
- * Map the kernel address into a bio suitable for io to a block
- * device. Returns an error pointer in case of error.
- */
-static struct bio *bio_map_kern(void *data, unsigned int len,
- enum req_op op, gfp_t gfp_mask)
+static struct bio *bio_map_kern(void *data, unsigned int len, enum req_op op,
+ gfp_t gfp_mask)
{
- unsigned long kaddr = (unsigned long)data;
- unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
- unsigned long start = kaddr >> PAGE_SHIFT;
- const int nr_pages = end - start;
- bool is_vmalloc = is_vmalloc_addr(data);
- struct page *page;
- int offset, i;
+ unsigned int nr_vecs = bio_add_max_vecs(data, len);
struct bio *bio;
- bio = bio_kmalloc(nr_pages, gfp_mask);
+ bio = bio_kmalloc(nr_vecs, gfp_mask);
if (!bio)
return ERR_PTR(-ENOMEM);
- bio_init(bio, NULL, bio->bi_inline_vecs, nr_pages, op);
-
- if (is_vmalloc) {
- flush_kernel_vmap_range(data, len);
+ bio_init(bio, NULL, bio->bi_inline_vecs, nr_vecs, op);
+ if (is_vmalloc_addr(data)) {
bio->bi_private = data;
- }
-
- offset = offset_in_page(kaddr);
- for (i = 0; i < nr_pages; i++) {
- unsigned int bytes = PAGE_SIZE - offset;
-
- if (len <= 0)
- break;
-
- if (bytes > len)
- bytes = len;
-
- if (!is_vmalloc)
- page = virt_to_page(data);
- else
- page = vmalloc_to_page(data);
- if (bio_add_page(bio, page, bytes, offset) < bytes) {
- /* we don't support partial mappings */
+ if (!bio_add_vmalloc(bio, data, len)) {
bio_uninit(bio);
kfree(bio);
return ERR_PTR(-EINVAL);
}
-
- data += bytes;
- len -= bytes;
- offset = 0;
+ } else {
+ bio_add_virt_nofail(bio, data, len);
}
-
bio->bi_end_io = bio_map_kern_endio;
return bio;
}
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 08/19] bcache: use bio_add_virt_nofail
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (6 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 07/19] block: simplify bio_map_kern Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 09/19] rnbd-srv: " Christoph Hellwig
` (11 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Convert the __bio_add_page(..., virt_to_page(), ...) pattern to the
bio_add_virt_nofail helper implementing it.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Coly Li <colyli@kernel.org>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
drivers/md/bcache/super.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index 813b38aec3e4..c40db9c161c1 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -293,8 +293,7 @@ static void __write_super(struct cache_sb *sb, struct cache_sb_disk *out,
bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_META;
bio->bi_iter.bi_sector = SB_SECTOR;
- __bio_add_page(bio, virt_to_page(out), SB_SIZE,
- offset_in_page(out));
+ bio_add_virt_nofail(bio, out, SB_SIZE);
out->offset = cpu_to_le64(sb->offset);
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 09/19] rnbd-srv: use bio_add_virt_nofail
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (7 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 08/19] bcache: use bio_add_virt_nofail Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 10/19] gfs2: use bdev_rw_virt in gfs2_read_super Christoph Hellwig
` (10 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Use the bio_add_virt_nofail to add a single kernel virtual address
to a bio as that can't fail.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Jack Wang <jinpu.wang@ionos.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
drivers/block/rnbd/rnbd-srv.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c
index 2ee6e9bd4e28..2df8941a6b14 100644
--- a/drivers/block/rnbd/rnbd-srv.c
+++ b/drivers/block/rnbd/rnbd-srv.c
@@ -147,12 +147,7 @@ static int process_rdma(struct rnbd_srv_session *srv_sess,
bio = bio_alloc(file_bdev(sess_dev->bdev_file), 1,
rnbd_to_bio_flags(le32_to_cpu(msg->rw)), GFP_KERNEL);
- if (bio_add_page(bio, virt_to_page(data), datalen,
- offset_in_page(data)) != datalen) {
- rnbd_srv_err_rl(sess_dev, "Failed to map data to bio\n");
- err = -EINVAL;
- goto bio_put;
- }
+ bio_add_virt_nofail(bio, data, datalen);
bio->bi_opf = rnbd_to_bio_flags(le32_to_cpu(msg->rw));
if (bio_has_data(bio) &&
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 10/19] gfs2: use bdev_rw_virt in gfs2_read_super
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (8 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 09/19] rnbd-srv: " Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 11/19] zonefs: use bdev_rw_virt in zonefs_read_super Christoph Hellwig
` (9 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm
Switch gfs2_read_super to allocate the superblock buffer using kmalloc
which falls back to the page allocator for PAGE_SIZE allocation but
gives us a kernel virtual address and then use bdev_rw_virt to perform
the synchronous read into it.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Andreas Gruenbacher <agruenba@redhat.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
---
fs/gfs2/ops_fstype.c | 24 +++++++++---------------
1 file changed, 9 insertions(+), 15 deletions(-)
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index e83d293c3614..7c1014ba7ac7 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -226,28 +226,22 @@ static void gfs2_sb_in(struct gfs2_sbd *sdp, const struct gfs2_sb *str)
static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent)
{
- struct super_block *sb = sdp->sd_vfs;
- struct page *page;
- struct bio_vec bvec;
- struct bio bio;
+ struct gfs2_sb *sb;
int err;
- page = alloc_page(GFP_KERNEL);
- if (unlikely(!page))
+ sb = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (unlikely(!sb))
return -ENOMEM;
-
- bio_init(&bio, sb->s_bdev, &bvec, 1, REQ_OP_READ | REQ_META);
- bio.bi_iter.bi_sector = sector * (sb->s_blocksize >> 9);
- __bio_add_page(&bio, page, PAGE_SIZE, 0);
-
- err = submit_bio_wait(&bio);
+ err = bdev_rw_virt(sdp->sd_vfs->s_bdev,
+ sector * (sdp->sd_vfs->s_blocksize >> 9), sb, PAGE_SIZE,
+ REQ_OP_READ | REQ_META);
if (err) {
pr_warn("error %d reading superblock\n", err);
- __free_page(page);
+ kfree(sb);
return err;
}
- gfs2_sb_in(sdp, page_address(page));
- __free_page(page);
+ gfs2_sb_in(sdp, sb);
+ kfree(sb);
return gfs2_check_sb(sdp, silent);
}
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 11/19] zonefs: use bdev_rw_virt in zonefs_read_super
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (9 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 10/19] gfs2: use bdev_rw_virt in gfs2_read_super Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 12/19] PM: hibernate: split and simplify hib_submit_io Christoph Hellwig
` (8 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Switch zonefs_read_super to allocate the superblock buffer using kmalloc
which falls back to the page allocator for PAGE_SIZE allocation but
gives us a kernel virtual address and then use bdev_rw_virt to perform
the synchronous read into it.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
fs/zonefs/super.c | 34 ++++++++++++----------------------
1 file changed, 12 insertions(+), 22 deletions(-)
diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index faf1eb87895d..d165eb979f21 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -1111,28 +1111,19 @@ static int zonefs_read_super(struct super_block *sb)
struct zonefs_sb_info *sbi = ZONEFS_SB(sb);
struct zonefs_super *super;
u32 crc, stored_crc;
- struct page *page;
- struct bio_vec bio_vec;
- struct bio bio;
int ret;
- page = alloc_page(GFP_KERNEL);
- if (!page)
+ super = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!super)
return -ENOMEM;
- bio_init(&bio, sb->s_bdev, &bio_vec, 1, REQ_OP_READ);
- bio.bi_iter.bi_sector = 0;
- __bio_add_page(&bio, page, PAGE_SIZE, 0);
-
- ret = submit_bio_wait(&bio);
+ ret = bdev_rw_virt(sb->s_bdev, 0, super, PAGE_SIZE, REQ_OP_READ);
if (ret)
- goto free_page;
-
- super = page_address(page);
+ goto free_super;
ret = -EINVAL;
if (le32_to_cpu(super->s_magic) != ZONEFS_MAGIC)
- goto free_page;
+ goto free_super;
stored_crc = le32_to_cpu(super->s_crc);
super->s_crc = 0;
@@ -1140,14 +1131,14 @@ static int zonefs_read_super(struct super_block *sb)
if (crc != stored_crc) {
zonefs_err(sb, "Invalid checksum (Expected 0x%08x, got 0x%08x)",
crc, stored_crc);
- goto free_page;
+ goto free_super;
}
sbi->s_features = le64_to_cpu(super->s_features);
if (sbi->s_features & ~ZONEFS_F_DEFINED_FEATURES) {
zonefs_err(sb, "Unknown features set 0x%llx\n",
sbi->s_features);
- goto free_page;
+ goto free_super;
}
if (sbi->s_features & ZONEFS_F_UID) {
@@ -1155,7 +1146,7 @@ static int zonefs_read_super(struct super_block *sb)
le32_to_cpu(super->s_uid));
if (!uid_valid(sbi->s_uid)) {
zonefs_err(sb, "Invalid UID feature\n");
- goto free_page;
+ goto free_super;
}
}
@@ -1164,7 +1155,7 @@ static int zonefs_read_super(struct super_block *sb)
le32_to_cpu(super->s_gid));
if (!gid_valid(sbi->s_gid)) {
zonefs_err(sb, "Invalid GID feature\n");
- goto free_page;
+ goto free_super;
}
}
@@ -1173,15 +1164,14 @@ static int zonefs_read_super(struct super_block *sb)
if (memchr_inv(super->s_reserved, 0, sizeof(super->s_reserved))) {
zonefs_err(sb, "Reserved area is being used\n");
- goto free_page;
+ goto free_super;
}
import_uuid(&sbi->s_uuid, super->s_uuid);
ret = 0;
-free_page:
- __free_page(page);
-
+free_super:
+ kfree(super);
return ret;
}
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 12/19] PM: hibernate: split and simplify hib_submit_io
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (10 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 11/19] zonefs: use bdev_rw_virt in zonefs_read_super Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 13/19] dm-bufio: use bio_add_virt_nofail Christoph Hellwig
` (7 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm
Split hib_submit_io into a sync and async version. The sync version is
a small wrapper around bdev_rw_virt which implements all the logic to
add a kernel direct mapping range to a bio and synchronously submits it,
while the async version is slightly simplified using the
bio_add_virt_nofail for adding the single range.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Rafael J. Wysocki <rafael@kernel.org>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
---
kernel/power/swap.c | 103 +++++++++++++++++++-------------------------
1 file changed, 45 insertions(+), 58 deletions(-)
diff --git a/kernel/power/swap.c b/kernel/power/swap.c
index 80ff5f933a62..ad13c461b657 100644
--- a/kernel/power/swap.c
+++ b/kernel/power/swap.c
@@ -268,35 +268,26 @@ static void hib_end_io(struct bio *bio)
bio_put(bio);
}
-static int hib_submit_io(blk_opf_t opf, pgoff_t page_off, void *addr,
+static int hib_submit_io_sync(blk_opf_t opf, pgoff_t page_off, void *addr)
+{
+ return bdev_rw_virt(file_bdev(hib_resume_bdev_file),
+ page_off * (PAGE_SIZE >> 9), addr, PAGE_SIZE, opf);
+}
+
+static int hib_submit_io_async(blk_opf_t opf, pgoff_t page_off, void *addr,
struct hib_bio_batch *hb)
{
- struct page *page = virt_to_page(addr);
struct bio *bio;
- int error = 0;
bio = bio_alloc(file_bdev(hib_resume_bdev_file), 1, opf,
GFP_NOIO | __GFP_HIGH);
bio->bi_iter.bi_sector = page_off * (PAGE_SIZE >> 9);
-
- if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
- pr_err("Adding page to bio failed at %llu\n",
- (unsigned long long)bio->bi_iter.bi_sector);
- bio_put(bio);
- return -EFAULT;
- }
-
- if (hb) {
- bio->bi_end_io = hib_end_io;
- bio->bi_private = hb;
- atomic_inc(&hb->count);
- submit_bio(bio);
- } else {
- error = submit_bio_wait(bio);
- bio_put(bio);
- }
-
- return error;
+ bio_add_virt_nofail(bio, addr, PAGE_SIZE);
+ bio->bi_end_io = hib_end_io;
+ bio->bi_private = hb;
+ atomic_inc(&hb->count);
+ submit_bio(bio);
+ return 0;
}
static int hib_wait_io(struct hib_bio_batch *hb)
@@ -316,7 +307,7 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags)
{
int error;
- hib_submit_io(REQ_OP_READ, swsusp_resume_block, swsusp_header, NULL);
+ hib_submit_io_sync(REQ_OP_READ, swsusp_resume_block, swsusp_header);
if (!memcmp("SWAP-SPACE",swsusp_header->sig, 10) ||
!memcmp("SWAPSPACE2",swsusp_header->sig, 10)) {
memcpy(swsusp_header->orig_sig,swsusp_header->sig, 10);
@@ -329,8 +320,8 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags)
swsusp_header->flags = flags;
if (flags & SF_CRC32_MODE)
swsusp_header->crc32 = handle->crc32;
- error = hib_submit_io(REQ_OP_WRITE | REQ_SYNC,
- swsusp_resume_block, swsusp_header, NULL);
+ error = hib_submit_io_sync(REQ_OP_WRITE | REQ_SYNC,
+ swsusp_resume_block, swsusp_header);
} else {
pr_err("Swap header not found!\n");
error = -ENODEV;
@@ -380,36 +371,30 @@ static int swsusp_swap_check(void)
static int write_page(void *buf, sector_t offset, struct hib_bio_batch *hb)
{
+ gfp_t gfp = GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY;
void *src;
int ret;
if (!offset)
return -ENOSPC;
- if (hb) {
- src = (void *)__get_free_page(GFP_NOIO | __GFP_NOWARN |
- __GFP_NORETRY);
- if (src) {
- copy_page(src, buf);
- } else {
- ret = hib_wait_io(hb); /* Free pages */
- if (ret)
- return ret;
- src = (void *)__get_free_page(GFP_NOIO |
- __GFP_NOWARN |
- __GFP_NORETRY);
- if (src) {
- copy_page(src, buf);
- } else {
- WARN_ON_ONCE(1);
- hb = NULL; /* Go synchronous */
- src = buf;
- }
- }
- } else {
- src = buf;
+ if (!hb)
+ goto sync_io;
+
+ src = (void *)__get_free_page(gfp);
+ if (!src) {
+ ret = hib_wait_io(hb); /* Free pages */
+ if (ret)
+ return ret;
+ src = (void *)__get_free_page(gfp);
+ if (WARN_ON_ONCE(!src))
+ goto sync_io;
}
- return hib_submit_io(REQ_OP_WRITE | REQ_SYNC, offset, src, hb);
+
+ copy_page(src, buf);
+ return hib_submit_io_async(REQ_OP_WRITE | REQ_SYNC, offset, src, hb);
+sync_io:
+ return hib_submit_io_sync(REQ_OP_WRITE | REQ_SYNC, offset, buf);
}
static void release_swap_writer(struct swap_map_handle *handle)
@@ -1041,7 +1026,7 @@ static int get_swap_reader(struct swap_map_handle *handle,
return -ENOMEM;
}
- error = hib_submit_io(REQ_OP_READ, offset, tmp->map, NULL);
+ error = hib_submit_io_sync(REQ_OP_READ, offset, tmp->map);
if (error) {
release_swap_reader(handle);
return error;
@@ -1065,7 +1050,10 @@ static int swap_read_page(struct swap_map_handle *handle, void *buf,
offset = handle->cur->entries[handle->k];
if (!offset)
return -EFAULT;
- error = hib_submit_io(REQ_OP_READ, offset, buf, hb);
+ if (hb)
+ error = hib_submit_io_async(REQ_OP_READ, offset, buf, hb);
+ else
+ error = hib_submit_io_sync(REQ_OP_READ, offset, buf);
if (error)
return error;
if (++handle->k >= MAP_PAGE_ENTRIES) {
@@ -1590,8 +1578,8 @@ int swsusp_check(bool exclusive)
BLK_OPEN_READ, holder, NULL);
if (!IS_ERR(hib_resume_bdev_file)) {
clear_page(swsusp_header);
- error = hib_submit_io(REQ_OP_READ, swsusp_resume_block,
- swsusp_header, NULL);
+ error = hib_submit_io_sync(REQ_OP_READ, swsusp_resume_block,
+ swsusp_header);
if (error)
goto put;
@@ -1599,9 +1587,9 @@ int swsusp_check(bool exclusive)
memcpy(swsusp_header->sig, swsusp_header->orig_sig, 10);
swsusp_header_flags = swsusp_header->flags;
/* Reset swap signature now */
- error = hib_submit_io(REQ_OP_WRITE | REQ_SYNC,
+ error = hib_submit_io_sync(REQ_OP_WRITE | REQ_SYNC,
swsusp_resume_block,
- swsusp_header, NULL);
+ swsusp_header);
} else {
error = -EINVAL;
}
@@ -1650,13 +1638,12 @@ int swsusp_unmark(void)
{
int error;
- hib_submit_io(REQ_OP_READ, swsusp_resume_block,
- swsusp_header, NULL);
+ hib_submit_io_sync(REQ_OP_READ, swsusp_resume_block, swsusp_header);
if (!memcmp(HIBERNATE_SIG,swsusp_header->sig, 10)) {
memcpy(swsusp_header->sig,swsusp_header->orig_sig, 10);
- error = hib_submit_io(REQ_OP_WRITE | REQ_SYNC,
+ error = hib_submit_io_sync(REQ_OP_WRITE | REQ_SYNC,
swsusp_resume_block,
- swsusp_header, NULL);
+ swsusp_header);
} else {
pr_err("Cannot find swsusp signature!\n");
error = -ENODEV;
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 13/19] dm-bufio: use bio_add_virt_nofail
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (11 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 12/19] PM: hibernate: split and simplify hib_submit_io Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 14/19] dm-integrity: " Christoph Hellwig
` (6 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Convert the __bio_add_page(..., virt_to_page(), ...) pattern to the
bio_add_virt_nofail helper implementing it.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Mikulas Patocka <mpatocka@redhat.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
drivers/md/dm-bufio.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
index 9c8ed65cd87e..e82cd5dc83ce 100644
--- a/drivers/md/dm-bufio.c
+++ b/drivers/md/dm-bufio.c
@@ -1362,7 +1362,7 @@ static void use_bio(struct dm_buffer *b, enum req_op op, sector_t sector,
ptr = (char *)b->data + offset;
len = n_sectors << SECTOR_SHIFT;
- __bio_add_page(bio, virt_to_page(ptr), len, offset_in_page(ptr));
+ bio_add_virt_nofail(bio, ptr, len);
submit_bio(bio);
}
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 14/19] dm-integrity: use bio_add_virt_nofail
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (12 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 13/19] dm-bufio: use bio_add_virt_nofail Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 15/19] xfs: simplify xfs_buf_submit_bio Christoph Hellwig
` (5 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Convert the __bio_add_page(..., virt_to_page(), ...) pattern to the
bio_add_virt_nofail helper implementing it, and do the same for the
similar pattern using bio_add_page for adding the first segment after
a bio allocation as that can't fail either.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Mikulas Patocka <mpatocka@redhat.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
drivers/md/dm-integrity.c | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
index 2a283feb3319..9dca9dbabfaa 100644
--- a/drivers/md/dm-integrity.c
+++ b/drivers/md/dm-integrity.c
@@ -2557,14 +2557,8 @@ static void dm_integrity_inline_recheck(struct work_struct *w)
char *mem;
outgoing_bio = bio_alloc_bioset(ic->dev->bdev, 1, REQ_OP_READ, GFP_NOIO, &ic->recheck_bios);
-
- r = bio_add_page(outgoing_bio, virt_to_page(outgoing_data), ic->sectors_per_block << SECTOR_SHIFT, 0);
- if (unlikely(r != (ic->sectors_per_block << SECTOR_SHIFT))) {
- bio_put(outgoing_bio);
- bio->bi_status = BLK_STS_RESOURCE;
- bio_endio(bio);
- return;
- }
+ bio_add_virt_nofail(outgoing_bio, outgoing_data,
+ ic->sectors_per_block << SECTOR_SHIFT);
bip = bio_integrity_alloc(outgoing_bio, GFP_NOIO, 1);
if (IS_ERR(bip)) {
@@ -3211,7 +3205,8 @@ static void integrity_recalc_inline(struct work_struct *w)
bio = bio_alloc_bioset(ic->dev->bdev, 1, REQ_OP_READ, GFP_NOIO, &ic->recalc_bios);
bio->bi_iter.bi_sector = ic->start + SB_SECTORS + range.logical_sector;
- __bio_add_page(bio, virt_to_page(recalc_buffer), range.n_sectors << SECTOR_SHIFT, offset_in_page(recalc_buffer));
+ bio_add_virt_nofail(bio, recalc_buffer,
+ range.n_sectors << SECTOR_SHIFT);
r = submit_bio_wait(bio);
bio_put(bio);
if (unlikely(r)) {
@@ -3228,7 +3223,8 @@ static void integrity_recalc_inline(struct work_struct *w)
bio = bio_alloc_bioset(ic->dev->bdev, 1, REQ_OP_WRITE, GFP_NOIO, &ic->recalc_bios);
bio->bi_iter.bi_sector = ic->start + SB_SECTORS + range.logical_sector;
- __bio_add_page(bio, virt_to_page(recalc_buffer), range.n_sectors << SECTOR_SHIFT, offset_in_page(recalc_buffer));
+ bio_add_virt_nofail(bio, recalc_buffer,
+ range.n_sectors << SECTOR_SHIFT);
bip = bio_integrity_alloc(bio, GFP_NOIO, 1);
if (unlikely(IS_ERR(bip))) {
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 15/19] xfs: simplify xfs_buf_submit_bio
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (13 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 14/19] dm-integrity: " Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 16/19] xfs: simplify xfs_rw_bdev Christoph Hellwig
` (4 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm
Convert the __bio_add_page(..., virt_to_page(), ...) pattern to the
bio_add_virt_nofail helper implementing it and use bio_add_vmalloc
to insulate xfs from the details of adding vmalloc memory to a bio.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
---
fs/xfs/xfs_buf.c | 43 ++++++++-----------------------------------
1 file changed, 8 insertions(+), 35 deletions(-)
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 1a2b3f06fa71..f2d00774a84f 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1333,45 +1333,18 @@ static void
xfs_buf_submit_bio(
struct xfs_buf *bp)
{
+ unsigned int len = BBTOB(bp->b_length);
+ unsigned int nr_vecs = bio_add_max_vecs(bp->b_addr, len);
unsigned int map = 0;
struct blk_plug plug;
struct bio *bio;
- if (is_vmalloc_addr(bp->b_addr)) {
- unsigned int size = BBTOB(bp->b_length);
- unsigned int alloc_size = roundup(size, PAGE_SIZE);
- void *data = bp->b_addr;
-
- bio = bio_alloc(bp->b_target->bt_bdev, alloc_size >> PAGE_SHIFT,
- xfs_buf_bio_op(bp), GFP_NOIO);
-
- do {
- unsigned int len = min(size, PAGE_SIZE);
-
- ASSERT(offset_in_page(data) == 0);
- __bio_add_page(bio, vmalloc_to_page(data), len, 0);
- data += len;
- size -= len;
- } while (size);
-
- flush_kernel_vmap_range(bp->b_addr, alloc_size);
- } else {
- /*
- * Single folio or slab allocation. Must be contiguous and thus
- * only a single bvec is needed.
- *
- * This uses the page based bio add helper for now as that is
- * the lowest common denominator between folios and slab
- * allocations. To be replaced with a better block layer
- * helper soon (hopefully).
- */
- bio = bio_alloc(bp->b_target->bt_bdev, 1, xfs_buf_bio_op(bp),
- GFP_NOIO);
- __bio_add_page(bio, virt_to_page(bp->b_addr),
- BBTOB(bp->b_length),
- offset_in_page(bp->b_addr));
- }
-
+ bio = bio_alloc(bp->b_target->bt_bdev, nr_vecs, xfs_buf_bio_op(bp),
+ GFP_NOIO);
+ if (is_vmalloc_addr(bp->b_addr))
+ bio_add_vmalloc(bio, bp->b_addr, len);
+ else
+ bio_add_virt_nofail(bio, bp->b_addr, len);
bio->bi_private = bp;
bio->bi_end_io = xfs_buf_bio_end_io;
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 16/19] xfs: simplify xfs_rw_bdev
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (14 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 15/19] xfs: simplify xfs_buf_submit_bio Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 17/19] xfs: simplify building the bio in xlog_write_iclog Christoph Hellwig
` (3 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Darrick J. Wong
Delegate to bdev_rw_virt when operating on non-vmalloc memory and use
bio_add_vmalloc_chunk to insulate xfs from the details of adding vmalloc
memory to a bio.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
---
fs/xfs/xfs_bio_io.c | 30 ++++++++++++------------------
1 file changed, 12 insertions(+), 18 deletions(-)
diff --git a/fs/xfs/xfs_bio_io.c b/fs/xfs/xfs_bio_io.c
index fe21c76f75b8..2a736d10eafb 100644
--- a/fs/xfs/xfs_bio_io.c
+++ b/fs/xfs/xfs_bio_io.c
@@ -18,42 +18,36 @@ xfs_rw_bdev(
enum req_op op)
{
- unsigned int is_vmalloc = is_vmalloc_addr(data);
- unsigned int left = count;
+ unsigned int done = 0, added;
int error;
struct bio *bio;
- if (is_vmalloc && op == REQ_OP_WRITE)
- flush_kernel_vmap_range(data, count);
+ op |= REQ_META | REQ_SYNC;
+ if (!is_vmalloc_addr(data))
+ return bdev_rw_virt(bdev, sector, data, count, op);
- bio = bio_alloc(bdev, bio_max_vecs(left), op | REQ_META | REQ_SYNC,
- GFP_KERNEL);
+ bio = bio_alloc(bdev, bio_max_vecs(count), op, GFP_KERNEL);
bio->bi_iter.bi_sector = sector;
do {
- struct page *page = kmem_to_page(data);
- unsigned int off = offset_in_page(data);
- unsigned int len = min_t(unsigned, left, PAGE_SIZE - off);
-
- while (bio_add_page(bio, page, len, off) != len) {
+ added = bio_add_vmalloc_chunk(bio, data + done, count - done);
+ if (!added) {
struct bio *prev = bio;
- bio = bio_alloc(prev->bi_bdev, bio_max_vecs(left),
+ bio = bio_alloc(prev->bi_bdev,
+ bio_max_vecs(count - done),
prev->bi_opf, GFP_KERNEL);
bio->bi_iter.bi_sector = bio_end_sector(prev);
bio_chain(prev, bio);
-
submit_bio(prev);
}
-
- data += len;
- left -= len;
- } while (left > 0);
+ done += added;
+ } while (done < count);
error = submit_bio_wait(bio);
bio_put(bio);
- if (is_vmalloc && op == REQ_OP_READ)
+ if (op == REQ_OP_READ)
invalidate_kernel_vmap_range(data, count);
return error;
}
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 17/19] xfs: simplify building the bio in xlog_write_iclog
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (15 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 16/19] xfs: simplify xfs_rw_bdev Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 12:04 ` [PATCH 18/19] btrfs: use bdev_rw_virt in scrub_one_super Christoph Hellwig
` (2 subsequent siblings)
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Darrick J. Wong
Use the bio_add_virt_nofail and bio_add_vmalloc helpers to abstract
away the details of the memory allocation.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
---
fs/xfs/xfs_log.c | 32 ++++++--------------------------
1 file changed, 6 insertions(+), 26 deletions(-)
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 980aabc49512..793468b4d30d 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1607,27 +1607,6 @@ xlog_bio_end_io(
&iclog->ic_end_io_work);
}
-static int
-xlog_map_iclog_data(
- struct bio *bio,
- void *data,
- size_t count)
-{
- do {
- struct page *page = kmem_to_page(data);
- unsigned int off = offset_in_page(data);
- size_t len = min_t(size_t, count, PAGE_SIZE - off);
-
- if (bio_add_page(bio, page, len, off) != len)
- return -EIO;
-
- data += len;
- count -= len;
- } while (count);
-
- return 0;
-}
-
STATIC void
xlog_write_iclog(
struct xlog *log,
@@ -1693,11 +1672,12 @@ xlog_write_iclog(
iclog->ic_flags &= ~(XLOG_ICL_NEED_FLUSH | XLOG_ICL_NEED_FUA);
- if (xlog_map_iclog_data(&iclog->ic_bio, iclog->ic_data, count))
- goto shutdown;
-
- if (is_vmalloc_addr(iclog->ic_data))
- flush_kernel_vmap_range(iclog->ic_data, count);
+ if (is_vmalloc_addr(iclog->ic_data)) {
+ if (!bio_add_vmalloc(&iclog->ic_bio, iclog->ic_data, count))
+ goto shutdown;
+ } else {
+ bio_add_virt_nofail(&iclog->ic_bio, iclog->ic_data, count);
+ }
/*
* If this log buffer would straddle the end of the log we will have
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 18/19] btrfs: use bdev_rw_virt in scrub_one_super
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (16 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 17/19] xfs: simplify building the bio in xlog_write_iclog Christoph Hellwig
@ 2025-05-07 12:04 ` 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
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn, Qu Wenruo
Replace the code building a bio from a kernel direct map address and
submitting it synchronously with the bdev_rw_virt helper.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: David Sterba <dsterba@suse.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
---
fs/btrfs/scrub.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index 2c5edcee9450..7bdb2bc0a212 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -2770,17 +2770,11 @@ static int scrub_one_super(struct scrub_ctx *sctx, struct btrfs_device *dev,
struct page *page, u64 physical, u64 generation)
{
struct btrfs_fs_info *fs_info = sctx->fs_info;
- struct bio_vec bvec;
- struct bio bio;
struct btrfs_super_block *sb = page_address(page);
int ret;
- bio_init(&bio, dev->bdev, &bvec, 1, REQ_OP_READ);
- bio.bi_iter.bi_sector = physical >> SECTOR_SHIFT;
- __bio_add_page(&bio, page, BTRFS_SUPER_INFO_SIZE, 0);
- ret = submit_bio_wait(&bio);
- bio_uninit(&bio);
-
+ ret = bdev_rw_virt(dev->bdev, physical >> SECTOR_SHIFT, sb,
+ BTRFS_SUPER_INFO_SIZE, REQ_OP_READ);
if (ret < 0)
return ret;
ret = btrfs_check_super_csum(fs_info, sb);
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 19/19] hfsplus: use bdev_rw_virt in hfsplus_submit_bio
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (17 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 18/19] btrfs: use bdev_rw_virt in scrub_one_super Christoph Hellwig
@ 2025-05-07 12:04 ` Christoph Hellwig
2025-05-07 14:02 ` add more bio helpers v3 Jens Axboe
19 siblings, 0 replies; 26+ messages in thread
From: Christoph Hellwig @ 2025-05-07 12:04 UTC (permalink / raw)
To: Jens Axboe
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm, Johannes Thumshirn
Replace the code building a bio from a kernel direct map address and
submitting it synchronously with the bdev_rw_virt helper.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Yangtao Li <frank.li@vivo.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
fs/hfsplus/wrapper.c | 46 +++++++++-----------------------------------
1 file changed, 9 insertions(+), 37 deletions(-)
diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c
index 74801911bc1c..30cf4fe78b3d 100644
--- a/fs/hfsplus/wrapper.c
+++ b/fs/hfsplus/wrapper.c
@@ -48,47 +48,19 @@ struct hfsplus_wd {
int hfsplus_submit_bio(struct super_block *sb, sector_t sector,
void *buf, void **data, blk_opf_t opf)
{
- const enum req_op op = opf & REQ_OP_MASK;
- struct bio *bio;
- int ret = 0;
- u64 io_size;
- loff_t start;
- int offset;
+ u64 io_size = hfsplus_min_io_size(sb);
+ loff_t start = (loff_t)sector << HFSPLUS_SECTOR_SHIFT;
+ int offset = start & (io_size - 1);
+
+ if ((opf & REQ_OP_MASK) != REQ_OP_WRITE && data)
+ *data = (u8 *)buf + offset;
/*
- * Align sector to hardware sector size and find offset. We
- * assume that io_size is a power of two, which _should_
- * be true.
+ * Align sector to hardware sector size and find offset. We assume that
+ * io_size is a power of two, which _should_ be true.
*/
- io_size = hfsplus_min_io_size(sb);
- start = (loff_t)sector << HFSPLUS_SECTOR_SHIFT;
- offset = start & (io_size - 1);
sector &= ~((io_size >> HFSPLUS_SECTOR_SHIFT) - 1);
-
- bio = bio_alloc(sb->s_bdev, 1, opf, GFP_NOIO);
- bio->bi_iter.bi_sector = sector;
-
- if (op != REQ_OP_WRITE && data)
- *data = (u8 *)buf + offset;
-
- while (io_size > 0) {
- unsigned int page_offset = offset_in_page(buf);
- unsigned int len = min_t(unsigned int, PAGE_SIZE - page_offset,
- io_size);
-
- ret = bio_add_page(bio, virt_to_page(buf), len, page_offset);
- if (ret != len) {
- ret = -EIO;
- goto out;
- }
- io_size -= len;
- buf = (u8 *)buf + len;
- }
-
- ret = submit_bio_wait(bio);
-out:
- bio_put(bio);
- return ret < 0 ? ret : 0;
+ return bdev_rw_virt(sb->s_bdev, sector, buf, io_size, opf);
}
static int hfsplus_read_mdb(void *bufptr, struct hfsplus_wd *wd)
--
2.47.2
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: add more bio helpers v3
2025-05-07 12:04 add more bio helpers v3 Christoph Hellwig
` (18 preceding siblings ...)
2025-05-07 12:04 ` [PATCH 19/19] hfsplus: use bdev_rw_virt in hfsplus_submit_bio Christoph Hellwig
@ 2025-05-07 14:02 ` Jens Axboe
19 siblings, 0 replies; 26+ messages in thread
From: Jens Axboe @ 2025-05-07 14:02 UTC (permalink / raw)
To: Christoph Hellwig
Cc: linux-block, Md. Haris Iqbal, Jack Wang, Coly Li, Kent Overstreet,
Mike Snitzer, Mikulas Patocka, Chris Mason, Josef Bacik,
David Sterba, Andreas Gruenbacher, Carlos Maiolino,
Damien Le Moal, Naohiro Aota, Johannes Thumshirn,
Rafael J. Wysocki, Pavel Machek, slava, glaubitz, frank.li,
linux-bcache, dm-devel, linux-btrfs, gfs2, linux-fsdevel,
linux-xfs, linux-pm
On Wed, 07 May 2025 14:04:24 +0200, Christoph Hellwig wrote:
> this series adds more block layer helpers to remove boilerplate code when
> adding memory to a bio or to even do the entire synchronous I/O.
>
> The main aim is to avoid having to convert to a struct page in the caller
> when adding kernel direct mapping or vmalloc memory.
>
> Changes since v2:
> - rebase on top of the latest block for-next branch to resolve
> conflicts with the bonuce buffering removal
>
> [...]
Applied, thanks!
[01/19] block: add a bio_add_virt_nofail helper
commit: 850e210d5ad21b94b55b97d4d82b4cdeb0bb05df
[02/19] block: add a bdev_rw_virt helper
commit: 10b1e59cdadabff16fc78eb2ca4c341b1502293c
[03/19] block: add a bio_add_max_vecs helper
commit: 75f88659e47dc570bdebddf77d7a3cd5f0845612
[04/19] block: add a bio_add_vmalloc helpers
commit: 8dd16f5e34693aa0aa6a4ed48427045008097e64
[05/19] block: remove the q argument from blk_rq_map_kern
commit: af78428ed3f3eebad7be9d0463251046e9582cf6
[06/19] block: pass the operation to bio_{map,copy}_kern
commit: fddbc51dc290f834f520ce89c00a0fce38260c16
[07/19] block: simplify bio_map_kern
commit: 6ff54f456671415e101e671a7dfa1fe13a31bdb5
[08/19] bcache: use bio_add_virt_nofail
commit: 23f5d69dfa993cb6d17e619fff5e623e76b9b17f
[09/19] rnbd-srv: use bio_add_virt_nofail
commit: a216081323a1391991c9073fed2459265bfc7f5c
[10/19] gfs2: use bdev_rw_virt in gfs2_read_super
commit: 65f8e62593e64f6991ece4f08ab9e147e62df488
[11/19] zonefs: use bdev_rw_virt in zonefs_read_super
commit: b2f676efe601586360e5f7461f6d36981ac1e6c9
[12/19] PM: hibernate: split and simplify hib_submit_io
commit: 0cb8c299f81591699e908d1a6ad2dba6df642e25
[13/19] dm-bufio: use bio_add_virt_nofail
commit: 9134124ce1bac3d5228ee1b1fc7a879422ff74f6
[14/19] dm-integrity: use bio_add_virt_nofail
commit: bd4e709b32ac932aee3b337969cbb1b57faf84bd
[15/19] xfs: simplify xfs_buf_submit_bio
commit: 9dccf2aa6ed5fa6ee92c8d71868bf3762ae85bda
[16/19] xfs: simplify xfs_rw_bdev
commit: d486bbecc90d86e0292071bd06322543f8f5f658
[17/19] xfs: simplify building the bio in xlog_write_iclog
commit: 5ced480d4886b12e6a2058ac3ebd749b0ff14573
[18/19] btrfs: use bdev_rw_virt in scrub_one_super
commit: 760aa1818b040c8ec6a1ee9cea1ea8cac0735ce3
[19/19] hfsplus: use bdev_rw_virt in hfsplus_submit_bio
commit: 15c9d5f6235d66ebc130da9602b1cd7692bcf85d
Best regards,
--
Jens Axboe
^ permalink raw reply [flat|nested] 26+ messages in thread