Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8712e553 authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds
Browse files

[PATCH] md: make sure mdthreads will always respond to kthread_stop



There are still a couple of cases where md threads (the resync/recovery
thread) is not interruptible since the change to use kthreads.  All places
there it tests "signal_pending", it should also test kthread_should_stop,
as with this patch.

Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6693e74a
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
@@ -3568,7 +3568,8 @@ static void md_do_sync(mddev_t *mddev)
		mddev->curr_resync = 2;
		mddev->curr_resync = 2;


	try_again:
	try_again:
		if (signal_pending(current)) {
		if (signal_pending(current) ||
		    kthread_should_stop()) {
			flush_signals(current);
			flush_signals(current);
			set_bit(MD_RECOVERY_INTR, &mddev->recovery);
			set_bit(MD_RECOVERY_INTR, &mddev->recovery);
			goto skip;
			goto skip;
@@ -3590,8 +3591,9 @@ static void md_do_sync(mddev_t *mddev)
					 */
					 */
					continue;
					continue;
				prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE);
				prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE);
				if (!signal_pending(current)
				if (!signal_pending(current) &&
				    && mddev2->curr_resync >= mddev->curr_resync) {
				    !kthread_should_stop() &&
				    mddev2->curr_resync >= mddev->curr_resync) {
					printk(KERN_INFO "md: delaying resync of %s"
					printk(KERN_INFO "md: delaying resync of %s"
					       " until %s has finished resync (they"
					       " until %s has finished resync (they"
					       " share one or more physical units)\n",
					       " share one or more physical units)\n",
@@ -3697,7 +3699,7 @@ static void md_do_sync(mddev_t *mddev)
		}
		}




		if (signal_pending(current)) {
		if (signal_pending(current) || kthread_should_stop()) {
			/*
			/*
			 * got a signal, exit.
			 * got a signal, exit.
			 */
			 */