From mboxrd@z Thu Jan 1 00:00:00 1970 From: Guoqing Jiang Subject: [PATCH 08/14] md-cluster: set MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD before unregister thread Date: Fri, 24 Feb 2017 11:15:18 +0800 Message-ID: <1487906124-20107-9-git-send-email-gqjiang@suse.com> References: <1487906124-20107-1-git-send-email-gqjiang@suse.com> Return-path: In-Reply-To: <1487906124-20107-1-git-send-email-gqjiang@suse.com> Sender: linux-raid-owner@vger.kernel.org To: linux-raid@vger.kernel.org Cc: shli@fb.com, neilb@suse.de, Guoqing Jiang List-Id: linux-raid.ids After used sync way to handle METADATA_UPDATED msg, a deadlock could appear if stop a resyncing array. betalinux244:~ # ps aux|grep md|grep D root 17164 0.0 0.0 0 0 ? D Jan09 0:00 [md0_cluster_rec] root 18151 0.0 0.1 19852 2008 ? Ds Jan09 0:00 /sbin/mdadm -Ssq betalinux244:~ # cat /proc/17164/stack [] recv_daemon+0x1f5/0x590 [md_cluster] [] md_thread+0x130/0x150 [md_mod] [] kthread+0xbd/0xe0 [] ret_from_fork+0x3f/0x70 [] kthread+0x0/0xe0 [] 0xffffffffffffffff betalinux244:~ # cat /proc/18151/stack [] kthread_stop+0x59/0x130 [] md_unregister_thread+0x46/0x80 [md_mod] [] leave+0x81/0x120 [md_cluster] [] md_cluster_stop+0x14/0x30 [md_mod] [] bitmap_free+0x126/0x130 [md_mod] [] do_md_stop+0x356/0x5f0 [md_mod] [] md_ioctl+0x6fe/0x1680 [md_mod] [] blkdev_ioctl+0x258/0x920 [] block_ioctl+0x3d/0x40 [] do_vfs_ioctl+0x2cd/0x4a0 [] SyS_ioctl+0x74/0x80 [] entry_SYSCALL_64_fastpath+0x12/0x6d [] 0xffffffffffffffff Since md_unregister_thread(&cinfo->recv_thread) is blocked by recv_daemon -> process_recvd_msg -> process_metadata_update. To resolve the issue, MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD is also need to be set before unregister thread. Reviewed-by: NeilBrown Signed-off-by: Guoqing Jiang --- drivers/md/md-cluster.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c index 0aad477d1b20..5e2c54be6f30 100644 --- a/drivers/md/md-cluster.c +++ b/drivers/md/md-cluster.c @@ -932,6 +932,7 @@ static int join(struct mddev *mddev, int nodes) return 0; err: + set_bit(MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD, &cinfo->state); md_unregister_thread(&cinfo->recovery_thread); md_unregister_thread(&cinfo->recv_thread); lockres_free(cinfo->message_lockres); @@ -987,6 +988,7 @@ static int leave(struct mddev *mddev) if (cinfo->slot_number > 0 && mddev->recovery_cp != MaxSector) resync_bitmap(mddev); + set_bit(MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD, &cinfo->state); md_unregister_thread(&cinfo->recovery_thread); md_unregister_thread(&cinfo->recv_thread); lockres_free(cinfo->message_lockres); -- 2.6.2