Anand Jain
48b3b9d401
btrfs: fix lock dep warning move scratch super outside of chunk_mutex
Move scratch super outside of the chunk lock to avoid below
lockdep warning. The better place to scratch super is in
the function btrfs_rm_dev_replace_free_srcdev() just before
free_device, which is outside of the chunk lock as well.
To reproduce:
(fresh boot)
mkfs.btrfs -f -draid5 -mraid5 /dev/sdc /dev/sdd /dev/sde
mount /dev/sdc /btrfs
dd if=/dev/zero of=/btrfs/tf1 bs=4096 count=100
(get devmgt from https://github.com/asj/devmgt.git)
devmgt detach /dev/sde
dd if=/dev/zero of=/btrfs/tf1 bs=4096 count=100
sync
btrfs replace start -Brf 3 /dev/sdf /btrfs <--
devmgt attach host7
======================================================
[ INFO: possible circular locking dependency detected ]
4.6.0-rc2asj+ #1 Not tainted
---------------------------------------------------
btrfs/2174 is trying to acquire lock:
(sb_writers){.+.+.+}, at:
[<ffffffff812449b4>] __sb_start_write+0xb4/0xf0
but task is already holding lock:
(&fs_info->chunk_mutex){+.+.+.}, at:
[<ffffffffa05c5f55>] btrfs_dev_replace_finishing+0x145/0x980 [btrfs]
which lock already depends on the new lock.
Chain exists of:
sb_writers --> &fs_devs->device_list_mutex --> &fs_info->chunk_mutex
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&fs_info->chunk_mutex);
lock(&fs_devs->device_list_mutex);
lock(&fs_info->chunk_mutex);
lock(sb_writers);
*** DEADLOCK ***
-> #0 (sb_writers){.+.+.+}:
[<ffffffff810e6415>] __lock_acquire+0x1bc5/0x1ee0
[<ffffffff810e707e>] lock_acquire+0xbe/0x210
[<ffffffff810df49a>] percpu_down_read+0x4a/0xa0
[<ffffffff812449b4>] __sb_start_write+0xb4/0xf0
[<ffffffff81265534>] mnt_want_write+0x24/0x50
[<ffffffff812508a2>] path_openat+0x952/0x1190
[<ffffffff81252451>] do_filp_open+0x91/0x100
[<ffffffff8123f5cc>] file_open_name+0xfc/0x140
[<ffffffff8123f643>] filp_open+0x33/0x60
[<ffffffffa0572bb6>] update_dev_time+0x16/0x40 [btrfs]
[<ffffffffa057f60d>] btrfs_scratch_superblocks+0x5d/0xb0 [btrfs]
[<ffffffffa057f70e>] btrfs_rm_dev_replace_remove_srcdev+0xae/0xd0 [btrfs]
[<ffffffffa05c62c5>] btrfs_dev_replace_finishing+0x4b5/0x980 [btrfs]
[<ffffffffa05c6ae8>] btrfs_dev_replace_start+0x358/0x530 [btrfs]
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2016-05-06 15:22:49 +02:00
..
2016-04-04 10:41:08 -07:00
2016-01-18 12:44:40 -08:00
2016-01-25 16:50:26 -08:00
2015-08-31 11:46:40 -07:00
2016-02-26 15:38:33 +01:00
2015-01-14 19:23:47 +01:00
2016-01-07 14:26:58 +01:00
2016-04-04 10:41:08 -07:00
2016-04-04 10:41:08 -07:00
2016-03-11 17:12:46 +01:00
2016-04-04 16:29:22 +02:00
2016-04-28 10:40:27 +02:00
2016-03-14 14:59:54 +01:00
2016-02-11 07:01:59 -08:00
2016-02-18 11:46:03 +01:00
2016-01-07 14:26:58 +01:00
2016-04-04 16:29:22 +02:00
2016-02-23 13:10:10 +01:00
2014-11-20 17:20:07 -08:00
2016-04-04 10:50:24 -07:00
2016-01-11 06:08:37 -08:00
2015-10-06 06:55:23 -07:00
2016-04-28 10:41:47 +02:00
2016-04-04 10:41:08 -07:00
2016-03-14 15:05:02 +01:00
2016-01-15 19:22:28 +01:00
2016-04-09 10:41:34 -07:00
2016-04-04 10:41:08 -07:00
2016-04-28 10:41:47 +02:00
2016-04-04 10:41:08 -07:00
2016-01-07 15:01:14 +01:00
2016-01-29 08:19:37 -08:00
2015-12-17 12:16:47 -08:00
2014-10-14 10:51:22 +02:00
2015-09-29 16:30:00 +02:00
2016-04-04 10:41:08 -07:00
2016-01-15 19:25:02 +01:00
2016-04-28 10:40:27 +02:00
2016-05-06 15:22:49 +02:00
2015-01-06 11:04:29 -08:00
2016-01-07 14:30:52 +01:00
2014-11-19 10:34:35 -08:00
2016-04-04 10:41:08 -07:00
2015-12-17 12:16:47 -08:00
2015-03-03 17:23:57 +01:00
2016-03-14 15:05:02 +01:00
2015-10-21 18:51:40 -07:00
2014-09-17 13:37:12 -07:00
2016-02-11 16:15:43 +01:00
2016-03-11 17:12:46 +01:00
2016-04-04 16:29:22 +02:00
2015-10-21 18:41:10 -07:00
2016-04-04 10:41:08 -07:00
2015-08-09 07:34:26 -07:00
2016-04-04 10:41:08 -07:00
2016-04-09 10:41:34 -07:00
2016-03-21 18:12:42 -07:00
2016-05-06 15:22:49 +02:00
2016-05-06 15:22:49 +02:00
2016-01-07 14:38:02 +01:00
2016-04-04 10:41:08 -07:00
2016-05-06 15:22:49 +02:00
2016-05-06 15:22:49 +02:00
2016-01-21 18:50:40 +01:00
2016-02-26 15:38:33 +01:00
2016-01-07 15:20:55 +01:00
2015-12-18 02:51:32 +00:00
2016-04-06 17:01:44 -07:00
2016-03-01 08:23:25 -08:00
2015-06-10 09:26:17 -07:00
2015-06-10 09:26:17 -07:00
2014-09-17 13:38:02 -07:00
2016-05-06 15:22:49 +02:00
2016-05-06 15:22:49 +02:00
2016-03-01 08:23:41 -08:00
2015-12-06 21:34:14 -05:00
2016-04-04 10:41:08 -07:00