• Anand Jain's avatar
    btrfs: fix a possible umount deadlock · 0ccd0528
    Anand Jain authored
    btrfs_show_devname() is using the device_list_mutex, sometimes
    a call to blkdev_put() leads vfs calling into this func. So
    call blkdev_put() outside of device_list_mutex, as of now.
    
    [  983.284212] ======================================================
    [  983.290401] [ INFO: possible circular locking dependency detected ]
    [  983.296677] 4.8.0-rc5-ceph-00023-g1b39cec2 #1 Not tainted
    [  983.302081] -------------------------------------------------------
    [  983.308357] umount/21720 is trying to acquire lock:
    [  983.313243]  (&bdev->bd_mutex){+.+.+.}, at: [<ffffffff9128ec51>] blkdev_put+0x31/0x150
    [  983.321264]
    [  983.321264] but task is already holding lock:
    [  983.327101]  (&fs_devs->device_list_mutex){+.+...}, at: [<ffffffffc033d6f6>] __btrfs_close_devices+0x46/0x200 [btrfs]
    [  983.337839]
    [  983.337839] which lock already depends on the new lock.
    [  983.337839]
    [  983.346024]
    [  983.346024] the existing dependency chain (in reverse order) is:
    [  983.353512]
    -> #4 (&fs_devs->device_list_mutex){+.+...}:
    [  983.359096]        [<ffffffff910dfd0c>] lock_acquire+0x1bc/0x1f0
    [  983.365143]        [<ffffffff91823125>] mutex_lock_nested+0x65/0x350
    [  983.371521]        [<ffffffffc02d8116>] btrfs_show_devname+0x36/0x1f0 [btrfs]
    [  983.378710]        [<ffffffff9129523e>] show_vfsmnt+0x4e/0x150
    [  983.384593]        [<ffffffff9126ffc7>] m_show+0x17/0x20
    [  983.389957]        [<ffffffff91276405>] seq_read+0x2b5/0x3b0
    [  983.395669]        [<ffffffff9124c808>] __vfs_read+0x28/0x100
    [  983.401464]        [<ffffffff9124eb3b>] vfs_read+0xab/0x150
    [  983.407080]        [<ffffffff9124ec32>] SyS_read+0x52/0xb0
    [  983.412609]        [<ffffffff91825fc0>] entry_SYSCALL_64_fastpath+0x23/0xc1
    [  983.419617]
    -> #3 (namespace_sem){++++++}:
    [  983.424024]        [<ffffffff910dfd0c>] lock_acquire+0x1bc/0x1f0
    [  983.430074]        [<ffffffff918239e9>] down_write+0x49/0x80
    [  983.435785]        [<ffffffff91272457>] lock_mount+0x67/0x1c0
    [  983.441582]        [<ffffffff91272ab2>] do_add_mount+0x32/0xf0
    [  983.447458]        [<ffffffff9127363a>] finish_automount+0x5a/0xc0
    [  983.453682]        [<ffffffff91259513>] follow_managed+0x1b3/0x2a0
    [  983.459912]        [<ffffffff9125b750>] lookup_fast+0x300/0x350
    [  983.465875]        [<ffffffff9125d6e7>] path_openat+0x3a7/0xaa0
    [  983.471846]        [<ffffffff9125ef75>] do_filp_open+0x85/0xe0
    [  983.477731]        [<ffffffff9124c41c>] do_sys_open+0x14c/0x1f0
    [  983.483702]        [<ffffffff9124c4de>] SyS_open+0x1e/0x20
    [  983.489240]        [<ffffffff91825fc0>] entry_SYSCALL_64_fastpath+0x23/0xc1
    [  983.496254]
    -> #2 (&sb->s_type->i_mutex_key#3){+.+.+.}:
    [  983.501798]        [<ffffffff910dfd0c>] lock_acquire+0x1bc/0x1f0
    [  983.507855]        [<ffffffff918239e9>] down_write+0x49/0x80
    [  983.513558]        [<ffffffff91366237>] start_creating+0x87/0x100
    [  983.519703]        [<ffffffff91366647>] debugfs_create_dir+0x17/0x100
    [  983.526195]        [<ffffffff911df153>] bdi_register+0x93/0x210
    [  983.532165]        [<ffffffff911df313>] bdi_register_owner+0x43/0x70
    [  983.538570]        [<ffffffff914080fb>] device_add_disk+0x1fb/0x450
    [  983.544888]        [<ffffffff91580226>] loop_add+0x1e6/0x290
    [  983.550596]        [<ffffffff91fec358>] loop_init+0x10b/0x14f
    [  983.556394]        [<ffffffff91002207>] do_one_initcall+0xa7/0x180
    [  983.562618]        [<ffffffff91f932e0>] kernel_init_freeable+0x1cc/0x266
    [  983.569370]        [<ffffffff918174be>] kernel_init+0xe/0x100
    [  983.575166]        [<ffffffff9182620f>] ret_from_fork+0x1f/0x40
    [  983.581131]
    -> #1 (loop_index_mutex){+.+.+.}:
    [  983.585801]        [<ffffffff910dfd0c>] lock_acquire+0x1bc/0x1f0
    [  983.591858]        [<ffffffff91823125>] mutex_lock_nested+0x65/0x350
    [  983.598256]        [<ffffffff9157ed3f>] lo_open+0x1f/0x60
    [  983.603704]        [<ffffffff9128eec3>] __blkdev_get+0x123/0x400
    [  983.609757]        [<ffffffff9128f4ea>] blkdev_get+0x34a/0x350
    [  983.615639]        [<ffffffff9128f554>] blkdev_open+0x64/0x80
    [  983.621428]        [<ffffffff9124aff6>] do_dentry_open+0x1c6/0x2d0
    [  983.627651]        [<ffffffff9124c029>] vfs_open+0x69/0x80
    [  983.633181]        [<ffffffff9125db74>] path_openat+0x834/0xaa0
    [  983.639152]        [<ffffffff9125ef75>] do_filp_open+0x85/0xe0
    [  983.645035]        [<ffffffff9124c41c>] do_sys_open+0x14c/0x1f0
    [  983.650999]        [<ffffffff9124c4de>] SyS_open+0x1e/0x20
    [  983.656535]        [<ffffffff91825fc0>] entry_SYSCALL_64_fastpath+0x23/0xc1
    [  983.663541]
    -> #0 (&bdev->bd_mutex){+.+.+.}:
    [  983.668107]        [<ffffffff910def43>] __lock_acquire+0x1003/0x17b0
    [  983.674510]        [<ffffffff910dfd0c>] lock_acquire+0x1bc/0x1f0
    [  983.680561]        [<ffffffff91823125>] mutex_lock_nested+0x65/0x350
    [  983.686967]        [<ffffffff9128ec51>] blkdev_put+0x31/0x150
    [  983.692761]        [<ffffffffc033481f>] btrfs_close_bdev+0x4f/0x60 [btrfs]
    [  983.699699]        [<ffffffffc033d77b>] __btrfs_close_devices+0xcb/0x200 [btrfs]
    [  983.707178]        [<ffffffffc033d8db>] btrfs_close_devices+0x2b/0xa0 [btrfs]
    [  983.714380]        [<ffffffffc03081c5>] close_ctree+0x265/0x340 [btrfs]
    [  983.721061]        [<ffffffffc02d7959>] btrfs_put_super+0x19/0x20 [btrfs]
    [  983.727908]        [<ffffffff91250e2f>] generic_shutdown_super+0x6f/0x100
    [  983.734744]        [<ffffffff91250f56>] kill_anon_super+0x16/0x30
    [  983.740888]        [<ffffffffc02da97e>] btrfs_kill_super+0x1e/0x130 [btrfs]
    [  983.747909]        [<ffffffff91250fe9>] deactivate_locked_super+0x49/0x80
    [  983.754745]        [<ffffffff912515fd>] deactivate_super+0x5d/0x70
    [  983.760977]        [<ffffffff91270a1c>] cleanup_mnt+0x5c/0x80
    [  983.766773]        [<ffffffff91270a92>] __cleanup_mnt+0x12/0x20
    [  983.772738]        [<ffffffff910aa2fe>] task_work_run+0x7e/0xc0
    [  983.778708]        [<ffffffff91081b5a>] exit_to_usermode_loop+0x7e/0xb4
    [  983.785373]        [<ffffffff910039eb>] syscall_return_slowpath+0xbb/0xd0
    [  983.792212]        [<ffffffff9182605c>] entry_SYSCALL_64_fastpath+0xbf/0xc1
    [  983.799225]
    [  983.799225] other info that might help us debug this:
    [  983.799225]
    [  983.807291] Chain exists of:
      &bdev->bd_mutex --> namespace_sem --> &fs_devs->device_list_mutex
    
    [  983.816521]  Possible unsafe locking scenario:
    [  983.816521]
    [  983.822489]        CPU0                    CPU1
    [  983.827043]        ----                    ----
    [  983.831599]   lock(&fs_devs->device_list_mutex);
    [  983.836289]                                lock(namespace_sem);
    [  983.842268]                                lock(&fs_devs->device_list_mutex);
    [  983.849478]   lock(&bdev->bd_mutex);
    [  983.853127]
    [  983.853127]  *** DEADLOCK ***
    [  983.853127]
    [  983.859113] 3 locks held by umount/21720:
    [  983.863145]  #0:  (&type->s_umount_key#35){++++..}, at: [<ffffffff912515f5>] deactivate_super+0x55/0x70
    [  983.872713]  #1:  (uuid_mutex){+.+.+.}, at: [<ffffffffc033d8d3>] btrfs_close_devices+0x23/0xa0 [btrfs]
    [  983.882206]  #2:  (&fs_devs->device_list_mutex){+.+...}, at: [<ffffffffc033d6f6>] __btrfs_close_devices+0x46/0x200 [btrfs]
    [  983.893422]
    [  983.893422] stack backtrace:
    [  983.897824] CPU: 6 PID: 21720 Comm: umount Not tainted 4.8.0-rc5-ceph-00023-g1b39cec2 #1
    [  983.905958] Hardware name: Supermicro SYS-5018R-WR/X10SRW-F, BIOS 1.0c 09/07/2015
    [  983.913492]  0000000000000000 ffff8c8a53c17a38 ffffffff91429521 ffffffff9260f4f0
    [  983.921018]  ffffffff92642760 ffff8c8a53c17a88 ffffffff911b2b04 0000000000000050
    [  983.928542]  ffffffff9237d620 ffff8c8a5294aee0 ffff8c8a5294aeb8 ffff8c8a5294aee0
    [  983.936072] Call Trace:
    [  983.938545]  [<ffffffff91429521>] dump_stack+0x85/0xc4
    [  983.943715]  [<ffffffff911b2b04>] print_circular_bug+0x1fb/0x20c
    [  983.949748]  [<ffffffff910def43>] __lock_acquire+0x1003/0x17b0
    [  983.955613]  [<ffffffff910dfd0c>] lock_acquire+0x1bc/0x1f0
    [  983.961123]  [<ffffffff9128ec51>] ? blkdev_put+0x31/0x150
    [  983.966550]  [<ffffffff91823125>] mutex_lock_nested+0x65/0x350
    [  983.972407]  [<ffffffff9128ec51>] ? blkdev_put+0x31/0x150
    [  983.977832]  [<ffffffff9128ec51>] blkdev_put+0x31/0x150
    [  983.983101]  [<ffffffffc033481f>] btrfs_close_bdev+0x4f/0x60 [btrfs]
    [  983.989500]  [<ffffffffc033d77b>] __btrfs_close_devices+0xcb/0x200 [btrfs]
    [  983.996415]  [<ffffffffc033d8db>] btrfs_close_devices+0x2b/0xa0 [btrfs]
    [  984.003068]  [<ffffffffc03081c5>] close_ctree+0x265/0x340 [btrfs]
    [  984.009189]  [<ffffffff9126cc5e>] ? evict_inodes+0x15e/0x170
    [  984.014881]  [<ffffffffc02d7959>] btrfs_put_super+0x19/0x20 [btrfs]
    [  984.021176]  [<ffffffff91250e2f>] generic_shutdown_super+0x6f/0x100
    [  984.027476]  [<ffffffff91250f56>] kill_anon_super+0x16/0x30
    [  984.033082]  [<ffffffffc02da97e>] btrfs_kill_super+0x1e/0x130 [btrfs]
    [  984.039548]  [<ffffffff91250fe9>] deactivate_locked_super+0x49/0x80
    [  984.045839]  [<ffffffff912515fd>] deactivate_super+0x5d/0x70
    [  984.051525]  [<ffffffff91270a1c>] cleanup_mnt+0x5c/0x80
    [  984.056774]  [<ffffffff91270a92>] __cleanup_mnt+0x12/0x20
    [  984.062201]  [<ffffffff910aa2fe>] task_work_run+0x7e/0xc0
    [  984.067625]  [<ffffffff91081b5a>] exit_to_usermode_loop+0x7e/0xb4
    [  984.073747]  [<ffffffff910039eb>] syscall_return_slowpath+0xbb/0xd0
    [  984.080038]  [<ffffffff9182605c>] entry_SYSCALL_64_fastpath+0xbf/0xc1
    Reported-by: default avatarIlya Dryomov <idryomov@gmail.com>
    Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    0ccd0528
volumes.c 188 KB