Commit ed2e063f authored by Yu Kuai's avatar Yu Kuai Committed by Song Liu
Browse files

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



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>
parent 3bfc3bcd
Loading
Loading
Loading
Loading
+28 −22
Original line number Diff line number Diff line
@@ -957,41 +957,47 @@ static void lower_barrier(struct r10conf *conf)
	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 bool wait_barrier(struct r10conf *conf, bool nowait)
{
	bool ret = true;

	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.
		 */
		/* Return false when nowait flag is set */
		if (nowait) {
			ret = false;
		} else {
			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--;