• Zhao Lei's avatar
    btrfs: Fix lost-data-profile caused by balance bg · 2c9fe835
    Zhao Lei authored
    Reproduce:
     (In integration-4.3 branch)
    
     TEST_DEV=(/dev/vdg /dev/vdh)
     TEST_DIR=/mnt/tmp
    
     umount "$TEST_DEV" >/dev/null
     mkfs.btrfs -f -d raid1 "${TEST_DEV[@]}"
    
     mount -o nospace_cache "$TEST_DEV" "$TEST_DIR"
     btrfs balance start -dusage=0 $TEST_DIR
     btrfs filesystem usage $TEST_DIR
    
     dd if=/dev/zero of="$TEST_DIR"/file count=100
     btrfs filesystem usage $TEST_DIR
    
    Result:
     We can see "no data chunk" in first "btrfs filesystem usage":
     # btrfs filesystem usage $TEST_DIR
     Overall:
        ...
     Metadata,single: Size:8.00MiB, Used:0.00B
        /dev/vdg        8.00MiB
     Metadata,RAID1: Size:122.88MiB, Used:112.00KiB
        /dev/vdg      122.88MiB
        /dev/vdh      122.88MiB
     System,single: Size:4.00MiB, Used:0.00B
        /dev/vdg        4.00MiB
     System,RAID1: Size:8.00MiB, Used:16.00KiB
        /dev/vdg        8.00MiB
        /dev/vdh        8.00MiB
     Unallocated:
        /dev/vdg        1.06GiB
        /dev/vdh        1.07GiB
    
     And "data chunks changed from raid1 to single" in second
     "btrfs filesystem usage":
     # btrfs filesystem usage $TEST_DIR
     Overall:
        ...
     Data,single: Size:256.00MiB, Used:0.00B
        /dev/vdh      256.00MiB
     Metadata,single: Size:8.00MiB, Used:0.00B
        /dev/vdg        8.00MiB
     Metadata,RAID1: Size:122.88MiB, Used:112.00KiB
        /dev/vdg      122.88MiB
        /dev/vdh      122.88MiB
     System,single: Size:4.00MiB, Used:0.00B
        /dev/vdg        4.00MiB
     System,RAID1: Size:8.00MiB, Used:16.00KiB
        /dev/vdg        8.00MiB
        /dev/vdh        8.00MiB
     Unallocated:
        /dev/vdg        1.06GiB
        /dev/vdh      841.92MiB
    
    Reason:
     btrfs balance delete last data chunk in case of no data in
     the filesystem, then we can see "no data chunk" by "fi usage"
     command.
    
     And when we do write operation to fs, the only available data
     profile is 0x0, result is all new chunks are allocated single type.
    
    Fix:
     Allocate a data chunk explicitly to ensure we don't lose the
     raid profile for data.
    
    Test:
     Test by above script, and confirmed the logic by debug output.
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarZhao Lei <zhaolei@cn.fujitsu.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    2c9fe835
volumes.c 181 KB