Unverified Commit 5330f4a6 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!10435 md/raid5: fix deadlock that raid5d() wait for itself to clear MD_SB_CHANGE_PENDING

parents 3f7a8509 da768b9c
Loading
Loading
Loading
Loading
+3 −12
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@
 */

#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/raid/pq.h>
#include <linux/async_tx.h>
@@ -6476,6 +6475,9 @@ static void raid5d(struct md_thread *thread)
		int batch_size, released;
		unsigned int offset;

		if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags))
			break;

		released = release_stripe_list(conf, conf->temp_inactive_list);
		if (released)
			clear_bit(R5_DID_ALLOC, &conf->cache_state);
@@ -6512,18 +6514,7 @@ static void raid5d(struct md_thread *thread)
			spin_unlock_irq(&conf->device_lock);
			md_check_recovery(mddev);
			spin_lock_irq(&conf->device_lock);

			/*
			 * Waiting on MD_SB_CHANGE_PENDING below may deadlock
			 * seeing md_check_recovery() is needed to clear
			 * the flag when using mdmon.
			 */
			continue;
		}

		wait_event_lock_irq(mddev->sb_wait,
			!test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags),
			conf->device_lock);
	}
	pr_debug("%d stripes handled\n", handled);