From 2d58ee2a37011fae7b1d0612a825ed16ed6ad28d Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 16 Oct 2023 16:26:09 -0700 Subject: [PATCH] Account for new bio_alloc() args. Block device and opf are now passed through and set. We mimic compat code to do the same. Signed-off-by: Auke Kok --- kmod/src/Makefile.kernelcompat | 8 ++++++++ kmod/src/block.c | 8 ++------ kmod/src/kernelcompat.h | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/kmod/src/Makefile.kernelcompat b/kmod/src/Makefile.kernelcompat index efa89b4e..68812985 100644 --- a/kmod/src/Makefile.kernelcompat +++ b/kmod/src/Makefile.kernelcompat @@ -282,3 +282,11 @@ endif ifneq (,$(shell grep 'extern void .__vmalloc.unsigned long size, gfp_t gfp_mask, pgprot_t prot' include/linux/vmalloc.h)) ccflags-y += -DKC_VMALLOC_PGPROT_T endif + +# +# v5.17-rc2-21-g07888c665b40 +# +# Detect new style bio_alloc - pass bdev and opf. +ifneq (,$(shell grep 'struct bio .bio_alloc.struct block_device .bdev' include/linux/bio.h)) +ccflags-y += -DKC_BIO_ALLOC_DEV_OPF_ARGS +endif diff --git a/kmod/src/block.c b/kmod/src/block.c index ca051967..23a37b98 100644 --- a/kmod/src/block.c +++ b/kmod/src/block.c @@ -504,15 +504,13 @@ static int block_submit_bio(struct super_block *sb, struct block_private *bp, for (off = 0; off < SCOUTFS_BLOCK_LG_SIZE; off += PAGE_SIZE) { if (!bio) { - bio = bio_alloc(GFP_NOFS, SCOUTFS_BLOCK_LG_PAGES_PER); + bio = kc_bio_alloc(sbi->meta_bdev, SCOUTFS_BLOCK_LG_PAGES_PER, opf, GFP_NOFS); if (!bio) { ret = -ENOMEM; break; } - kc_bio_set_opf(bio, opf); kc_bio_set_sector(bio, sector + (off >> 9)); - bio_set_dev(bio, sbi->meta_bdev); bio->bi_end_io = block_bio_end_io; bio->bi_private = bp; @@ -1232,15 +1230,13 @@ static int sm_block_io(struct super_block *sb, struct block_device *bdev, blk_op pg_hdr->crc = block_calc_crc(pg_hdr, SCOUTFS_BLOCK_SM_SIZE); } - bio = bio_alloc(GFP_NOFS, 1); + bio = kc_bio_alloc(bdev, 1, opf, GFP_NOFS); if (!bio) { ret = -ENOMEM; goto out; } - kc_bio_set_opf(bio, opf | REQ_SYNC); kc_bio_set_sector(bio, blkno << (SCOUTFS_BLOCK_SM_SHIFT - 9)); - bio_set_dev(bio, bdev); bio->bi_end_io = sm_block_bio_end_io; bio->bi_private = &sbc; bio_add_page(bio, page, SCOUTFS_BLOCK_SM_SIZE, 0); diff --git a/kmod/src/kernelcompat.h b/kmod/src/kernelcompat.h index 361f5380..1d7acee7 100644 --- a/kmod/src/kernelcompat.h +++ b/kmod/src/kernelcompat.h @@ -290,4 +290,20 @@ typedef unsigned int blk_opf_t; #define kc__vmalloc __vmalloc #endif +#ifdef KC_BIO_ALLOC_DEV_OPF_ARGS +#define kc_bio_alloc bio_alloc +#else +#include +static inline struct bio *kc_bio_alloc(struct block_device *bdev, unsigned short nr_vecs, + blk_opf_t opf, gfp_t gfp_mask) +{ + struct bio *b = bio_alloc(gfp_mask, nr_vecs); + if (b) { + kc_bio_set_opf(b, opf); + bio_set_dev(b, bdev); + } + return b; +} +#endif + #endif