• Li Zefan's avatar
    Btrfs: update global block_rsv when creating a new block group · c7c144db
    Li Zefan authored
    A bug was triggered while using seed device:
    
        # mkfs.btrfs /dev/loop1
        # btrfstune -S 1 /dev/loop1
        # mount -o /dev/loop1 /mnt
        # btrfs dev add /dev/loop2 /mnt
    
    btrfs: block rsv returned -28
    ------------[ cut here ]------------
    WARNING: at fs/btrfs/extent-tree.c:5969 btrfs_alloc_free_block+0x166/0x396 [btrfs]()
    ...
    Call Trace:
    ...
    [<f7b7c31c>] btrfs_cow_block+0x101/0x147 [btrfs]
    [<f7b7eaa6>] btrfs_search_slot+0x1b8/0x55f [btrfs]
    [<f7b7f844>] btrfs_insert_empty_items+0x42/0x7f [btrfs]
    [<f7b7f8c1>] btrfs_insert_item+0x40/0x7e [btrfs]
    [<f7b8ac02>] btrfs_make_block_group+0x243/0x2aa [btrfs]
    [<f7bb3f53>] __btrfs_alloc_chunk+0x672/0x70e [btrfs]
    [<f7bb41ff>] init_first_rw_device+0x77/0x13c [btrfs]
    [<f7bb5a62>] btrfs_init_new_device+0x664/0x9fd [btrfs]
    [<f7bbb65a>] btrfs_ioctl+0x694/0xdbe [btrfs]
    [<c04f55f7>] do_vfs_ioctl+0x496/0x4cc
    [<c04f5660>] sys_ioctl+0x33/0x4f
    [<c07b9edf>] sysenter_do_call+0x12/0x38
    ---[ end trace 906adac595facc7d ]---
    
    Since seed device is readonly, there's no usable space in the filesystem.
    Afterwards we add a sprout device to it, and the kernel creates a METADATA
    block group and a SYSTEM block group where comes free space we can reserve,
    but we still get revervation failure because the global block_rsv hasn't
    been updated accordingly.
    Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
    c7c144db
extent-tree.c 203 KB