From: Xueshi Hu <xueshi.hu@xxxxxxxxxx> When an IO error happens, reschedule_retry() will increase r1conf::nr_queued, which makes freeze_array() unblocked. However, before all r1bio in the memory pool are released, the memory pool should not be modified. Signed-off-by: Xueshi Hu <xueshi.hu@xxxxxxxxxx> --- drivers/md/raid1.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index dd25832eb045..ce48cb3af301 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -3298,6 +3298,13 @@ static int raid1_reshape(struct mddev *mddev) freeze_array(conf, 0); + if (unlikely(atomic_read(conf->nr_queued))) { + kfree(newpoolinfo); + mempool_exit(&newpool); + unfreeze_array(conf); + return -EBUSY; + } + /* ok, everything is stopped */ oldpool = conf->r1bio_pool; conf->r1bio_pool = newpool; -- 2.40.1