Re: [PATCH 4/7] md/raid10: raid10_write_request() drops the barrier before calling
From: yu kuai
Date: Wed Jun 24 2026 - 03:28:38 EST
Hi,
在 2026/6/23 15:24, Abd-Alrhman Masalkhi 写道:
> bio_submit_split_bioset() and reacquires it afterwards. This is
> unnecessary because bio_submit_split_bioset() does not require
> releasing the barrier protection.
Why is this safe?
It's possible plug is not enabled in this context, and the allocated new
aplit bio will be submitted and enter wait_barrier() again. wait_barrier()
is not supposed to be called recursively. Otherwise deadlock can happend:
t1: sync_thread grab barrier and waiting for nr_pending to be 0 from raise_barrier()
t2: wait_barrier() first inc nr_pending, then recursive wait_barrier() waiting
for barrier to be released.
>
> Remove the redundant allow_barrier()/wait_barrier() pair around
> bio_submit_split_bioset().
>
> Signed-off-by: Abd-Alrhman Masalkhi <abd.masalkhi@xxxxxxxxx>
> ---
> drivers/md/raid10.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
> index 840f0446c231..4bc1d5553ec7 100644
> --- a/drivers/md/raid10.c
> +++ b/drivers/md/raid10.c
> @@ -1493,10 +1493,8 @@ static bool raid10_write_request(struct mddev *mddev, struct bio *bio,
> if (atomic)
> goto err_handle;
>
> - allow_barrier(conf);
> bio = bio_submit_split_bioset(bio, r10_bio->sectors,
> &conf->bio_split);
> - wait_barrier(conf, false);
> if (!bio) {
> set_bit(R10BIO_Returned, &r10_bio->state);
> goto err_handle;
--
Thanks,
Kuai