• Filipe Manana's avatar
    Btrfs: fix memory leak after block remove + trimming · 946ddbe8
    Filipe Manana authored
    There was a free space entry structure memeory leak if a block
    group is remove while a free space entry is being trimmed, which
    the following diagram explains:
    
               CPU 1                                          CPU 2
    
      btrfs_trim_block_group()
          trim_no_bitmap()
              remove free space entry from
              block group cache's rbtree
              do_trimming()
    
                                                    btrfs_remove_block_group()
                                                        btrfs_remove_free_space_cache()
    
                  add back free space entry to
                  block group's cache rbtree
      btrfs_put_block_group()
    
                                                        (...)
                                                        btrfs_put_block_group()
                                                            kfree(bg->free_space_ctl)
                                                            kfree(bg)
    
    The free space entry added after doing the discard of its respective
    range ends up never being freed.
    Detected after doing an "rmmod btrfs" after running the stress test
    recently submitted for fstests:
    
    [ 8234.642212] kmem_cache_destroy btrfs_free_space: Slab cache still has objects
    [ 8234.642657] CPU: 1 PID: 32276 Comm: rmmod Tainted: G        W    L 3.17.0-rc5-btrfs-next-2+ #1
    [ 8234.642660] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org 04/01/2014
    [ 8234.642664]  0000000000000000 ffff8801af1b3eb8 ffffffff8140c7b6 ffff8801dbedd0c0
    [ 8234.642670]  ffff8801af1b3ed0 ffffffff811149ce 0000000000000000 ffff8801af1b3ee0
    [ 8234.642676]  ffffffffa042dbe7 ffff8801af1b3ef0 ffffffffa0487422 ffff8801af1b3f78
    [ 8234.642682] Call Trace:
    [ 8234.642692]  [<ffffffff8140c7b6>] dump_stack+0x4d/0x66
    [ 8234.642699]  [<ffffffff811149ce>] kmem_cache_destroy+0x4d/0x92
    [ 8234.642731]  [<ffffffffa042dbe7>] btrfs_destroy_cachep+0x63/0x76 [btrfs]
    [ 8234.642757]  [<ffffffffa0487422>] exit_btrfs_fs+0x9/0xbe7 [btrfs]
    [ 8234.642762]  [<ffffffff810a76a5>] SyS_delete_module+0x155/0x1c6
    [ 8234.642768]  [<ffffffff8122a7eb>] ? trace_hardirqs_on_thunk+0x3a/0x3f
    [ 8234.642773]  [<ffffffff814122d2>] system_call_fastpath+0x16/0x1b
    
    This applies on top (depends on) of my previous patch titled:
    "Btrfs: fix race between fs trimming and block group remove/allocation"
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    946ddbe8
free-space-cache.c 86.9 KB