• Chris Mason's avatar
    Btrfs: free and unlock our path before btrfs_free_and_pin_reserved_extent() · dd825259
    Chris Mason authored
    The error handling path for alloc_reserved_tree_block is calling
    btrfs_free_and_pin_reserved_extent with a spinning tree lock held.  This
    might sleep as we allocate extent_state objects:
    
     BUG: sleeping function called from invalid context at mm/slub.c:1268
     in_atomic(): 1, irqs_disabled(): 0, pid: 11093, name: kworker/u4:7
     5 locks held by kworker/u4:7/11093:
      #0:  ("%s-%s""btrfs", name){++++.+}, at: [<ffffffff81091d51>] process_one_work+0x151/0x520
      #1:  ((&work->normal_work)){+.+.+.}, at: [<ffffffff81091d51>] process_one_work+0x151/0x520
      #2:  (sb_internal){++++.+}, at: [<ffffffffa003a70e>] start_transaction+0x43e/0x590 [btrfs]
      #3:  (&head_ref->mutex){+.+...}, at: [<ffffffffa0089f8c>] btrfs_delayed_ref_lock+0x4c/0x240 [btrfs]
      #4:  (btrfs-extent-00){++++..}, at: [<ffffffffa007697b>] btrfs_clear_lock_blocking_rw+0x9b/0x150 [btrfs]
     CPU: 0 PID: 11093 Comm: kworker/u4:7 Tainted: G        W 4.0.0-rc6-default+ #246
     Hardware name: Intel Corporation Santa Rosa platform/Matanzas, BIOS TSRSCRB1.86C.0047.B00.0610170821 10/17/06
     Workqueue: btrfs-extent-refs btrfs_extent_refs_helper [btrfs]
      00000000000004f4 ffff88006dd17848 ffffffff81ab0e3b ffff88006dd17848
      ffff88007a944760 ffff88006dd17868 ffffffff8109d516 ffff88006dd17898
      0000000000000000 ffff88006dd17898 ffffffff8109d5b2 ffffffff81aba2bb
     Call Trace:
      [<ffffffff81ab0e3b>] dump_stack+0x4f/0x6c
      [<ffffffff8109d516>] ___might_sleep+0xf6/0x140
      [<ffffffff8109d5b2>] __might_sleep+0x52/0x90
      [<ffffffff81aba2bb>] ? ftrace_call+0x5/0x34
      [<ffffffff81196363>] kmem_cache_alloc+0x163/0x1b0
      [<ffffffffa0056f31>] ? alloc_extent_state+0x31/0x150 [btrfs]
      [<ffffffffa0056f20>] ? alloc_extent_state+0x20/0x150 [btrfs]
      [<ffffffffa0056f31>] alloc_extent_state+0x31/0x150 [btrfs]
      [<ffffffffa005805b>] __set_extent_bit+0x37b/0x5d0 [btrfs]
      [<ffffffff81aba2bb>] ? ftrace_call+0x5/0x34
      [<ffffffffa005888d>] ? set_extent_bit+0xd/0x30 [btrfs]
      [<ffffffffa00588a3>] set_extent_bit+0x23/0x30 [btrfs]
      [<ffffffffa0058e80>] set_extent_dirty+0x20/0x30 [btrfs]
      [<ffffffffa00195ba>] pin_down_extent+0xaa/0x170 [btrfs]
      [<ffffffffa001d8ef>] __btrfs_free_reserved_extent+0xcf/0x160 [btrfs]
      [<ffffffffa0023856>] btrfs_free_and_pin_reserved_extent+0x16/0x20 [btrfs]
      [<ffffffffa002482a>] __btrfs_run_delayed_refs+0xfca/0x1290 [btrfs]
      [<ffffffffa0026eae>] btrfs_run_delayed_refs+0x6e/0x2e0 [btrfs]
      [<ffffffffa0027378>] delayed_ref_async_start+0x48/0xb0 [btrfs]
      [<ffffffffa006c883>] normal_work_helper+0x83/0x350 [btrfs]
      [<ffffffffa006cd79>] ? btrfs_extent_refs_helper+0x9/0x20 [btrfs]
      [<ffffffffa006cd82>] btrfs_extent_refs_helper+0x12/0x20 [btrfs]
      [<ffffffff81091dcb>] process_one_work+0x1cb/0x520
      [<ffffffff81091d51>] ? process_one_work+0x151/0x520
      [<ffffffff811c7abf>] ? seq_read+0x3f/0x400
      [<ffffffff8109260b>] worker_thread+0x5b/0x4e0
      [<ffffffff81097be2>] ? __kthread_parkme+0x12/0xa0
      [<ffffffff810925b0>] ? rescuer_thread+0x450/0x450
      [<ffffffff81098686>] kthread+0xf6/0x120
      [<ffffffff81098590>] ? flush_kthread_worker+0x1b0/0x1b0
      [<ffffffff81ab8088>] ret_from_fork+0x58/0x90
      [<ffffffff81098590>] ? flush_kthread_worker+0x1b0/0x1b0
     ------------[ cut here ]------------
    
    This changes things to free the path first, which will also unlock the
    extent buffer.
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    Reported-by: default avatarDave Sterba <dsterba@suse.cz>
    Tested-by: default avatarDave Sterba <dsterba@suse.cz>
    dd825259
extent-tree.c 262 KB