Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext4: don't call update_backups() multiple times for the same bg

When performing an online resize, we add a bunch of groups at one time
in ext4_flex_group_add, so in most cases a lot of group descriptors
will be in the same group block. But in the end of this function,
update_backups will be called for every group descriptor and the same
block will be copied and journalled again and again. It is really a
waste.

Fix things so we only update a particular bg descriptor block once and
skip subsequent updates of the same block.

Signed-off-by: Tao Ma <boyu.mt@taobao.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>

authored by

Tao Ma and committed by
Theodore Ts'o
0acdb887 7f1468d1

+4
+4
fs/ext4/resize.c
··· 1460 1460 EXT4_DESC_PER_BLOCK(sb)); 1461 1461 int meta_bg = EXT4_HAS_INCOMPAT_FEATURE(sb, 1462 1462 EXT4_FEATURE_INCOMPAT_META_BG); 1463 + sector_t old_gdb = 0; 1463 1464 1464 1465 update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es, 1465 1466 sizeof(struct ext4_super_block), 0); ··· 1468 1467 struct buffer_head *gdb_bh; 1469 1468 1470 1469 gdb_bh = sbi->s_group_desc[gdb_num]; 1470 + if (old_gdb == gdb_bh->b_blocknr) 1471 + continue; 1471 1472 update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data, 1472 1473 gdb_bh->b_size, meta_bg); 1474 + old_gdb = gdb_bh->b_blocknr; 1473 1475 } 1474 1476 } 1475 1477 exit: