On 5/1/25 06:21, Christoph Hellwig wrote: > 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 <h...@lst.de>
Looks good to me. Reviewed-by: Damien Le Moal <dlem...@kernel.org> One nit below. > --- > 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 ca6b55ac0da1..0bc823b168e4 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); This may also fail if nr_vecs is larger than UIO_MAXIOV, in which case, the ENOMEM error may not really be appropriate. I guess we can sort this out separately though. > if (!bio) > return ERR_PTR(-ENOMEM); > - bio_init(bio, NULL, bio->bi_inline_vecs, nr_pages, op); -- Damien Le Moal Western Digital Research