summaryrefslogtreecommitdiffstats
path: root/fs/ext4/resize.c
diff options
context:
space:
mode:
authorYongqiang Yang2012-09-05 07:25:50 +0200
committerTheodore Ts'o2012-09-05 07:25:50 +0200
commit6df935ad2fced9033ab52078825fcaf6365f34b7 (patch)
tree1a012bbdb5cc787896df233ed667e8897cbe99a0 /fs/ext4/resize.c
parentext4: report the original old blocks count in a debug message when resizing (diff)
downloadkernel-qcow2-linux-6df935ad2fced9033ab52078825fcaf6365f34b7.tar.gz
kernel-qcow2-linux-6df935ad2fced9033ab52078825fcaf6365f34b7.tar.xz
kernel-qcow2-linux-6df935ad2fced9033ab52078825fcaf6365f34b7.zip
ext4: don't copy non-existent gdt blocks when resizing
The resize code was copying blocks at the beginning of each block group in order to copy the superblock and block group descriptor table (gdt) blocks. This was, unfortunately, being done even for block groups that did not have super blocks or gdt blocks. This is a complete waste of perfectly good I/O bandwidth, to skip writing those blocks for sparse bg's. 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/resize.c')
-rw-r--r--fs/ext4/resize.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
index 591f4bda1146..a0ee26c23dd8 100644
--- a/fs/ext4/resize.c
+++ b/fs/ext4/resize.c
@@ -456,6 +456,9 @@ static int setup_new_flex_group_blocks(struct super_block *sb,
gdblocks = ext4_bg_num_gdb(sb, group);
start = ext4_group_first_block_no(sb, group);
+ if (!ext4_bg_has_super(sb, group))
+ goto handle_itb;
+
/* Copy all of the GDT blocks into the backup in this group */
for (j = 0, block = start + 1; j < gdblocks; j++, block++) {
struct buffer_head *gdb;
@@ -498,6 +501,7 @@ static int setup_new_flex_group_blocks(struct super_block *sb,
goto out;
}
+handle_itb:
/* Initialize group tables of the grop @group */
if (!(bg_flags[i] & EXT4_BG_INODE_ZEROED))
goto handle_bb;