]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ext4: don't copy non-existent gdt blocks when resizing
authorYongqiang Yang <xiaoqiangnk@gmail.com>
Wed, 5 Sep 2012 05:25:50 +0000 (01:25 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 12 Oct 2012 20:50:23 +0000 (05:50 +0900)
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

index 28031c4e15e9c1653c91d1a9816bd8ecbe009ae2..1afd3e735459abbd90a45936fb994b26b8f589a7 100644 (file)
@@ -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;