• Miao Xie's avatar
    Btrfs: fix double initialization of the raid kobject · 536cd964
    Miao Xie authored
    We met the following oops when doing space balance:
     kobject (ffff88081b590278): tried to init an initialized object, something is seriously wrong.
     ...
     Call Trace:
      [<ffffffff81937262>] dump_stack+0x49/0x5f
      [<ffffffff8137d259>] kobject_init+0x89/0xa0
      [<ffffffff8137d36a>] kobject_init_and_add+0x2a/0x70
      [<ffffffffa009bd79>] ? clear_extent_bit+0x199/0x470 [btrfs]
      [<ffffffffa005e82c>] __link_block_group+0xfc/0x120 [btrfs]
      [<ffffffffa006b9db>] btrfs_make_block_group+0x24b/0x370 [btrfs]
      [<ffffffffa00a899b>] __btrfs_alloc_chunk+0x54b/0x7e0 [btrfs]
      [<ffffffffa00a8c6f>] btrfs_alloc_chunk+0x3f/0x50 [btrfs]
      [<ffffffffa0060123>] do_chunk_alloc+0x363/0x440 [btrfs]
      [<ffffffffa00633d4>] btrfs_check_data_free_space+0x104/0x310 [btrfs]
      [<ffffffffa0069f4d>] btrfs_write_dirty_block_groups+0x48d/0x600 [btrfs]
      [<ffffffffa007aad4>] commit_cowonly_roots+0x184/0x250 [btrfs]
      ...
    
    Steps to reproduce:
     # mkfs.btrfs -f <dev>
     # mount -o nospace_cache <dev> <mnt>
     # btrfs balance start <mnt>
     # dd if=/dev/zero of=<mnt>/tmpfile bs=1M count=1
    
    The reason of this problem is that we initialized the raid kobject when we added
    a block group into a empty raid list. As we know, when we mounted a btrfs filesystem,
    the raid list was empty, we would initialize the raid kobject when we added the first
    block group. But if there was not data stored in the block group, the block group
    would be freed when doing balance, and the raid list would be empty. And then if we
    allocated a new block group and added it into the raid list, we would initialize
    the raid kobject again, the oops happened.
    
    Fix this problem by initializing the raid kobject just when mounting the fs.
    Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Reported-by: default avatarWang Shilong <wangsl.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    536cd964
extent-tree.c 240 KB