From: Wang Shilong Date: Wed, 4 Mar 2020 01:35:12 +0000 (+0800) Subject: RM-633 ldiskfs: add loadbitmaps to load block bitmaps for rhel7.7 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=c5b92c3ec091ef7dc463aaebe5786f7cef88f273;p=fs%2Flustre-release.git RM-633 ldiskfs: add loadbitmaps to load block bitmaps for rhel7.7 Change-Id: I02bffab5eb809b2d8945562ad9b42f04929df380 Signed-off-by: Wang Shilong Reviewed-by: Li Xi Reviewed-on: https://review.whamcloud.com/41829 Tested-by: jenkins Reviewed-by: Andreas Dilger Tested-by: Andreas Dilger --- diff --git a/ldiskfs/kernel_patches/patches/rhel7.7/ext4-loadbitmaps.patch b/ldiskfs/kernel_patches/patches/rhel7.7/ext4-loadbitmaps.patch new file mode 100644 index 0000000..8c342ae --- /dev/null +++ b/ldiskfs/kernel_patches/patches/rhel7.7/ext4-loadbitmaps.patch @@ -0,0 +1,163 @@ +diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c +index 2b76c79..07244bf 100644 +--- a/fs/ext4/balloc.c ++++ b/fs/ext4/balloc.c +@@ -502,6 +502,7 @@ int ext4_wait_block_bitmap(struct super_block *sb, ext4_group_t block_group, + block_group, (unsigned long long) bh->b_blocknr); + return 1; + } ++ EXT4_SB(sb)->block_bitmap_read_cnt++; + clear_buffer_new(bh); + /* Panic or remount fs read-only if block bitmap is invalid */ + ext4_validate_block_bitmap(sb, desc, block_group, bh); +@@ -655,6 +656,68 @@ ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode, + return ret; + } + ++int ext4_load_block_bitmaps_bh(struct super_block *sb) ++{ ++ struct ext4_super_block *es; ++ struct buffer_head *bitmap_bh = NULL; ++ struct ext4_group_desc *gdp; ++ ext4_group_t i; ++ ext4_group_t ngroups = ext4_get_groups_count(sb); ++ struct ext4_group_info *grp; ++ ++ es = EXT4_SB(sb)->s_es; ++ gdp = NULL; ++ ++ for (i = 0; i < ngroups; i++) { ++ gdp = ext4_get_group_desc(sb, i, NULL); ++ if (!gdp) ++ continue; ++ grp = NULL; ++ if (EXT4_SB(sb)->s_group_info) ++ grp = ext4_get_group_info(sb, i); ++ bitmap_bh = ext4_read_block_bitmap(sb, i); ++ if (bitmap_bh == NULL) ++ return -ENOMEM; ++ } ++ /* Reset block bitmap to zero now */ ++ EXT4_SB(sb)->block_bitmap_read_cnt = 0; ++ ext4_msg(sb, KERN_INFO, "Preload %u block bitmaps finished", ngroups); ++ ++ return 0; ++} ++ ++void ext4_release_block_bitmaps_bh(struct super_block *sb) ++{ ++ struct ext4_super_block *es; ++ struct buffer_head *bitmap_bh = NULL; ++ struct ext4_group_desc *gdp; ++ ext4_group_t i; ++ ext4_group_t ngroups = ext4_get_groups_count(sb); ++ struct ext4_group_info *grp; ++ ++ es = EXT4_SB(sb)->s_es; ++ gdp = NULL; ++ ++ ext4_msg(sb, KERN_INFO, "block bitmap read count: %lu", EXT4_SB(sb)->block_bitmap_read_cnt); ++ ++ for (i = 0; i < ngroups; i++) { ++ gdp = ext4_get_group_desc(sb, i, NULL); ++ if (!gdp) ++ continue; ++ grp = NULL; ++ if (EXT4_SB(sb)->s_group_info) ++ grp = ext4_get_group_info(sb, i); ++ bitmap_bh = ext4_read_block_bitmap(sb, i); ++ if (bitmap_bh == NULL) ++ continue; ++ /* one for this read */ ++ brelse(bitmap_bh); ++ /* one for memory reclaim purpose */ ++ brelse(bitmap_bh); ++ } ++ ext4_msg(sb, KERN_INFO, "Release %u lock bitmaps finished", ngroups); ++} ++ + /** + * ext4_count_free_clusters() -- count filesystem free clusters + * @sb: superblock +diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h +index 7614fae..cea01a0 100644 +--- a/fs/ext4/ext4.h ++++ b/fs/ext4/ext4.h +@@ -1491,6 +1491,10 @@ struct ext4_sb_info { + struct ratelimit_state s_msg_ratelimit_state; + struct dax_device *s_daxdev; + ++ unsigned long block_bitmap_read_cnt; ++ unsigned long inode_bitmap_read_cnt; ++ unsigned s_loadbitmaps; ++ + bool s_proj_kernel_supported; + }; + +@@ -2214,6 +2218,8 @@ int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, + struct buffer_head *bh); + + /* balloc.c */ ++int ext4_load_block_bitmaps_bh(struct super_block *sb); ++void ext4_release_block_bitmaps_bh(struct super_block *sb); + extern void ext4_get_group_no_and_offset(struct super_block *sb, + ext4_fsblk_t blocknr, + ext4_group_t *blockgrpp, +diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c +index 844e06b..a6185b6 100644 +--- a/fs/ext4/ialloc.c ++++ b/fs/ext4/ialloc.c +@@ -162,6 +162,7 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group) + block_group, bitmap_blk); + return NULL; + } ++ EXT4_SB(sb)->inode_bitmap_read_cnt++; + + verify: + ext4_lock_group(sb, block_group); +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index 18fe358..51935c1 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -838,6 +838,11 @@ static void ext4_put_super(struct super_block *sb) + int aborted = 0; + int i, err; + ++ if (sbi->s_loadbitmaps) { ++ ext4_release_block_bitmaps_bh(sb); ++ sbi->s_loadbitmaps = 0; ++ } ++ + ext4_unregister_li_request(sb); + ext4_quota_off_umount(sb); + +@@ -2722,6 +2727,13 @@ static ssize_t sbi_ui_store(struct ext4_attr *a, + return ret; + if (strcmp("max_dir_size", a->attr.name) == 0) + t >>= 10; ++ if (strcmp("loadbitmaps", a->attr.name) == 0) { ++ if (t == 0 && sbi->s_loadbitmaps) { ++ ext4_release_block_bitmaps_bh(sbi->s_sb); ++ } else if (t && sbi->s_loadbitmaps == 0) { ++ ret = ext4_load_block_bitmaps_bh(sbi->s_sb); ++ } ++ } + *ui = t; + return count; + } +@@ -2918,6 +2930,7 @@ EXT4_RW_ATTR_SBI_UI(warning_ratelimit_interval_ms, s_warning_ratelimit_state.int + EXT4_RW_ATTR_SBI_UI(warning_ratelimit_burst, s_warning_ratelimit_state.burst); + EXT4_RW_ATTR_SBI_UI(msg_ratelimit_interval_ms, s_msg_ratelimit_state.interval); + EXT4_RW_ATTR_SBI_UI(msg_ratelimit_burst, s_msg_ratelimit_state.burst); ++EXT4_RW_ATTR_SBI_UI(loadbitmaps, s_loadbitmaps); + EXT4_RO_ATTR_ES_UI(errors_count, s_error_count); + EXT4_RO_ATTR_ES_UI(first_error_time, s_first_error_time); + EXT4_RO_ATTR_ES_UI(last_error_time, s_last_error_time); +@@ -2954,6 +2967,7 @@ static struct attribute *ext4_attrs[] = { + ATTR_LIST(errors_count), + ATTR_LIST(first_error_time), + ATTR_LIST(last_error_time), ++ ATTR_LIST(loadbitmaps), + NULL, + }; + diff --git a/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.7.series b/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.7.series index 88c5369..8d6badb 100644 --- a/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.7.series +++ b/ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.7.series @@ -49,3 +49,4 @@ rhel7.6/ext4-cleanup-flag-definitions-for-extent-status-tree.patch rhel7.6/ext4-introduce-aging-to-extent-status-tree.patch base/ext4-no-max-dir-size-limit-for-iam-objects.patch rhel7.6/ext4-dquot-commit-speedup.patch +rhel7.7/ext4-loadbitmaps.patch