• Qu Wenruo's avatar
    btrfs: fix the max chunk size and stripe length calculation · 5da431b7
    Qu Wenruo authored
    [BEHAVIOR CHANGE]
    Since commit f6fca391 ("btrfs: store chunk size in space-info
    struct"), btrfs no longer can create larger data chunks than 1G:
    
      mkfs.btrfs -f -m raid1 -d raid0 $dev1 $dev2 $dev3 $dev4
      mount $dev1 $mnt
    
      btrfs balance start --full $mnt
      btrfs balance start --full $mnt
      umount $mnt
    
      btrfs ins dump-tree -t chunk $dev1 | grep "DATA|RAID0" -C 2
    
    Before that offending commit, what we got is a 4G data chunk:
    
    	item 6 key (FIRST_CHUNK_TREE CHUNK_ITEM 9492758528) itemoff 15491 itemsize 176
    		length 4294967296 owner 2 stripe_len 65536 type DATA|RAID0
    		io_align 65536 io_width 65536 sector_size 4096
    		num_stripes 4 sub_stripes 1
    
    Now what we got is only 1G data chunk:
    
    	item 6 key (FIRST_CHUNK_TREE CHUNK_ITEM 6271533056) itemoff 15491 itemsize 176
    		length 1073741824 owner 2 stripe_len 65536 type DATA|RAID0
    		io_align 65536 io_width 65536 sector_size 4096
    		num_stripes 4 sub_stripes 1
    
    This will increase the number of data chunks by the number of devices,
    not only increase system chunk usage, but also greatly increase mount
    time.
    
    Without a proper reason, we should not change the max chunk size.
    
    [CAUSE]
    Previously, we set max data chunk size to 10G, while max data stripe
    length to 1G.
    
    Commit f6fca391 ("btrfs: store chunk size in space-info struct")
    completely ignored the 10G limit, but use 1G max stripe limit instead,
    causing above shrink in max data chunk size.
    
    [FIX]
    Fix the max data chunk size to 10G, and in decide_stripe_size_regular()
    we limit stripe_size to 1G manually.
    
    This should only affect data chunks, as for metadata chunks we always
    set the max stripe size the same as max chunk size (256M or 1G
    depending on fs size).
    
    Now the same script result the same old result:
    
    	item 6 key (FIRST_CHUNK_TREE CHUNK_ITEM 9492758528) itemoff 15491 itemsize 176
    		length 4294967296 owner 2 stripe_len 65536 type DATA|RAID0
    		io_align 65536 io_width 65536 sector_size 4096
    		num_stripes 4 sub_stripes 1
    Reported-by: default avatarWang Yugui <wangyugui@e16-tech.com>
    Fixes: f6fca391 ("btrfs: store chunk size in space-info struct")
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    5da431b7
volumes.c 222 KB