From nobody Sat Jul 25 23:41:40 2026 Received: from va-2-29.ptr.blmpb.com (va-2-29.ptr.blmpb.com [209.127.231.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B653033CE9A for ; Sat, 11 Jul 2026 10:04:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.127.231.29 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783764260; cv=none; b=fsAd0Xx5I/DDmKlpqxNUYtFj3V1xBGDFiAJ2FTluM4zM3kCTrsELGH2ksri17C9fBHK3/4sdbi5eaGMh+S745OQ0aGCgnjaQg/ITOj9zL1buQ/l8Oc0yK1WhxtMmCZnHIlyijbU3ERLMOEnI8s122JQrLjGkcnqoGp5Hmyx19wQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783764260; c=relaxed/simple; bh=zO9S3Uc7S2ENZZD/Yj6G28n9IT9h2LxDSHVCu7650wE=; h=From:Mime-Version:References:Message-Id:In-Reply-To:Content-Type: To:Cc:Date:Subject; b=F0ZBpDLsE0MZiRKXuLqVo62Bv+EDNe9IZtVuJx7Mid7lVnnbBsjQ0JyB2/3aeEEDHE4IafUBSaLtsqOgdF2uVI/83OXmkyN4nl/YiLi/XL7+pf7PiP/saaLEAh0C/Wtym05U6bdU/uYxcWTR25aPBh4hWWxCNB2XGXPT7I6OG3A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fnnas.com; spf=pass smtp.mailfrom=fnnas.com; dkim=pass (2048-bit key) header.d=fnnas-com.20200927.dkim.feishu.cn header.i=@fnnas-com.20200927.dkim.feishu.cn header.b=Eax8Ju0i; arc=none smtp.client-ip=209.127.231.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fnnas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fnnas.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=fnnas-com.20200927.dkim.feishu.cn header.i=@fnnas-com.20200927.dkim.feishu.cn header.b="Eax8Ju0i" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=s1; d=fnnas-com.20200927.dkim.feishu.cn; t=1783764250; h=from:subject:mime-version:from:date:message-id:subject:to:cc: reply-to:content-type:mime-version:in-reply-to:message-id; bh=4MCbwe4EZJW2QS9n0NC3Qy3hAR1knQgcIejgOVgPr3Q=; b=Eax8Ju0iTPe1Dv/SgwgPPyHu4saZfkQwzYd8Pi6FE3Oxd+facnmmsneUZFkMk54yTKZVRP mWRYoeldX+j7K/GQjOzrpp11veFH/5feulFSBh1pw0izBy+2g9+Sdynri3oHk3ml9yFj7N pVI3S9BCK7CpS4I1uq474iOdBAT73+WOakieZGTbS/MhqRmSyCyXNX7ijkrxjey0w2qrTS 41+Bwri6OUteELW7Gf/R9wlh9TB5NMAajNKmca++hcwvs+bl87FknGcFk8J3N06sOKfk48 o3d9bMJr+COc3GIwokxSYMbuykHxkjFoth7MHGyYcLyOaez6EiisD8eNzeJN0Q== From: "Chen Cheng" Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable References: <20260711100352.425177-1-chencheng@fnnas.com> Message-Id: <20260711100352.425177-2-chencheng@fnnas.com> In-Reply-To: <20260711100352.425177-1-chencheng@fnnas.com> X-Mailer: git-send-email 2.54.0 To: , Cc: , Date: Sat, 11 Jul 2026 18:03:50 +0800 Received: from fedora ([183.34.162.102]) by smtp.feishu.cn with ESMTPS; Sat, 11 Jul 2026 18:04:08 +0800 X-Lms-Return-Path: Subject: [PATCH v7 1/3] md: suspend array when sync_action=reshape X-Original-From: chencheng@fnnas.com Content-Type: text/plain; charset="utf-8" From: Chen Cheng raid10 needs to resize/swap r10bio_pool when reshape changes raid_disks, and, don't let new requests keep allocating r10bio objects from the old pool while that transition is in progress. suspend and lock array before mddev_start_reshape(), and resume it on exit. Other sync_action ops are unchanged. Signed-off-by: Chen Cheng --- drivers/md/md.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 096bb64e87bd..8ee2dcc116eb 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5261,25 +5261,32 @@ action_store(struct mddev *mddev, const char *page,= size_t len) enum sync_action action; =20 if (!mddev->pers || !mddev->pers->sync_request) return -EINVAL; =20 + action =3D md_sync_action_by_name(page); + if (action =3D=3D ACTION_RESHAPE) { + ret =3D mddev_suspend(mddev, true); + if (ret) + return ret; + } retry: if (work_busy(&mddev->sync_work)) flush_work(&mddev->sync_work); =20 ret =3D mddev_lock(mddev); - if (ret) + if (ret) { + if (action =3D=3D ACTION_RESHAPE) + mddev_resume(mddev); return ret; + } =20 if (work_busy(&mddev->sync_work)) { mddev_unlock(mddev); goto retry; } =20 - action =3D md_sync_action_by_name(page); - /* TODO: mdadm rely on "idle" to start sync_thread. */ if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) { switch (action) { case ACTION_FROZEN: md_frozen_sync_thread(mddev); @@ -5345,10 +5352,12 @@ action_store(struct mddev *mddev, const char *page,= size_t len) sysfs_notify_dirent_safe(mddev->sysfs_action); ret =3D len; =20 out: mddev_unlock(mddev); + if (action =3D=3D ACTION_RESHAPE) + mddev_resume(mddev); return ret; } =20 static struct md_sysfs_entry md_scan_mode =3D __ATTR_PREALLOC(sync_action, S_IRUGO|S_IWUSR, action_show, action_store); --=20 2.54.0 From nobody Sat Jul 25 23:41:40 2026 Received: from va-2-26.ptr.blmpb.com (va-2-26.ptr.blmpb.com [209.127.231.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 13BE5391E57 for ; Sat, 11 Jul 2026 10:04:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.127.231.26 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783764262; cv=none; b=uEUk58EYg0QxEsMEjHZSEN+XRv2VdozVMZYG3ie8hFw2VJ5nIxUr1O0HE0JS7gcrPKnCF5FfkeZcGJHdVx49E6iuoz7E83OgNCJwLBO0HYGN8PfXkakvTzXWbvM4ic30WvwuxXD+cX4HUxHSCi39ldDnM1tTEYOu1kn6pt6RYkA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783764262; c=relaxed/simple; bh=OkdnJ0d7xdGEvgkIP+6m7nFrO3UvDaoAn/l+lzOFzo8=; h=To:Cc:In-Reply-To:Subject:Date:Message-Id:Mime-Version:From: Content-Type:References; b=AloO4CYMoyRQi75OUC6cn9Ti7bPW+Wi07h8moerWhyP2a5Gk+mff4kCnWINbAUKd8PMqdzg+E8pc+WNPnnyBRlt6iYmcodA9EPH/X/vB7MCLFVnpjefZ8pBdnI/LXj0omqA2UWkRbr+JeJuXfc4JMHQXB/wD7aQgMRmEfanwzNo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fnnas.com; spf=pass smtp.mailfrom=fnnas.com; dkim=pass (2048-bit key) header.d=fnnas-com.20200927.dkim.feishu.cn header.i=@fnnas-com.20200927.dkim.feishu.cn header.b=dBUppYe5; arc=none smtp.client-ip=209.127.231.26 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fnnas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fnnas.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=fnnas-com.20200927.dkim.feishu.cn header.i=@fnnas-com.20200927.dkim.feishu.cn header.b="dBUppYe5" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=s1; d=fnnas-com.20200927.dkim.feishu.cn; t=1783764252; h=from:subject:mime-version:from:date:message-id:subject:to:cc: reply-to:content-type:mime-version:in-reply-to:message-id; bh=CZ4XJeXDz6R2be7oeLfzhGTSsj9mIXxjuuxV/Ds5cW4=; b=dBUppYe5j+ULiS1UkpToidDNhkUiFyB/CAaad7vaKYKFq5GG//jc0/j1g8tBMYg6pIndHF ETSAmfFZ4JFM/2VifOEiYYzi0KaFSvaUMiv3W6qINhItEQUGQG6zSTK/c+o+a3WHFDwIgR 49GBHpb4DjWlplTxnQspwtdM+bj31qirlH28rZ7GuKQ5xVmTQcNO71AhHhZMBBEFNVs+YQ Nw0Iv2xM3R7hL2UHpQL5iMokgl7IrqlBEHboab6Y4oO2F1npktFIU4TpqSyvZns/UQsgmG /jRRKH5qwC3uRu/wNnW+1vEMxAU+B13WDIOGhJjIbD9p28hjJvY3vKJuoiwWOg== To: , Cc: , X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260711100352.425177-1-chencheng@fnnas.com> Subject: [PATCH v7 2/3] md/raid10: resize r10bio_pool for reshape Date: Sat, 11 Jul 2026 18:03:51 +0800 Message-Id: <20260711100352.425177-3-chencheng@fnnas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 From: "Chen Cheng" Received: from fedora ([183.34.162.102]) by smtp.feishu.cn with ESMTPS; Sat, 11 Jul 2026 18:04:10 +0800 X-Original-From: chencheng@fnnas.com References: <20260711100352.425177-1-chencheng@fnnas.com> Content-Transfer-Encoding: quoted-printable X-Lms-Return-Path: Content-Type: text/plain; charset="utf-8" From: Chen Cheng When reshape grows raid_disks, the pool must also switch to new geometry object size , and allocate a new geometry size pool and replace the old. But not for shrinking reshape, because regular I/O can still use the prev geo for sectors that have not crossed reshape_progress yet. Signed-off-by: Chen Cheng --- drivers/md/raid10.c | 47 ++++++++++++++++++++++++++++++++------------- drivers/md/raid10.h | 2 +- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index cee5a253a281..db68fcc9e9be 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -101,17 +101,27 @@ static void end_reshape(struct r10conf *conf); static inline struct r10bio *get_resync_r10bio(struct bio *bio) { return get_resync_pages(bio)->raid_bio; } =20 -static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data) +static inline int calc_r10bio_size(unsigned int raid_disks) { - struct r10conf *conf =3D data; - int size =3D offsetof(struct r10bio, devs[conf->geo.raid_disks]); + return offsetof(struct r10bio, devs[raid_disks]); +} + +static mempool_t *create_r10bio_pool(unsigned int raid_disks) +{ + int size =3D calc_r10bio_size(raid_disks); =20 - /* allocate a r10bio with room for raid_disks entries in the - * bios array */ + return mempool_create_kmalloc_pool(NR_RAID_BIOS, size); +} + +static struct r10bio *alloc_r10bio(unsigned int raid_disks, gfp_t gfp_flag= s) +{ + int size =3D calc_r10bio_size(raid_disks); + + /* allocate a r10bio sized for current geometry */ return kzalloc(size, gfp_flags); } =20 #define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9) /* amount of memory to reserve for resync requests */ @@ -135,11 +145,11 @@ static void * r10buf_pool_alloc(gfp_t gfp_flags, void= *data) struct bio *bio; int j; int nalloc, nalloc_rp; struct resync_pages *rps; =20 - r10_bio =3D r10bio_pool_alloc(gfp_flags, conf); + r10_bio =3D alloc_r10bio(conf->geo.raid_disks, gfp_flags); if (!r10_bio) return NULL; =20 if (test_bit(MD_RECOVERY_SYNC, &conf->mddev->recovery) || test_bit(MD_RECOVERY_RESHAPE, &conf->mddev->recovery)) @@ -275,11 +285,11 @@ static void put_all_bios(struct r10conf *conf, struct= r10bio *r10_bio) static void free_r10bio(struct r10bio *r10_bio) { struct r10conf *conf =3D r10_bio->mddev->private; =20 put_all_bios(conf, r10_bio); - mempool_free(r10_bio, &conf->r10bio_pool); + mempool_free(r10_bio, conf->r10bio_pool); } =20 static void put_buf(struct r10bio *r10_bio) { struct r10conf *conf =3D r10_bio->mddev->private; @@ -1537,11 +1547,11 @@ static void raid10_write_request(struct mddev *mdde= v, struct bio *bio, static void __make_request(struct mddev *mddev, struct bio *bio, int secto= rs) { struct r10conf *conf =3D mddev->private; struct r10bio *r10_bio; =20 - r10_bio =3D mempool_alloc(&conf->r10bio_pool, GFP_NOIO); + r10_bio =3D mempool_alloc(conf->r10bio_pool, GFP_NOIO); =20 r10_bio->master_bio =3D bio; r10_bio->sectors =3D sectors; =20 r10_bio->mddev =3D mddev; @@ -1729,11 +1739,11 @@ static int raid10_handle_discard(struct mddev *mdde= v, struct bio *bio) last_stripe_index *=3D geo->far_copies; end_disk_offset =3D (bio_end & geo->chunk_mask) + (last_stripe_index << geo->chunk_shift); =20 retry_discard: - r10_bio =3D mempool_alloc(&conf->r10bio_pool, GFP_NOIO); + r10_bio =3D mempool_alloc(conf->r10bio_pool, GFP_NOIO); r10_bio->mddev =3D mddev; r10_bio->state =3D 0; r10_bio->sectors =3D 0; r10_bio->read_slot =3D -1; memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks); @@ -3830,11 +3840,11 @@ static int setup_geo(struct geom *geo, struct mddev= *mddev, enum geo_type new) static void raid10_free_conf(struct r10conf *conf) { if (!conf) return; =20 - mempool_exit(&conf->r10bio_pool); + mempool_destroy(conf->r10bio_pool); kfree(conf->mirrors); kfree(conf->mirrors_old); kfree(conf->mirrors_new); safe_put_page(conf->tmppage); bioset_exit(&conf->bio_split); @@ -3877,13 +3887,12 @@ static struct r10conf *setup_conf(struct mddev *mdd= ev) if (!conf->tmppage) goto out; =20 conf->geo =3D geo; conf->copies =3D copies; - err =3D mempool_init(&conf->r10bio_pool, NR_RAID_BIOS, r10bio_pool_alloc, - rbio_pool_free, conf); - if (err) + conf->r10bio_pool =3D create_r10bio_pool(conf->geo.raid_disks); + if (!conf->r10bio_pool) goto out; =20 err =3D bioset_init(&conf->bio_split, BIO_POOL_SIZE, 0, 0); if (err) goto out; @@ -4373,10 +4382,11 @@ static int raid10_start_reshape(struct mddev *mddev) struct geom new; struct r10conf *conf =3D mddev->private; struct md_rdev *rdev; int spares =3D 0; int ret; + mempool_t *new_pool =3D NULL; =20 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) return -EBUSY; =20 if (setup_geo(&new, mddev, geo_start) !=3D conf->copies) @@ -4409,10 +4419,15 @@ static int raid10_start_reshape(struct mddev *mddev) =20 if (spares < mddev->delta_disks) return -EINVAL; =20 conf->offset_diff =3D min_offset_diff; + if (mddev->delta_disks > 0) { + new_pool =3D create_r10bio_pool(new.raid_disks); + if (!new_pool) + return -ENOMEM; + } spin_lock_irq(&conf->device_lock); if (conf->mirrors_new) { memcpy(conf->mirrors_new, conf->mirrors, sizeof(struct raid10_info)*conf->prev.raid_disks); smp_mb(); @@ -4509,10 +4524,14 @@ static int raid10_start_reshape(struct mddev *mddev) mddev->degraded =3D calc_degraded(conf); spin_unlock_irq(&conf->device_lock); mddev->raid_disks =3D conf->geo.raid_disks; mddev->reshape_position =3D conf->reshape_progress; set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); + if (new_pool) { + mempool_destroy(conf->r10bio_pool); + conf->r10bio_pool =3D new_pool; + } =20 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); clear_bit(MD_RECOVERY_DONE, &mddev->recovery); set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); @@ -4531,10 +4550,12 @@ static int raid10_start_reshape(struct mddev *mddev) smp_wmb(); conf->reshape_progress =3D MaxSector; conf->reshape_safe =3D MaxSector; mddev->reshape_position =3D MaxSector; spin_unlock_irq(&conf->device_lock); + if (new_pool) + mempool_destroy(new_pool); return ret; } =20 /* Calculate the last device-address that could contain * any block from the chunk that includes the array-address 's' diff --git a/drivers/md/raid10.h b/drivers/md/raid10.h index ec79d87fb92f..b711626a5db7 100644 --- a/drivers/md/raid10.h +++ b/drivers/md/raid10.h @@ -85,11 +85,11 @@ struct r10conf { int have_replacement; /* There is at least one * replacement device. */ wait_queue_head_t wait_barrier; =20 - mempool_t r10bio_pool; + mempool_t *r10bio_pool; mempool_t r10buf_pool; struct page *tmppage; struct bio_set bio_split; =20 /* When taking over an array from a different personality, we store --=20 2.54.0 From nobody Sat Jul 25 23:41:40 2026 Received: from va-2-29.ptr.blmpb.com (va-2-29.ptr.blmpb.com [209.127.231.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B6BD38F23D for ; Sat, 11 Jul 2026 10:04:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.127.231.29 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783764267; cv=none; b=n2D0E7okxSNOEGlJt5+MoSX8x+VZy8gJfLD9FHP2wf33O/otx1+AegLjETamjCB2zs8/CAKICxDZXNhgdMz79CNoGY0J+MN0WmWHn0BsUvNfltWxLaRSdO+GTMrcmRlWj/o1QQzREvHEwwNcv82vsbALPUSSy6Ja31uAzz9G7ls= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783764267; c=relaxed/simple; bh=r8IfeEOcCJi5R2NC8d+Rfhj4t/E73A0H6FSdA/jiL+Q=; h=References:Message-Id:Content-Type:Subject:Cc:Date:In-Reply-To:To: Mime-Version:From; b=Uuw+a9xfvNO67AlQ71P87xIxqtqCxOBhNH+hc6ktiBi8zL50eAuO5Th4Bh9MDgwN2a+nHpgB9AuoNyNOQXZ5s+pWoW+Y5PPOdiDHi24h6MGhDGBz1VEoilWp5BZLEx61Pla/o9FiADG39pmqthyWtXSV/EoXaiMWMiBRt0L/smA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fnnas.com; spf=pass smtp.mailfrom=fnnas.com; dkim=pass (2048-bit key) header.d=fnnas-com.20200927.dkim.feishu.cn header.i=@fnnas-com.20200927.dkim.feishu.cn header.b=1+GEwDtV; arc=none smtp.client-ip=209.127.231.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fnnas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fnnas.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=fnnas-com.20200927.dkim.feishu.cn header.i=@fnnas-com.20200927.dkim.feishu.cn header.b="1+GEwDtV" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=s1; d=fnnas-com.20200927.dkim.feishu.cn; t=1783764258; h=from:subject:mime-version:from:date:message-id:subject:to:cc: reply-to:content-type:mime-version:in-reply-to:message-id; bh=+sMde1uXQQmrIm1HfL2pHUPWF3xcv3sDpvWsOMPmOCo=; b=1+GEwDtVZH//4/0XwX4VyzYTij5kDPmRzIJqYvZBegrk/q0M90WGjtbihJR3yvLm/jbT1I bapFZXX2zMQd+VhaNbdhwBDaSotAXOdXj7OgToISPEEdnBxywYCBcK/i1/rKc3lslqT/43 1AyzxFXroxnbjh8towYKgLWtBQXHckXITueKPFOPTQMvR738p1eNrlHpjN25jp0vl61ghJ YC/1UMLC/rdUzAXgKcQD0NI9IH76w9GISg9HOuK0sXJ6WtFhGSCHqapOsGXm0lMckCgXHb jmf3ksQPxXchdDnlO5MBSJuN0jVbXbSjdej/fK2EfFbUfRUv9ReFODv+zohLBQ== References: <20260711100352.425177-1-chencheng@fnnas.com> X-Original-From: chencheng@fnnas.com Message-Id: <20260711100352.425177-4-chencheng@fnnas.com> Content-Transfer-Encoding: quoted-printable Received: from fedora ([183.34.162.102]) by smtp.feishu.cn with ESMTPS; Sat, 11 Jul 2026 18:04:11 +0800 Subject: [PATCH v7 3/3] md/raid10: free r10bio before ending master_bio in raid_end_bio_io() and raid_end_discard_bio() Cc: , Date: Sat, 11 Jul 2026 18:03:52 +0800 In-Reply-To: <20260711100352.425177-1-chencheng@fnnas.com> X-Lms-Return-Path: To: , Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.54.0 From: "Chen Cheng" Content-Type: text/plain; charset="utf-8" From: Chen Cheng origin flow: bio_endio(master_bio); /* may drop active_io to zero */ allow_barrier(conf); free_r10bio(r10_bio); /* reads conf->geo, returns to pool */ one scenario is: CPU A (softirq, raid_end_bio_io) CPU B (action_store) --> reshape =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D bio_endio(master_bio) md_end_clone_io percpu_ref_put -> 0 wait_event wakeup, and, mddev_suspend return raid10_start_reshape: setup_geo(&conf->geo, new) ... mempool_destroy(old_pool) conf->r10bio_pool =3D new_pool allow_barrier(conf) free_r10bio(r10_bio) put_all_bios: for (i=3D0; igeo.raid_disks; i++) =3D=3D> old obj, new geo, OOB mempool_free(r10_bio, conf->r10bio_pool) =3D=3D> old-geometry obj freed into new pool so .. fix by reorder the flow: free_r10bio(r10_bio) allow_barrier(conf) bio_endio(master_bio) raid_end_discard_bio() is exactly the same. Signed-off-by: Chen Cheng --- drivers/md/raid10.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index db68fcc9e9be..d77f60db7660 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -329,24 +329,27 @@ static void reschedule_retry(struct r10bio *r10_bio) */ static void raid_end_bio_io(struct r10bio *r10_bio) { struct bio *bio =3D r10_bio->master_bio; struct r10conf *conf =3D r10_bio->mddev->private; + unsigned long state =3D r10_bio->state; + bool returned; =20 - if (!test_and_set_bit(R10BIO_Returned, &r10_bio->state)) { - if (!test_bit(R10BIO_Uptodate, &r10_bio->state)) - bio->bi_status =3D BLK_STS_IOERR; + returned =3D test_and_set_bit(R10BIO_Returned, &state); + if (!returned && !test_bit(R10BIO_Uptodate, &state)) + bio->bi_status =3D BLK_STS_IOERR; + + free_r10bio(r10_bio); + + if (!returned) bio_endio(bio); - } =20 /* * Wake up any possible resync thread that waits for the device * to go idle. */ allow_barrier(conf); - - free_r10bio(r10_bio); } =20 /* * Update disk head position estimator based on IRQ completion info. */ @@ -1579,13 +1582,15 @@ static void raid_end_discard_bio(struct r10bio *r10= bio) if (!test_bit(R10BIO_Discard, &r10bio->state)) { first_r10bio =3D (struct r10bio *)r10bio->master_bio; free_r10bio(r10bio); r10bio =3D first_r10bio; } else { + struct bio *master_bio =3D r10bio->master_bio; + md_write_end(r10bio->mddev); - bio_endio(r10bio->master_bio); free_r10bio(r10bio); + bio_endio(master_bio); break; } } } =20 --=20 2.54.0