summaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorYongqiang Yang <xiaoqiangnk@gmail.com>2012-09-05 07:27:50 +0200
committerTheodore Ts'o <tytso@mit.edu>2012-09-05 07:27:50 +0200
commit2ebd1704ded88a8ae29b5f3998b13959c715c4be (patch)
tree3b30f6ab1a26169bd2557f23e0b688814516513b /fs/ext4
parentext4: don't copy non-existent gdt blocks when resizing (diff)
downloadlinux-2ebd1704ded88a8ae29b5f3998b13959c715c4be.tar.xz
linux-2ebd1704ded88a8ae29b5f3998b13959c715c4be.zip
ext4: avoid duplicate writes of the backup bg descriptor blocks
The resize code was needlessly writing the backup block group descriptor blocks multiple times (once per block group) during an online resize. Signed-off-by: Yongqiang Yang <xiaoqiangnk@gmail.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Cc: stable@vger.kernel.org
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/resize.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
index a0ee26c23dd8..365d800ff8c1 100644
--- a/fs/ext4/resize.c
+++ b/fs/ext4/resize.c
@@ -1358,13 +1358,15 @@ exit_journal:
err = err2;
if (!err) {
- int i;
+ int gdb_num = group / EXT4_DESC_PER_BLOCK(sb);
+ int gdb_num_end = ((group + flex_gd->count - 1) /
+ EXT4_DESC_PER_BLOCK(sb));
+
update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es,
sizeof(struct ext4_super_block));
- for (i = 0; i < flex_gd->count; i++, group++) {
+ for (; gdb_num <= gdb_num_end; gdb_num++) {
struct buffer_head *gdb_bh;
- int gdb_num;
- gdb_num = group / EXT4_BLOCKS_PER_GROUP(sb);
+
gdb_bh = sbi->s_group_desc[gdb_num];
update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data,
gdb_bh->b_size);