raid5-cache: fix a deadlock in superblock write
authorShaohua Li <shli@fb.com>
Thu, 25 Aug 2016 17:09:39 +0000 (10:09 -0700)
committerShaohua Li <shli@fb.com>
Wed, 31 Aug 2016 16:05:18 +0000 (09:05 -0700)
commit8e018c21da3febb558586b48c8db0d6d66cb6593
tree70d8d62900570c7cade6a7554236f0014ee1e43e
parent86a1679860babbacd61fc1e8c0c0f43641d5860d
raid5-cache: fix a deadlock in superblock write

There is a potential deadlock in superblock write. Discard could zero data, so
before discard we must make sure superblock is updated to new log tail.
Updating superblock (either directly call md_update_sb() or depend on md
thread) must hold reconfig mutex. On the other hand, raid5_quiesce is called
with reconfig_mutex hold. The first step of raid5_quiesce() is waitting for all
IO finish, hence waitting for reclaim thread, while reclaim thread is calling
this function and waitting for reconfig mutex. So there is a deadlock. We
workaround this issue with a trylock. The downside of the solution is we could
miss discard if we can't take reconfig mutex. But this should happen rarely
(mainly in raid array stop), so miss discard shouldn't be a big problem.

Cc: NeilBrown <neilb@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/raid5-cache.c