Whamcloud - gitweb
RM-633 ldiskfs: add loadbitmaps to load block bitmaps for rhel7.7
authorWang Shilong <wshilong@ddn.com>
Wed, 4 Mar 2020 01:35:12 +0000 (09:35 +0800)
committerAndreas Dilger <adilger@whamcloud.com>
Fri, 5 Mar 2021 18:48:58 +0000 (18:48 +0000)
Change-Id: I02bffab5eb809b2d8945562ad9b42f04929df380
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Reviewed-by: Li Xi <lixi@ddn.com>
Reviewed-on: https://review.whamcloud.com/41829
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Andreas Dilger <adilger@whamcloud.com>
ldiskfs/kernel_patches/patches/rhel7.7/ext4-loadbitmaps.patch [new file with mode: 0644]
ldiskfs/kernel_patches/series/ldiskfs-3.10-rhel7.7.series

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 (file)
index 0000000..8c342ae
--- /dev/null
@@ -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,
+ };
index 88c5369..8d6badb 100644 (file)
@@ -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