• Josef Bacik's avatar
    btrfs: drop logs when we've aborted a transaction · ef67963d
    Josef Bacik authored
    Dave reported a problem where we were panicing with generic/475 with
    misc-5.7.  This is because we were doing IO after we had stopped all of
    the worker threads, because we do the log tree cleanup on roots at drop
    time.  Cleaning up the log tree will always need to do reads if we
    happened to have evicted the blocks from memory.
    
    Because of this simply add a helper to btrfs_cleanup_transaction() that
    will go through and drop all of the log roots.  This gets run before we
    do the close_ctree() work, and thus we are allowed to do any reads that
    we would need.  I ran this through many iterations of generic/475 with
    constrained memory and I did not see the issue.
    
      general protection fault, probably for non-canonical address 0x6b6b6b6b6b6b6b6b: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC PTI
      CPU: 2 PID: 12359 Comm: umount Tainted: G        W 5.6.0-rc7-btrfs-next-58 #1
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-59-gc9ba5276e321-prebuilt.qemu.org 04/01/2014
      RIP: 0010:btrfs_queue_work+0x33/0x1c0 [btrfs]
      RSP: 0018:ffff9cfb015937d8 EFLAGS: 00010246
      RAX: 0000000000000000 RBX: ffff8eb5e339ed80 RCX: 0000000000000000
      RDX: 0000000000000001 RSI: ffff8eb5eb33b770 RDI: ffff8eb5e37a0460
      RBP: ffff8eb5eb33b770 R08: 000000000000020c R09: ffffffff9fc09ac0
      R10: 0000000000000007 R11: 0000000000000000 R12: 6b6b6b6b6b6b6b6b
      R13: ffff9cfb00229040 R14: 0000000000000008 R15: ffff8eb5d3868000
      FS:  00007f167ea022c0(0000) GS:ffff8eb5fae00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007f167e5e0cb1 CR3: 0000000138c18004 CR4: 00000000003606e0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       btrfs_end_bio+0x81/0x130 [btrfs]
       __split_and_process_bio+0xaf/0x4e0 [dm_mod]
       ? percpu_counter_add_batch+0xa3/0x120
       dm_process_bio+0x98/0x290 [dm_mod]
       ? generic_make_request+0xfb/0x410
       dm_make_request+0x4d/0x120 [dm_mod]
       ? generic_make_request+0xfb/0x410
       generic_make_request+0x12a/0x410
       ? submit_bio+0x38/0x160
       submit_bio+0x38/0x160
       ? percpu_counter_add_batch+0xa3/0x120
       btrfs_map_bio+0x289/0x570 [btrfs]
       ? kmem_cache_alloc+0x24d/0x300
       btree_submit_bio_hook+0x79/0xc0 [btrfs]
       submit_one_bio+0x31/0x50 [btrfs]
       read_extent_buffer_pages+0x2fe/0x450 [btrfs]
       btree_read_extent_buffer_pages+0x7e/0x170 [btrfs]
       walk_down_log_tree+0x343/0x690 [btrfs]
       ? walk_log_tree+0x3d/0x380 [btrfs]
       walk_log_tree+0xf7/0x380 [btrfs]
       ? plist_requeue+0xf0/0xf0
       ? delete_node+0x4b/0x230
       free_log_tree+0x4c/0x130 [btrfs]
       ? wait_log_commit+0x140/0x140 [btrfs]
       btrfs_free_log+0x17/0x30 [btrfs]
       btrfs_drop_and_free_fs_root+0xb0/0xd0 [btrfs]
       btrfs_free_fs_roots+0x10c/0x190 [btrfs]
       ? do_raw_spin_unlock+0x49/0xc0
       ? _raw_spin_unlock+0x29/0x40
       ? release_extent_buffer+0x121/0x170 [btrfs]
       close_ctree+0x289/0x2e6 [btrfs]
       generic_shutdown_super+0x6c/0x110
       kill_anon_super+0xe/0x30
       btrfs_kill_super+0x12/0x20 [btrfs]
       deactivate_locked_super+0x3a/0x70
    Reported-by: default avatarDavid Sterba <dsterba@suse.com>
    Fixes: 8c38938c ("btrfs: move the root freeing stuff into btrfs_put_root")
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ef67963d
disk-io.c 128 KB