From ae7ae9054bc9f43a713bf07873b60e94c5b7e539 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 22 Apr 2025 14:41:21 -0400 Subject: [PATCH] RIP bd_inode v6.9-rc4-29-g203c1ce0bb06 removes bd_inode. The canonical replacement is bd_mapping->host, where applicable. We have one use where we directly need the mapping instead of the inode, as well. Signed-off-by: Auke Kok --- kmod/src/Makefile.kernelcompat | 8 ++++++++ kmod/src/alloc.c | 4 ++-- kmod/src/kernelcompat.h | 8 ++++++++ kmod/src/server.c | 2 +- kmod/src/super.c | 4 ++-- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/kmod/src/Makefile.kernelcompat b/kmod/src/Makefile.kernelcompat index 226402d1..36ab7af5 100644 --- a/kmod/src/Makefile.kernelcompat +++ b/kmod/src/Makefile.kernelcompat @@ -246,6 +246,14 @@ ifneq (,$(shell grep -s 'define __LINUX_UNALIGNED_H' include/linux/unaligned.h)) ccflags-y += -DKC_HAVE__LINUX_UNALIGNED_H endif +# +# v6.9-rc4-29-g203c1ce0bb06 +# +# RIP bd_inode. (note, struct moved between headers!) +ifneq (,$(shell grep -s 'struct inode.*bd_inode' include/linux/blk_types.h include/linux/fs.h)) +ccflags-y += -DKC_HAVE_BD_INODE +endif + # # v6.15-13744-g41cb08555c41 # diff --git a/kmod/src/alloc.c b/kmod/src/alloc.c index 78191e4b..aeb6b048 100644 --- a/kmod/src/alloc.c +++ b/kmod/src/alloc.c @@ -309,14 +309,14 @@ static bool invalid_extent(u64 start, u64 end, u64 first, u64 last) static bool invalid_meta_blkno(struct super_block *sb, u64 blkno) { struct scoutfs_sb_info *sbi = SCOUTFS_SB(sb); - u64 last_meta = (i_size_read(sbi->meta_bdev->bd_inode) >> SCOUTFS_BLOCK_LG_SHIFT) - 1; + u64 last_meta = (i_size_read(KC_BDEV_INODE(sbi->meta_bdev)) >> SCOUTFS_BLOCK_LG_SHIFT) - 1; return invalid_extent(blkno, blkno, SCOUTFS_META_DEV_START_BLKNO, last_meta); } static bool invalid_data_extent(struct super_block *sb, u64 start, u64 len) { - u64 last_data = (i_size_read(sb->s_bdev->bd_inode) >> SCOUTFS_BLOCK_SM_SHIFT) - 1; + u64 last_data = (i_size_read(KC_BDEV_INODE(sb->s_bdev)) >> SCOUTFS_BLOCK_SM_SHIFT) - 1; return invalid_extent(start, start + len - 1, SCOUTFS_DATA_DEV_START_BLKNO, last_data); } diff --git a/kmod/src/kernelcompat.h b/kmod/src/kernelcompat.h index d236c654..386dbbfe 100644 --- a/kmod/src/kernelcompat.h +++ b/kmod/src/kernelcompat.h @@ -306,6 +306,14 @@ static inline long inode_get_atime_nsec(const struct inode *inode) } #endif +#ifdef KC_HAVE_BD_INODE +#define KC_BDEV_INODE(b) (b)->bd_inode +#define KC_BDEV_MAPPING(b) (b)->bd_inode->i_mapping +#else +#define KC_BDEV_INODE(b) (b)->bd_mapping->host +#define KC_BDEV_MAPPING(b) (b)->bd_mapping +#endif + #ifndef KC_TIMER_CONTAINER_OF #define timer_container_of(var, callback_timer, timer_fieldname) \ from_timer(var, callback_timer, timer_fieldname) diff --git a/kmod/src/server.c b/kmod/src/server.c index d85d4769..6ef7437c 100644 --- a/kmod/src/server.c +++ b/kmod/src/server.c @@ -3475,7 +3475,7 @@ out: static u64 device_blocks(struct block_device *bdev, int shift) { - return i_size_read(bdev->bd_inode) >> shift; + return i_size_read(KC_BDEV_INODE(bdev)) >> shift; } static int server_resize_devices(struct super_block *sb, struct scoutfs_net_connection *conn, diff --git a/kmod/src/super.c b/kmod/src/super.c index f2e1420f..d1397689 100644 --- a/kmod/src/super.c +++ b/kmod/src/super.c @@ -283,7 +283,7 @@ int scoutfs_write_super(struct super_block *sb, static bool small_bdev(struct super_block *sb, char *which, u64 blocks, struct block_device *bdev, int shift) { - u64 size = (u64)i_size_read(bdev->bd_inode); + u64 size = (u64)i_size_read(KC_BDEV_INODE(bdev)); u64 count = size >> shift; if (blocks > count) { @@ -508,7 +508,7 @@ static int scoutfs_fill_super(struct super_block *sb, void *data, int silent) sb->s_time_gran = 1; /* btree blocks use long lived bh->b_data refs */ - mapping_set_gfp_mask(sb->s_bdev->bd_inode->i_mapping, GFP_NOFS); + mapping_set_gfp_mask(KC_BDEV_MAPPING(sb->s_bdev), GFP_NOFS); sbi = kzalloc(sizeof(struct scoutfs_sb_info), GFP_KERNEL); sb->s_fs_info = sbi;