Commit 7aad54e0 authored by Yu Kuai's avatar Yu Kuai Committed by Jialin Zhang
Browse files

md/raid10: factor out code from wait_barrier() to stop_waiting_barrier()

mainline inclusion
from mainline-v6.1-rc1
commit ed2e063f
category: bugfix
bugzilla: 188380, https://gitee.com/openeuler/kernel/issues/I6GISC
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=ed2e063f92c44c891ccd883e289dde6ca870edcc



--------------------------------

Currently the nasty condition in wait_barrier() is hard to read. This
patch factors out the condition into a function.

There are no functional changes.

Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
Acked-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Reviewed-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Acked-by: default avatarGuoqing Jiang <guoqing.jiang@linux.dev>
Signed-off-by: default avatarSong Liu <song@kernel.org>

conflict:
	drivers/md/raid10.c

Signed-off-by: default avatarLi Nan <linan122@huawei.com>
Reviewed-by: default avatarHou Tao <houtao1@huawei.com>
parent f8cecf7a
Loading
Loading
Loading
Loading
+27 −22
Original line number Diff line number Diff line
@@ -953,36 +953,41 @@ static void lower_barrier(struct r10conf *conf)
	spin_unlock_irqrestore(&conf->resync_lock, flags);
	wake_up(&conf->wait_barrier);
}
static bool stop_waiting_barrier(struct r10conf *conf)
{
	struct bio_list *bio_list = current->bio_list;

	/* barrier is dropped */
	if (!conf->barrier)
		return true;

	/*
	 * If there are already pending requests (preventing the barrier from
	 * rising completely), and the pre-process bio queue isn't empty, then
	 * don't wait, as we need to empty that queue to get the nr_pending
	 * count down.
	 */
	if (atomic_read(&conf->nr_pending) && bio_list &&
	    (!bio_list_empty(&bio_list[0]) || !bio_list_empty(&bio_list[1])))
		return true;

	/* move on if recovery thread is blocked by us */
	if (conf->mddev->thread->tsk == current &&
	    test_bit(MD_RECOVERY_RUNNING, &conf->mddev->recovery) &&
	    conf->nr_queued > 0)
		return true;

	return false;
}

static void wait_barrier(struct r10conf *conf)
{
	spin_lock_irq(&conf->resync_lock);
	if (conf->barrier) {
		struct bio_list *bio_list = current->bio_list;
		conf->nr_waiting++;
		/* Wait for the barrier to drop.
		 * However if there are already pending
		 * requests (preventing the barrier from
		 * rising completely), and the
		 * pre-process bio queue isn't empty,
		 * then don't wait, as we need to empty
		 * that queue to get the nr_pending
		 * count down.
		 */
		raid10_log(conf->mddev, "wait barrier");
		wait_event_lock_irq(conf->wait_barrier,
				    !conf->barrier ||
				    (atomic_read(&conf->nr_pending) &&
				     bio_list &&
				     (!bio_list_empty(&bio_list[0]) ||
				      !bio_list_empty(&bio_list[1]))) ||
				     /* move on if recovery thread is
				      * blocked by us
				      */
				     (conf->mddev->thread->tsk == current &&
				      test_bit(MD_RECOVERY_RUNNING,
					       &conf->mddev->recovery) &&
				      conf->nr_queued > 0),
				    stop_waiting_barrier(conf),
				    conf->resync_lock);
		conf->nr_waiting--;
		if (!conf->nr_waiting)