• Josef Bacik's avatar
    btrfs: wait on caching when putting the bg cache · 3aa7c7a3
    Josef Bacik authored
    While testing my backport I noticed there was a panic if I ran
    generic/416 generic/417 generic/418 all in a row.  This just happened to
    uncover a race where we had outstanding IO after we destroy all of our
    workqueues, and then we'd go to queue the endio work on those free'd
    workqueues.
    
    This is because we aren't waiting for the caching threads to be done
    before freeing everything up, so to fix this make sure we wait on any
    outstanding caching that's being done before we free up the block group,
    so we're sure to be done with all IO by the time we get to
    btrfs_stop_all_workers().  This fixes the panic I was seeing
    consistently in testing.
    
    ------------[ cut here ]------------
    kernel BUG at fs/btrfs/volumes.c:6112!
    SMP PTI
    Modules linked in:
    CPU: 1 PID: 27165 Comm: kworker/u4:7 Not tainted 4.16.0-02155-g3553e54a578d-dirty #875
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.0-2.el7 04/01/2014
    Workqueue: btrfs-cache btrfs_cache_helper
    RIP: 0010:btrfs_map_bio+0x346/0x370
    RSP: 0000:ffffc900061e79d0 EFLAGS: 00010202
    RAX: 0000000000000000 RBX: ffff880071542e00 RCX: 0000000000533000
    RDX: ffff88006bb74380 RSI: 0000000000000008 RDI: ffff880078160000
    RBP: 0000000000000001 R08: ffff8800781cd200 R09: 0000000000503000
    R10: ffff88006cd21200 R11: 0000000000000000 R12: 0000000000000000
    R13: 0000000000000000 R14: ffff8800781cd200 R15: ffff880071542e00
    FS:  0000000000000000(0000) GS:ffff88007fd00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 000000000817ffc4 CR3: 0000000078314000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
     btree_submit_bio_hook+0x8a/0xd0
     submit_one_bio+0x5d/0x80
     read_extent_buffer_pages+0x18a/0x320
     btree_read_extent_buffer_pages+0xbc/0x200
     ? alloc_extent_buffer+0x359/0x3e0
     read_tree_block+0x3d/0x60
     read_block_for_search.isra.30+0x1a5/0x360
     btrfs_search_slot+0x41b/0xa10
     btrfs_next_old_leaf+0x212/0x470
     caching_thread+0x323/0x490
     normal_work_helper+0xc5/0x310
     process_one_work+0x141/0x340
     worker_thread+0x44/0x3c0
     kthread+0xf8/0x130
     ? process_one_work+0x340/0x340
     ? kthread_bind+0x10/0x10
     ret_from_fork+0x35/0x40
    RIP: btrfs_map_bio+0x346/0x370 RSP: ffffc900061e79d0
    ---[ end trace 827eb13e50846033 ]---
    Kernel panic - not syncing: Fatal exception
    Kernel Offset: disabled
    ---[ end Kernel panic - not syncing: Fatal exception
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Reviewed-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    3aa7c7a3
extent-tree.c 300 KB