| From 6df935ad2fced9033ab52078825fcaf6365f34b7 Mon Sep 17 00:00:00 2001 |
| From: Yongqiang Yang <xiaoqiangnk@gmail.com> |
| Date: Wed, 5 Sep 2012 01:25:50 -0400 |
| Subject: ext4: don't copy non-existent gdt blocks when resizing |
| |
| From: Yongqiang Yang <xiaoqiangnk@gmail.com> |
| |
| commit 6df935ad2fced9033ab52078825fcaf6365f34b7 upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/ext4/resize.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/fs/ext4/resize.c |
| +++ b/fs/ext4/resize.c |
| @@ -456,6 +456,9 @@ static int setup_new_flex_group_blocks(s |
| 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(s |
| goto out; |
| } |
| |
| +handle_itb: |
| /* Initialize group tables of the grop @group */ |
| if (!(bg_flags[i] & EXT4_BG_INODE_ZEROED)) |
| goto handle_bb; |