From: NeilBrown Date: Thu, 14 Nov 2013 04:16:17 +0000 (+1100) Subject: md/raid5: avoid deadlock when raid5 array has unack badblocks during md_stop_writes. X-Git-Tag: v3.13-rc1~31^2~9 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30b8feb730f9b9b3c5de02580897da03f59b6b16;p=pandora-kernel.git md/raid5: avoid deadlock when raid5 array has unack badblocks during md_stop_writes. When raid5 recovery hits a fresh badblock, this badblock will flagged as unack badblock until md_update_sb() is called. But md_stop will take reconfig lock which means raid5d can't call md_update_sb() in md_check_recovery(), the badblock will always be unack, so raid5d thread enters an infinite loop and md_stop_write() can never stop sync_thread. This causes deadlock. To solve this, when STOP_ARRAY ioctl is issued and sync_thread is running, we need set md->recovery FROZEN and INTR flags and wait for sync_thread to stop before we (re)take reconfig lock. This requires that raid5 reshape_request notices MD_RECOVERY_INTR (which it probably should have noticed anyway) and stops waiting for a metadata update in that case. Reported-by: Jianpeng Ma Reported-by: Bian Yu Signed-off-by: NeilBrown --- Reading git-diff-tree failed