From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 748C232A3CA; Thu, 6 Nov 2025 12:08:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430892; cv=none; b=as5p8ZCZxHDpy2dtuRp4IAKGWCkOiofk58g5BHQVH4K6wd+nAlqohbS47gF7zdV7NUiinkLwNK6GJFACYMg7PZJXV7uEhgSJJnv1IVjRPg53huPKkzCjCSqHM2bPss0N3qFUx5rUH5wzfzNoqxqksxVhr6sW8FuJod0QPRjDyqc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430892; c=relaxed/simple; bh=xFos9lJAcfnoplZ0GiAcj3DYFFlQPMklkNPev8k/Tv0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=AOCurTnwUesMHc/XcCKr/2zwJ3H6QryELGAxpekvZc3fDHCIf0VeNjFQigyAB6FRKsxNMT87sQnSpVh6KlDp0r22SxiMcsCSi414Pc/0ixaVsUgtgzt0Ppg4pqZh5Tm8qFgH4Ny6u9DHtw6QLMGnlidK/cdeBkT43NnJTdD1DzM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYN6qgczKHMmC; Thu, 6 Nov 2025 20:07:52 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 9E2811A07BB; Thu, 6 Nov 2025 20:08:01 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S5; Thu, 06 Nov 2025 20:08:01 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 01/11] md/raid1: simplify uptodate handling in end_sync_write Date: Thu, 6 Nov 2025 19:59:25 +0800 Message-Id: <20251106115935.2148714-2-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S5 X-Coremail-Antispam: 1UD129KBjvJXoW7CFy7tF4UtrWUGFW5Xr4ruFg_yoW8XFyrp3 yUXFy5Ww43KFW5ZF4DGFWDZF1fKw1fJ3y7CrZrWw1fXFn8tF98G3WUXryYgFyDXFZ3CrW3 Zw1kKay5Aa13XFJanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHY14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAa c4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzV Aqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4UJwAm 72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYx C7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWUtVW8 ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r 1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij 64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr 0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r4j6F4UMIIF 0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUcjjkUUUUU= X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan In end_sync_write, r1bio state is always set to either R1BIO_WriteError or R1BIO_MadeGood. Consequently, put_sync_write_buf() never takes the 'else' branch that calls md_done_sync(), making the uptodate parameter have no practical effect. Pass 1 to put_sync_write_buf(). A more complete cleanup will be done in a follow-up patch. Signed-off-by: Li Nan Reviewed-by: Yu Kuai --- drivers/md/raid1.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 592a40233004..fbd39c44dc04 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2080,13 +2080,12 @@ static void put_sync_write_buf(struct r1bio *r1_bio= , int uptodate) =20 static void end_sync_write(struct bio *bio) { - int uptodate =3D !bio->bi_status; struct r1bio *r1_bio =3D get_resync_r1bio(bio); struct mddev *mddev =3D r1_bio->mddev; struct r1conf *conf =3D mddev->private; struct md_rdev *rdev =3D conf->mirrors[find_bio_disk(r1_bio, bio)].rdev; =20 - if (!uptodate) { + if (bio->bi_status) { abort_sync_write(mddev, r1_bio); set_bit(WriteErrorSeen, &rdev->flags); if (!test_and_set_bit(WantReplacement, &rdev->flags)) @@ -2099,7 +2098,7 @@ static void end_sync_write(struct bio *bio) set_bit(R1BIO_MadeGood, &r1_bio->state); } =20 - put_sync_write_buf(r1_bio, uptodate); + put_sync_write_buf(r1_bio, 1); } =20 static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0094032721F; Thu, 6 Nov 2025 12:08:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430887; cv=none; b=AkU1hn60M+aCD+hetk8H15zBgjbF9J/5GxkUj+C3ufwvu8aq/tmunRYrwsawLHReG33ADgXcNgPHg4+5FAE+HGMquvw+itBFcvN794brwhrD37icuqTeMqi9XpngmplNglBszuMoCf7vhjh05Nm4oiStsqqHcQ9cpLHvidQupUY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430887; c=relaxed/simple; bh=93E7Ch3vmR+BkGvbvEtHMgRB1LugShrXPUh+nho14NE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KxJRlIn75wK2VXEdsWGePgBTrf6NEeu53mw5TfsoK0/QO9Orp6bqq1RYF782TrD+6up7IscV8qMpS2YcdCGELyXnxbOvLOQtqqLKpJV47mVW1guSA2wZBpwQVdBHF7j8PWEqvkh2sC2jMs7XC/+jd4aYrJ7Er8SrXBLs81L6tkY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYC2mGmzYQtvJ; Thu, 6 Nov 2025 20:07:43 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id AED6C1A1CEC; Thu, 6 Nov 2025 20:08:01 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S6; Thu, 06 Nov 2025 20:08:01 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 02/11] md: factor error handling out of md_done_sync into helper Date: Thu, 6 Nov 2025 19:59:26 +0800 Message-Id: <20251106115935.2148714-3-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S6 X-Coremail-Antispam: 1UD129KBjvJXoW3Wr4UKF15CFWUJw1DGrWUCFg_yoW3Zr4Upa yDJFyrA3yjqFWava4DJFWDua4Fy34xtFZrtFW7uwn7X3Z8tryDGF1UX3WYqFyDAa4rurW3 Xa1DWFW5CFyfJF7anT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHY14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAa c4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzV Aqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4UJwAm 72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYx C7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWUtVW8 ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r 1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij 64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr 0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r4j6F4UMIIF 0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUHnQUUUUUU= X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan The 'ok' parameter in md_done_sync() is redundant for most callers that always pass 'true'. Factor error handling logic into a separate helper function md_sync_error() to eliminate unnecessary parameter passing and improve code clarity. No functional changes introduced. Signed-off-by: Li Nan Reviewed-by: Yu Kuai --- drivers/md/md.h | 3 ++- drivers/md/md.c | 17 ++++++++++------- drivers/md/raid1.c | 14 +++++++------- drivers/md/raid10.c | 11 ++++++----- drivers/md/raid5.c | 14 ++++++++------ 5 files changed, 33 insertions(+), 26 deletions(-) diff --git a/drivers/md/md.h b/drivers/md/md.h index 5d5f780b8447..18621dba09a9 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -910,7 +910,8 @@ extern const char *md_sync_action_name(enum sync_action= action); extern void md_write_start(struct mddev *mddev, struct bio *bi); extern void md_write_inc(struct mddev *mddev, struct bio *bi); extern void md_write_end(struct mddev *mddev); -extern void md_done_sync(struct mddev *mddev, int blocks, int ok); +extern void md_done_sync(struct mddev *mddev, int blocks); +extern void md_sync_error(struct mddev *mddev); extern void md_error(struct mddev *mddev, struct md_rdev *rdev); extern void md_finish_reshape(struct mddev *mddev); void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, diff --git a/drivers/md/md.c b/drivers/md/md.c index 6062e0deb616..1361f211a844 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8937,20 +8937,23 @@ static bool is_mddev_idle(struct mddev *mddev, int = init) return idle; } =20 -void md_done_sync(struct mddev *mddev, int blocks, int ok) +void md_done_sync(struct mddev *mddev, int blocks) { /* another "blocks" (512byte) blocks have been synced */ atomic_sub(blocks, &mddev->recovery_active); wake_up(&mddev->recovery_wait); - if (!ok) { - set_bit(MD_RECOVERY_INTR, &mddev->recovery); - set_bit(MD_RECOVERY_ERROR, &mddev->recovery); - md_wakeup_thread(mddev->thread); - // stop recovery, signal do_sync .... - } } EXPORT_SYMBOL(md_done_sync); =20 +void md_sync_error(struct mddev *mddev) +{ + // stop recovery, signal do_sync .... + set_bit(MD_RECOVERY_INTR, &mddev->recovery); + set_bit(MD_RECOVERY_ERROR, &mddev->recovery); + md_wakeup_thread(mddev->thread); +} +EXPORT_SYMBOL(md_sync_error); + /* md_write_start(mddev, bi) * If we need to update some array metadata (e.g. 'active' flag * in superblock) before writing, schedule a superblock update diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index fbd39c44dc04..e65d104cb9c5 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2062,7 +2062,7 @@ static void abort_sync_write(struct mddev *mddev, str= uct r1bio *r1_bio) } while (sectors_to_go > 0); } =20 -static void put_sync_write_buf(struct r1bio *r1_bio, int uptodate) +static void put_sync_write_buf(struct r1bio *r1_bio) { if (atomic_dec_and_test(&r1_bio->remaining)) { struct mddev *mddev =3D r1_bio->mddev; @@ -2073,7 +2073,7 @@ static void put_sync_write_buf(struct r1bio *r1_bio, = int uptodate) reschedule_retry(r1_bio); else { put_buf(r1_bio); - md_done_sync(mddev, s, uptodate); + md_done_sync(mddev, s); } } } @@ -2098,7 +2098,7 @@ static void end_sync_write(struct bio *bio) set_bit(R1BIO_MadeGood, &r1_bio->state); } =20 - put_sync_write_buf(r1_bio, 1); + put_sync_write_buf(r1_bio); } =20 static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector, @@ -2348,8 +2348,8 @@ static void sync_request_write(struct mddev *mddev, s= truct r1bio *r1_bio) if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) || !fix_sync_read_error(r1_bio)) { conf->recovery_disabled =3D mddev->recovery_disabled; - set_bit(MD_RECOVERY_INTR, &mddev->recovery); - md_done_sync(mddev, r1_bio->sectors, 0); + md_done_sync(mddev, r1_bio->sectors); + md_sync_error(mddev); put_buf(r1_bio); return; } @@ -2384,7 +2384,7 @@ static void sync_request_write(struct mddev *mddev, s= truct r1bio *r1_bio) submit_bio_noacct(wbio); } =20 - put_sync_write_buf(r1_bio, 1); + put_sync_write_buf(r1_bio); } =20 /* @@ -2575,7 +2575,7 @@ static void handle_sync_write_finished(struct r1conf = *conf, struct r1bio *r1_bio } } put_buf(r1_bio); - md_done_sync(conf->mddev, s, 1); + md_done_sync(conf->mddev, s); } =20 static void handle_write_finished(struct r1conf *conf, struct r1bio *r1_bi= o) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 14dcd5142eb4..231177cee928 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2276,7 +2276,7 @@ static void end_sync_request(struct r10bio *r10_bio) reschedule_retry(r10_bio); else put_buf(r10_bio); - md_done_sync(mddev, s, 1); + md_done_sync(mddev, s); break; } else { struct r10bio *r10_bio2 =3D (struct r10bio *)r10_bio->master_bio; @@ -2452,7 +2452,7 @@ static void sync_request_write(struct mddev *mddev, s= truct r10bio *r10_bio) =20 done: if (atomic_dec_and_test(&r10_bio->remaining)) { - md_done_sync(mddev, r10_bio->sectors, 1); + md_done_sync(mddev, r10_bio->sectors); put_buf(r10_bio); } } @@ -3757,7 +3757,7 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, /* pretend they weren't skipped, it makes * no important difference in this case */ - md_done_sync(mddev, sectors_skipped, 1); + md_done_sync(mddev, sectors_skipped); =20 return sectors_skipped + nr_sectors; giveup: @@ -4912,7 +4912,8 @@ static void reshape_request_write(struct mddev *mddev= , struct r10bio *r10_bio) if (!test_bit(R10BIO_Uptodate, &r10_bio->state)) if (handle_reshape_read_error(mddev, r10_bio) < 0) { /* Reshape has been aborted */ - md_done_sync(mddev, r10_bio->sectors, 0); + md_done_sync(mddev, r10_bio->sectors); + md_sync_error(mddev); return; } =20 @@ -5070,7 +5071,7 @@ static void end_reshape_request(struct r10bio *r10_bi= o) { if (!atomic_dec_and_test(&r10_bio->remaining)) return; - md_done_sync(r10_bio->mddev, r10_bio->sectors, 1); + md_done_sync(r10_bio->mddev, r10_bio->sectors); bio_put(r10_bio->master_bio); put_buf(r10_bio); } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 24b32a0c95b4..18415745e850 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -3723,11 +3723,13 @@ handle_failed_sync(struct r5conf *conf, struct stri= pe_head *sh, RAID5_STRIPE_SECTORS(conf), 0)) abort =3D 1; } - if (abort) - conf->recovery_disabled =3D - conf->mddev->recovery_disabled; } - md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf), !abort); + md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf)); + + if (abort) { + conf->recovery_disabled =3D conf->mddev->recovery_disabled; + md_sync_error(conf->mddev); + } } =20 static int want_replace(struct stripe_head *sh, int disk_idx) @@ -5156,7 +5158,7 @@ static void handle_stripe(struct stripe_head *sh) if ((s.syncing || s.replacing) && s.locked =3D=3D 0 && !test_bit(STRIPE_COMPUTE_RUN, &sh->state) && test_bit(STRIPE_INSYNC, &sh->state)) { - md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf), 1); + md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf)); clear_bit(STRIPE_SYNCING, &sh->state); if (test_and_clear_bit(R5_Overlap, &sh->dev[sh->pd_idx].flags)) wake_up_bit(&sh->dev[sh->pd_idx].flags, R5_Overlap); @@ -5223,7 +5225,7 @@ static void handle_stripe(struct stripe_head *sh) clear_bit(STRIPE_EXPAND_READY, &sh->state); atomic_dec(&conf->reshape_stripes); wake_up(&conf->wait_for_reshape); - md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf), 1); + md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf)); } =20 if (s.expanding && s.locked =3D=3D 0 && --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0070D3254B0; Thu, 6 Nov 2025 12:08:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430887; cv=none; b=MC9cv2Ns62IBwEn2Nw3/9vaeyT8ZEF67mKOHtnMlH+p9bLGGy+pCIk8cDsJlO7/RpxEGHlQ6ul7G3o3EemCwJFrsjcNDr7LhMrxAmNvTL9omQjds+ZT60tb6TdAqvNYnvJJOiuP8Pvg5K369XvH/hImOaPix53Vq4mJbIYy5dtI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430887; c=relaxed/simple; bh=qsztN/G2JU6gTcvqfrPQtK4Pg4W1AKhKd96jKu7Sf/M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Wt4ezFGI72M3gERrdvbwTlsnoCJQj1TgqyxCw4Wo2H7T2Hnt11hlrBnmFFeZK06pPovknR01iwbnSlBaltygOHzCr+TQpGgdGVhI0KVbYqdjTOYdbjoXv1ERDbk5TIKC+on6j3FKx7uhI4UnLuoboaLoMrQsWogoFtBK9Evu1CM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYC2zdjzYQtn9; Thu, 6 Nov 2025 20:07:43 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id B61781A1CE7; Thu, 6 Nov 2025 20:08:01 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S7; Thu, 06 Nov 2025 20:08:01 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 03/11] md/raid1,raid10: return actual write status in narrow_write_error Date: Thu, 6 Nov 2025 19:59:27 +0800 Message-Id: <20251106115935.2148714-4-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S7 X-Coremail-Antispam: 1UD129KBjvJXoWxJw43uw4rJrWkZr45KryUWrg_yoW5XFW5pr ZrWasayryUXF1rXF4DZFW7WasYk3yxtFW2yrs3Gwsru34FyF95Ga1jqryjgFyUuF9Ig3Wj qr15WrZruFn8JFUanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHY14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JrWl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAa c4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzV Aqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4UJwAm 72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYx C7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWUtVW8 ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r 1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij 64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr 0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r4j6F4UMIIF 0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUd5rcUUUUU= X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan narrow_write_error() currently returns true when setting badblocks fails. Instead, return actual status of all retried writes, succeeding only when all retried writes complete successfully. This gives upper layers accurate information about write outcomes. When setting badblocks fails, mark the device as faulty and return at once. No need to continue processing remaining sections in such cases. Signed-off-by: Li Nan --- drivers/md/raid1.c | 17 +++++++++-------- drivers/md/raid10.c | 15 +++++++++------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index e65d104cb9c5..090fe8f71224 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2541,11 +2541,15 @@ static bool narrow_write_error(struct r1bio *r1_bio= , int i) bio_trim(wbio, sector - r1_bio->sector, sectors); wbio->bi_iter.bi_sector +=3D rdev->data_offset; =20 - if (submit_bio_wait(wbio) < 0) + if (submit_bio_wait(wbio)) { /* failure! */ - ok =3D rdev_set_badblocks(rdev, sector, - sectors, 0) - && ok; + ok =3D false; + if (!rdev_set_badblocks(rdev, sector, sectors, 0)) { + md_error(mddev, rdev); + bio_put(wbio); + break; + } + } =20 bio_put(wbio); sect_to_write -=3D sectors; @@ -2596,10 +2600,7 @@ static void handle_write_finished(struct r1conf *con= f, struct r1bio *r1_bio) * errors. */ fail =3D true; - if (!narrow_write_error(r1_bio, m)) - md_error(conf->mddev, - conf->mirrors[m].rdev); - /* an I/O failed, we can't clear the bitmap */ + narrow_write_error(r1_bio, m); rdev_dec_pending(conf->mirrors[m].rdev, conf->mddev); } diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 231177cee928..9c43c380d7e8 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2820,11 +2820,15 @@ static bool narrow_write_error(struct r10bio *r10_b= io, int i) choose_data_offset(r10_bio, rdev); wbio->bi_opf =3D REQ_OP_WRITE; =20 - if (submit_bio_wait(wbio) < 0) + if (submit_bio_wait(wbio)) { /* Failure! */ - ok =3D rdev_set_badblocks(rdev, wsector, - sectors, 0) - && ok; + ok =3D false; + if (!rdev_set_badblocks(rdev, wsector, sectors, 0)) { + md_error(mddev, rdev); + bio_put(wbio); + break; + } + } =20 bio_put(wbio); sect_to_write -=3D sectors; @@ -2936,8 +2940,7 @@ static void handle_write_completed(struct r10conf *co= nf, struct r10bio *r10_bio) rdev_dec_pending(rdev, conf->mddev); } else if (bio !=3D NULL && bio->bi_status) { fail =3D true; - if (!narrow_write_error(r10_bio, m)) - md_error(conf->mddev, rdev); + narrow_write_error(r10_bio, m); rdev_dec_pending(rdev, conf->mddev); } bio =3D r10_bio->devs[m].repl_bio; --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 74728327202; Thu, 6 Nov 2025 12:08:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430892; cv=none; b=sDgAbco+jpOyJR+aASUxFwzuLSpAfdDgomFXv0iYiQ9uxNbL70QFCJWEGSoTGK35g8ZPsjT554cTe3qtEihQxEOus29RX9uWz3yyKq/eVT3hqviTQPFmedjrntZepwispO2ps9J/RvLNn9w94gLbUsnEcYHZVkfvl+OM1t6efCI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430892; c=relaxed/simple; bh=ZPRCQhuHwzTiYW6GrduHjYvkDNuFWGV5jc0LNVDKGAA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZpHwiLooTAAwp+OzU/YCb1TfkfQtPFzcodN3JG29nvgf1JBOnImVqIAw2IGHgiLM7VOs1BRDJJcRB0BbzkCEW117J7N0xQGf9SGKuUq7hspHt12lVjR2tAmqlRjjTeoIsb7CQyNinBsRWCGexoOIBCPOkcFwaQdWLxzFf7Hrvi4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYP19BGzKHMmR; Thu, 6 Nov 2025 20:07:53 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id D19791A1191; Thu, 6 Nov 2025 20:08:01 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S8; Thu, 06 Nov 2025 20:08:01 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 04/11] md/raid1,raid10: support narrow_write_error when badblocks is disabled Date: Thu, 6 Nov 2025 19:59:28 +0800 Message-Id: <20251106115935.2148714-5-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S8 X-Coremail-Antispam: 1UD129KBjvJXoW7uF1xGrWxAr13WFyfXF4xJFb_yoW8Kr4rpa s7GryfJ3yruFy0va17A34j93WFv3yfGFWUArW7Z39rur97GrZ7GF4vq345WF1jqFnxKF9F q3WUCrWUZF1kGFJanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAac4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0V AKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4U JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20V AGYxC7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWU tVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14 v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkG c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI 0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWx JwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbQeOt UUUUU== X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan When badblocks.shift < 0 (badblocks disabled), narrow_write_error() return false, preventing write error handling. Since narrow_write_error() only splits IO into smaller sizes and re-submits, it can work with badblocks disabled. Adjust to use the logical block size for block_sectors when badblocks is disabled, allowing narrow_write_error() to function in this case. Suggested-by: Kenta Akagi Signed-off-by: Li Nan Reviewed-by: Yu Kuai --- drivers/md/raid1.c | 8 ++++---- drivers/md/raid10.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 090fe8f71224..86df18df45e5 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2503,17 +2503,17 @@ static bool narrow_write_error(struct r1bio *r1_bio= , int i) * We currently own a reference on the rdev. */ =20 - int block_sectors; + int block_sectors, lbs =3D bdev_logical_block_size(rdev->bdev) >> 9; sector_t sector; int sectors; int sect_to_write =3D r1_bio->sectors; bool ok =3D true; =20 if (rdev->badblocks.shift < 0) - return false; + block_sectors =3D lbs; + else + block_sectors =3D roundup(1 << rdev->badblocks.shift, lbs); =20 - block_sectors =3D roundup(1 << rdev->badblocks.shift, - bdev_logical_block_size(rdev->bdev) >> 9); sector =3D r1_bio->sector; sectors =3D ((sector + block_sectors) & ~(sector_t)(block_sectors - 1)) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 9c43c380d7e8..fffc2c95660b 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2790,17 +2790,17 @@ static bool narrow_write_error(struct r10bio *r10_b= io, int i) * We currently own a reference to the rdev. */ =20 - int block_sectors; + int block_sectors, lbs =3D bdev_logical_block_size(rdev->bdev) >> 9; sector_t sector; int sectors; int sect_to_write =3D r10_bio->sectors; bool ok =3D true; =20 if (rdev->badblocks.shift < 0) - return false; + block_sectors =3D lbs; + else + block_sectors =3D roundup(1 << rdev->badblocks.shift, lbs); =20 - block_sectors =3D roundup(1 << rdev->badblocks.shift, - bdev_logical_block_size(rdev->bdev) >> 9); sector =3D r10_bio->sector; sectors =3D ((r10_bio->sector + block_sectors) & ~(sector_t)(block_sectors - 1)) --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 00824327202; Thu, 6 Nov 2025 12:08:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430886; cv=none; b=H5UaPQgn5OS970dVDeX6WBPIY8pDc++FhsXIeq4ugXfOlU70DL8FN6lRzaQsvXkZyS8cQTA5Y5/rCHa2SIT1z7FpiM9uDvOdc2UvdvtdubC8nyXZ4TwA1xwXucdFVRh3EQIHwonwdlvHJBGIOKsRD58RxnMWkYzajl3H6N/iY5Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430886; c=relaxed/simple; bh=hyIee1nD4eLJgBbBJZe2nLuyi28X1H0nQ4m/U5IQXfE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ADyyciYFsQQ12bsFwC4cmp48G5g2BIkXB09bUKEQcEOptda12XSw4smoVEJ0PGJ1J99GAFRpLLuwmTbxBzAO3UonrB2rbNjIGmvCViYmSSTOdBvMk4gJqj6UnCCNgrM8JGPBmn3cRNZ+0zrMwuGMCzZq+Ev6TKQmaDpoQYsvWmk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYC4NHszYQty1; Thu, 6 Nov 2025 20:07:43 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id E304B1A119D; Thu, 6 Nov 2025 20:08:01 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S9; Thu, 06 Nov 2025 20:08:01 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 05/11] md: mark rdev Faulty when badblocks setting fails Date: Thu, 6 Nov 2025 19:59:29 +0800 Message-Id: <20251106115935.2148714-6-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S9 X-Coremail-Antispam: 1UD129KBjvJXoWxKrWUXw15ZF47WrWxCw4UArb_yoW3Xw4kpw srWasayry5GryrZ3WDArWDWF9Ykw1xtFW2yrWaqw1xu3Z5Kr9xtFW8Xry3WFyDZFy3uF42 qFn8WrWDZFWDGFUanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAac4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0V AKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4U JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20V AGYxC7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWU tVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14 v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkG c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI 0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWx JwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbQeOt UUUUU== X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan Currently when sync read fails and badblocks set fails (exceeding 512 limit), rdev isn't immediately marked Faulty. Instead 'recovery_disabled' is set and non-In_sync rdevs are removed later. This preserves array availability if bad regions aren't read, but bad sectors might be read by users before rdev removal. This occurs due to incorrect resync/recovery_offset updates that include these bad sectors. When badblocks exceed 512, keeping the disk provides little benefit while adding complexity. Prompt disk replacement is more important. Therefore when badblocks set fails, directly call md_error to mark rdev Faulty immediately, preventing potential data access issues. After this change, cleanup of offset update logic and 'recovery_disabled' handling will follow. Fixes: 5e5702898e93 ("md/raid10: Handle read errors during recovery better.= ") Fixes: 3a9f28a5117e ("md/raid1: improve handling of read failure during rec= overy.") Signed-off-by: Li Nan Reviewed-by: Yu Kuai --- drivers/md/md.c | 8 +++++++- drivers/md/raid1.c | 20 +++++++++----------- drivers/md/raid10.c | 35 +++++++++++++++-------------------- drivers/md/raid5.c | 22 +++++++++------------- 4 files changed, 40 insertions(+), 45 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 1361f211a844..2bdbb5b0e9e1 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -10250,8 +10250,14 @@ bool rdev_set_badblocks(struct md_rdev *rdev, sect= or_t s, int sectors, else s +=3D rdev->data_offset; =20 - if (!badblocks_set(&rdev->badblocks, s, sectors, 0)) + if (!badblocks_set(&rdev->badblocks, s, sectors, 0)) { + /* + * Mark the disk as Faulty when setting badblocks fails, + * otherwise, bad sectors may be read. + */ + md_error(mddev, rdev); return false; + } =20 /* Make sure they get written out promptly */ if (test_bit(ExternalBbl, &rdev->flags)) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 86df18df45e5..a3e135a9391f 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2115,8 +2115,7 @@ static int r1_sync_page_io(struct md_rdev *rdev, sect= or_t sector, rdev->mddev->recovery); } /* need to record an error - either for the block or the device */ - if (!rdev_set_badblocks(rdev, sector, sectors, 0)) - md_error(rdev->mddev, rdev); + rdev_set_badblocks(rdev, sector, sectors, 0); return 0; } =20 @@ -2441,8 +2440,7 @@ static void fix_read_error(struct r1conf *conf, struc= t r1bio *r1_bio) if (!success) { /* Cannot read from anywhere - mark it bad */ struct md_rdev *rdev =3D conf->mirrors[read_disk].rdev; - if (!rdev_set_badblocks(rdev, sect, s, 0)) - md_error(mddev, rdev); + rdev_set_badblocks(rdev, sect, s, 0); break; } /* write it back and re-read */ @@ -2545,7 +2543,10 @@ static bool narrow_write_error(struct r1bio *r1_bio,= int i) /* failure! */ ok =3D false; if (!rdev_set_badblocks(rdev, sector, sectors, 0)) { - md_error(mddev, rdev); + /* + * Badblocks set failed, disk marked Faulty. + * No further operations needed. + */ bio_put(wbio); break; } @@ -2569,14 +2570,11 @@ static void handle_sync_write_finished(struct r1con= f *conf, struct r1bio *r1_bio if (bio->bi_end_io =3D=3D NULL) continue; if (!bio->bi_status && - test_bit(R1BIO_MadeGood, &r1_bio->state)) { + test_bit(R1BIO_MadeGood, &r1_bio->state)) rdev_clear_badblocks(rdev, r1_bio->sector, s, 0); - } if (bio->bi_status && - test_bit(R1BIO_WriteError, &r1_bio->state)) { - if (!rdev_set_badblocks(rdev, r1_bio->sector, s, 0)) - md_error(conf->mddev, rdev); - } + test_bit(R1BIO_WriteError, &r1_bio->state)) + rdev_set_badblocks(rdev, r1_bio->sector, s, 0); } put_buf(r1_bio); md_done_sync(conf->mddev, s); diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index fffc2c95660b..30a3434e9cbc 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2604,8 +2604,7 @@ static int r10_sync_page_io(struct md_rdev *rdev, sec= tor_t sector, &rdev->mddev->recovery); } /* need to record an error - either for the block or the device */ - if (!rdev_set_badblocks(rdev, sector, sectors, 0)) - md_error(rdev->mddev, rdev); + rdev_set_badblocks(rdev, sector, sectors, 0); return 0; } =20 @@ -2686,7 +2685,6 @@ static void fix_read_error(struct r10conf *conf, stru= ct mddev *mddev, struct r10 r10_bio->devs[slot].addr + sect, s, 0)) { - md_error(mddev, rdev); r10_bio->devs[slot].bio =3D IO_BLOCKED; } @@ -2824,7 +2822,10 @@ static bool narrow_write_error(struct r10bio *r10_bi= o, int i) /* Failure! */ ok =3D false; if (!rdev_set_badblocks(rdev, wsector, sectors, 0)) { - md_error(mddev, rdev); + /* + * Badblocks set failed, disk marked Faulty. + * No further operations needed. + */ bio_put(wbio); break; } @@ -2895,35 +2896,29 @@ static void handle_write_completed(struct r10conf *= conf, struct r10bio *r10_bio) if (r10_bio->devs[m].bio =3D=3D NULL || r10_bio->devs[m].bio->bi_end_io =3D=3D NULL) continue; - if (!r10_bio->devs[m].bio->bi_status) { + if (!r10_bio->devs[m].bio->bi_status) rdev_clear_badblocks( rdev, r10_bio->devs[m].addr, r10_bio->sectors, 0); - } else { - if (!rdev_set_badblocks( - rdev, - r10_bio->devs[m].addr, - r10_bio->sectors, 0)) - md_error(conf->mddev, rdev); - } + else + rdev_set_badblocks(rdev, + r10_bio->devs[m].addr, + r10_bio->sectors, 0); rdev =3D conf->mirrors[dev].replacement; if (r10_bio->devs[m].repl_bio =3D=3D NULL || r10_bio->devs[m].repl_bio->bi_end_io =3D=3D NULL) continue; =20 - if (!r10_bio->devs[m].repl_bio->bi_status) { + if (!r10_bio->devs[m].repl_bio->bi_status) rdev_clear_badblocks( rdev, r10_bio->devs[m].addr, r10_bio->sectors, 0); - } else { - if (!rdev_set_badblocks( - rdev, - r10_bio->devs[m].addr, - r10_bio->sectors, 0)) - md_error(conf->mddev, rdev); - } + else + rdev_set_badblocks(rdev, + r10_bio->devs[m].addr, + r10_bio->sectors, 0); } put_buf(r10_bio); } else { diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 18415745e850..187dc66629e6 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -2817,11 +2817,9 @@ static void raid5_end_read_request(struct bio * bi) else { clear_bit(R5_ReadError, &sh->dev[i].flags); clear_bit(R5_ReWrite, &sh->dev[i].flags); - if (!(set_bad - && test_bit(In_sync, &rdev->flags) - && rdev_set_badblocks( - rdev, sh->sector, RAID5_STRIPE_SECTORS(conf), 0))) - md_error(conf->mddev, rdev); + if (!(set_bad && test_bit(In_sync, &rdev->flags))) + rdev_set_badblocks(rdev, sh->sector, + RAID5_STRIPE_SECTORS(conf), 0); } } rdev_dec_pending(rdev, conf->mddev); @@ -3599,11 +3597,10 @@ handle_failed_stripe(struct r5conf *conf, struct st= ripe_head *sh, else rdev =3D NULL; if (rdev) { - if (!rdev_set_badblocks( - rdev, - sh->sector, - RAID5_STRIPE_SECTORS(conf), 0)) - md_error(conf->mddev, rdev); + rdev_set_badblocks(rdev, + sh->sector, + RAID5_STRIPE_SECTORS(conf), + 0); rdev_dec_pending(rdev, conf->mddev); } } @@ -5254,9 +5251,8 @@ static void handle_stripe(struct stripe_head *sh) if (test_and_clear_bit(R5_WriteError, &dev->flags)) { /* We own a safe reference to the rdev */ rdev =3D conf->disks[i].rdev; - if (!rdev_set_badblocks(rdev, sh->sector, - RAID5_STRIPE_SECTORS(conf), 0)) - md_error(conf->mddev, rdev); + rdev_set_badblocks(rdev, sh->sector, + RAID5_STRIPE_SECTORS(conf), 0); rdev_dec_pending(rdev, conf->mddev); } if (test_and_clear_bit(R5_MadeGood, &dev->flags)) { --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 747B832A3C6; Thu, 6 Nov 2025 12:08:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430893; cv=none; b=rlXs5FXlD+H1MjmjWkdJRoSGmcdMC0NNM8gKWgah4PR42VBDavYq3egjae6QvMOw+7AwUpQC/7clKYpefIZci4Sd9RdmQSyGF2Z0RWliflrBTjpqER3Mb71v0LIsOHTgADV+NM94t7tC8945pMCCTU5USeFUyEqyC3DEyBKOvEo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430893; c=relaxed/simple; bh=SlLECH3/lEwEV2GdbCXNnDqy6izCDYPydTuc7r+jMF8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=VHLGbf8m1UbpqzjjLfQ0ha2vGvJ1dmBZMRQNfaJsfdJxART3pZLL7X0SR13xuc1O3nJsihb9kPrZjb7n5TgCMIq9jRSMLVgk8iHIUvw9eh2nQuyBR620tfdS85n55UJHx/KWg9JzTA9/SYC1G7Uolw77/NoAoLULJG+Z41zhYYE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYP29jZzKHMmN; Thu, 6 Nov 2025 20:07:53 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 0013F1A0B2E; Thu, 6 Nov 2025 20:08:01 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S10; Thu, 06 Nov 2025 20:08:01 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 06/11] md: remove MD_RECOVERY_ERROR handling and simplify resync_offset update Date: Thu, 6 Nov 2025 19:59:30 +0800 Message-Id: <20251106115935.2148714-7-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S10 X-Coremail-Antispam: 1UD129KBjvJXoWxWw1kGr4DCw13AF17Kry5twb_yoW5CFWkpa 97AFnxtrW8AFW3ZayqqrykAFWrZw4jkFWqyFW3u397AFnYyF17GFyj93W7JFWqy3sYva1a q34rGF43ZF18Ww7anT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAac4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0V AKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4U JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20V AGYxC7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWU tVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14 v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkG c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI 0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWx JwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbQeOt UUUUU== X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan When sync IO failed and setting badblock also failed, unsynced disk might be kicked via setting 'recovery_disable' without Faulty flag. MD_RECOVERY_ERROR was set in md_sync_error() to prevent updating 'resync_offset', avoiding reading the failed sync sectors. Previous patch ensures disk is marked Faulty when badblock setting fails. Remove MD_RECOVERY_ERROR handling as it's no longer needed - failed sync sectors are unreadable either via badblock or Faulty disk. Simplify resync_offset update logic. Signed-off-by: Li Nan --- drivers/md/md.h | 2 -- drivers/md/md.c | 23 +++++------------------ 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/drivers/md/md.h b/drivers/md/md.h index 18621dba09a9..c5b5377e9049 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -644,8 +644,6 @@ enum recovery_flags { MD_RECOVERY_FROZEN, /* waiting for pers->start() to finish */ MD_RECOVERY_WAIT, - /* interrupted because io-error */ - MD_RECOVERY_ERROR, =20 /* flags determines sync action, see details in enum sync_action */ =20 diff --git a/drivers/md/md.c b/drivers/md/md.c index 2bdbb5b0e9e1..71988d8f5154 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8949,7 +8949,6 @@ void md_sync_error(struct mddev *mddev) { // stop recovery, signal do_sync .... set_bit(MD_RECOVERY_INTR, &mddev->recovery); - set_bit(MD_RECOVERY_ERROR, &mddev->recovery); md_wakeup_thread(mddev->thread); } EXPORT_SYMBOL(md_sync_error); @@ -9603,8 +9602,8 @@ void md_do_sync(struct md_thread *thread) wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active)); =20 if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && - !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && mddev->curr_resync >=3D MD_RESYNC_ACTIVE) { + /* All sync IO completes after recovery_active becomes 0 */ mddev->curr_resync_completed =3D mddev->curr_resync; sysfs_notify_dirent_safe(mddev->sysfs_completed); } @@ -9612,24 +9611,12 @@ void md_do_sync(struct md_thread *thread) =20 if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) && mddev->curr_resync > MD_RESYNC_ACTIVE) { + if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) + mddev->curr_resync =3D MaxSector; + if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { - if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { - if (mddev->curr_resync >=3D mddev->resync_offset) { - pr_debug("md: checkpointing %s of %s.\n", - desc, mdname(mddev)); - if (test_bit(MD_RECOVERY_ERROR, - &mddev->recovery)) - mddev->resync_offset =3D - mddev->curr_resync_completed; - else - mddev->resync_offset =3D - mddev->curr_resync; - } - } else - mddev->resync_offset =3D MaxSector; + mddev->resync_offset =3D mddev->curr_resync; } else { - if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) - mddev->curr_resync =3D MaxSector; if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) { rcu_read_lock(); --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7484832A3C9; Thu, 6 Nov 2025 12:08:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430893; cv=none; b=lpZdcvMJPAvCErxYGCiy/BULa4p45lbnNpKQ6xlDdhO4/K/OOgRrcrlvXt4bXIw+TM2wh9hGluygAXXn9plyzhbIAp3qaetcjxIoEvFco5fyTvjR5UlmFr4jxt+e4b84P1Su44Q3mjn0/zqQMw8WECA47AWiHXd8M5snCJW0aQw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430893; c=relaxed/simple; bh=4z4AAoxg3wDBA83KA+almwiGh7FzyQTNuQFiIMvLbZo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=eJKquf2LTgfweQdamZFLQrkdjcXFgDqAjXT5emgXg0IbKy9e44pvkdhgL4kyI+IE6nIfLYSldd4zCaYYPFRBV0tT3wqidhk0RZ9XxEymMJCVhLyR5oxSMurdENV3wH8aXO8pXFemlwwI5ao4lC00LApGukpZZH+SjJzzXGgVdXs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=none smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYP30Q3zKHMmN; Thu, 6 Nov 2025 20:07:53 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 1C9EF1A018D; Thu, 6 Nov 2025 20:08:02 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S11; Thu, 06 Nov 2025 20:08:01 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 07/11] md: factor out sync completion update into helper Date: Thu, 6 Nov 2025 19:59:31 +0800 Message-Id: <20251106115935.2148714-8-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S11 X-Coremail-Antispam: 1UD129KBjvJXoWxXF1fGr1kGF45AF1kWF43trb_yoWrZry3p3 yfKFnxGr1UXFW3XF47J3WkAFWrury8tryDtrW3W397Jr1fKrnrGFyY9w1UXryDA34kZr4Y q3y5Ww4DuF1xWw7anT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAac4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0V AKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4U JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20V AGYxC7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWU tVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14 v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkG c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI 0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWx JwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbQeOt UUUUU== X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan Repeatedly reading 'mddev->recovery' flags in md_do_sync() may introduce potential risk if this flag is modified during sync, leading to incorrect offset updates. Therefore, replace direct 'mddev->recovery' checks with 'action'. Move sync completion update logic into helper md_finish_sync(), which improves readability and maintainability. The reshape completion update remains safe as it only updated after successful reshape when MD_RECOVERY_INTR is not set and 'curr_resync' equals 'max_sectors'. Signed-off-by: Li Nan Reviewed-by: Yu Kuai --- drivers/md/md.c | 82 ++++++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 71988d8f5154..76fd9407e022 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9301,6 +9301,51 @@ static bool sync_io_within_limit(struct mddev *mddev) (raid_is_456(mddev) ? 8 : 128) * sync_io_depth(mddev); } =20 +/* + * Update sync offset and mddev status when sync completes + */ +static void md_finish_sync(struct mddev *mddev, enum sync_action action) +{ + struct md_rdev *rdev; + + switch (action) { + case ACTION_RESYNC: + case ACTION_REPAIR: + if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) + mddev->curr_resync =3D MaxSector; + mddev->resync_offset =3D mddev->curr_resync; + break; + case ACTION_RECOVER: + if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) + mddev->curr_resync =3D MaxSector; + rcu_read_lock(); + rdev_for_each_rcu(rdev, mddev) + if (mddev->delta_disks >=3D 0 && + rdev_needs_recovery(rdev, mddev->curr_resync)) + rdev->recovery_offset =3D mddev->curr_resync; + rcu_read_unlock(); + break; + case ACTION_RESHAPE: + if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && + mddev->delta_disks > 0 && + mddev->pers->finish_reshape && + mddev->pers->size && + !mddev_is_dm(mddev)) { + mddev_lock_nointr(mddev); + md_set_array_sectors(mddev, mddev->pers->size(mddev, 0, 0)); + mddev_unlock(mddev); + if (!mddev_is_clustered(mddev)) + set_capacity_and_notify(mddev->gendisk, + mddev->array_sectors); + } + break; + /* */ + case ACTION_CHECK: + default: + break; + } +} + #define SYNC_MARKS 10 #define SYNC_MARK_STEP (3*HZ) #define UPDATE_FREQUENCY (5*60*HZ) @@ -9316,7 +9361,6 @@ void md_do_sync(struct md_thread *thread) int last_mark,m; sector_t last_check; int skipped =3D 0; - struct md_rdev *rdev; enum sync_action action; const char *desc; struct blk_plug plug; @@ -9609,46 +9653,14 @@ void md_do_sync(struct md_thread *thread) } mddev->pers->sync_request(mddev, max_sectors, max_sectors, &skipped); =20 - if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) && - mddev->curr_resync > MD_RESYNC_ACTIVE) { - if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) - mddev->curr_resync =3D MaxSector; - - if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { - mddev->resync_offset =3D mddev->curr_resync; - } else { - if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && - test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) { - rcu_read_lock(); - rdev_for_each_rcu(rdev, mddev) - if (mddev->delta_disks >=3D 0 && - rdev_needs_recovery(rdev, mddev->curr_resync)) - rdev->recovery_offset =3D mddev->curr_resync; - rcu_read_unlock(); - } - } - } + if (mddev->curr_resync > MD_RESYNC_ACTIVE) + md_finish_sync(mddev, action); skip: /* set CHANGE_PENDING here since maybe another update is needed, * so other nodes are informed. It should be harmless for normal * raid */ set_mask_bits(&mddev->sb_flags, 0, BIT(MD_SB_CHANGE_PENDING) | BIT(MD_SB_CHANGE_DEVS)); - - if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && - !test_bit(MD_RECOVERY_INTR, &mddev->recovery) && - mddev->delta_disks > 0 && - mddev->pers->finish_reshape && - mddev->pers->size && - !mddev_is_dm(mddev)) { - mddev_lock_nointr(mddev); - md_set_array_sectors(mddev, mddev->pers->size(mddev, 0, 0)); - mddev_unlock(mddev); - if (!mddev_is_clustered(mddev)) - set_capacity_and_notify(mddev->gendisk, - mddev->array_sectors); - } - spin_lock(&mddev->lock); if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { /* We completed so min/max setting can be forgotten if used. */ --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7469E2F6176; Thu, 6 Nov 2025 12:08:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430893; cv=none; b=BVVWHpnLxdQ3VSCYB4MFS7+3eUaXPtPTEJxbOrgLHpxffvp1mYeUcLmlEo4Obc3O3uaCKjqlUWLM8OUcAqFC7k7cGIYU0RP2qUOSdjELYV6YvmPTdg/s1fU34Ha0GqrR3dcoKYu2m0sA8NO5UTLxfmcteDNdyWfYFLDSdpLFYak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430893; c=relaxed/simple; bh=jYhguLBaWZEky69DWVjCyUbBwLLlsERIB3mq+blY6Ys=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=eVcL0pfkeXzyigy+5XXxQMq6RM11/kIA8O3iQdGwKXWOHaoo76KMj/WroW6C0lvPxssjmq0S5RlZXn3b/4mE1Ggi9TIIUKJI/yyNplpOZ2tp/afwP/PPiCmoDISSlHz7cC0MTzrdnbzHgaK3HwFzQ1qoUqknPOXyGh2aTno9kNs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=none smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYP3WLLzKHMn1; Thu, 6 Nov 2025 20:07:53 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 301141A106D; Thu, 6 Nov 2025 20:08:02 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S12; Thu, 06 Nov 2025 20:08:01 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 08/11] md: move finish_reshape to md_finish_sync() Date: Thu, 6 Nov 2025 19:59:32 +0800 Message-Id: <20251106115935.2148714-9-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S12 X-Coremail-Antispam: 1UD129KBjvJXoW7Ww4Duw1DXFy5uw43Aw1fZwb_yoW8tr43pa yxtFn8Gr1UJrWaga1UXa4qka4F934xGrZrtFW3C34fJw1a9w1rJF1Y9a4DXFWvya4FyrW5 Xw45JrWUuF109aUanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAac4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0V AKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4U JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20V AGYxC7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWU tVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14 v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkG c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI 0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWx JwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbQeOt UUUUU== X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan finish_reshape implementations of raid10 and raid5 only update mddev and rdev configurations. Move these operations to md_finish_sync() as it is more appropriate. No functional changes. Signed-off-by: Li Nan Reviewed-by: Yu Kuai --- drivers/md/md.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 76fd9407e022..d97085a7f613 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9338,6 +9338,8 @@ static void md_finish_sync(struct mddev *mddev, enum = sync_action action) set_capacity_and_notify(mddev->gendisk, mddev->array_sectors); } + if (mddev->pers->finish_reshape) + mddev->pers->finish_reshape(mddev); break; /* */ case ACTION_CHECK: @@ -10140,7 +10142,7 @@ void md_reap_sync_thread(struct mddev *mddev) { struct md_rdev *rdev; sector_t old_dev_sectors =3D mddev->dev_sectors; - bool is_reshaped =3D false; + bool is_reshaped =3D test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); =20 /* resync has finished, collect result */ md_unregister_thread(mddev, &mddev->sync_thread); @@ -10156,12 +10158,6 @@ void md_reap_sync_thread(struct mddev *mddev) set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); } } - if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && - mddev->pers->finish_reshape) { - mddev->pers->finish_reshape(mddev); - if (mddev_is_clustered(mddev)) - is_reshaped =3D true; - } =20 /* If array is no-longer degraded, then any saved_raid_disk * information must be scrapped. @@ -10188,8 +10184,9 @@ void md_reap_sync_thread(struct mddev *mddev) * be changed by md_update_sb, and MD_RECOVERY_RESHAPE is cleared, * so it is time to update size across cluster. */ - if (mddev_is_clustered(mddev) && is_reshaped - && !test_bit(MD_CLOSING, &mddev->flags)) + if (mddev_is_clustered(mddev) && is_reshaped && + mddev->pers->finish_reshape && + !test_bit(MD_CLOSING, &mddev->flags)) mddev->cluster_ops->update_size(mddev, old_dev_sectors); /* flag recovery needed just to double check */ set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E46E032C92B; Thu, 6 Nov 2025 12:08:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430897; cv=none; b=UzvV+vJeVlTUGWdQoiyfpQPOgFeJfFzM7QWoRr7JvG1WPBBmYoz5EHvMlSh6UZm+LHsxAILGqwO44Ug4N4iISHeUpqVhr5n82cnEEiefpcJfyRqXIRmhnmRYnd1+RoRZYYu/pNCKC09sH8O5mrhFU2cSUx8pvupJXjOED+p3P6U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430897; c=relaxed/simple; bh=nKtxhoejEknn4V5i1b7tQPQVPpbTxPMqfdKksbnZBWE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=eM7/ByaJ9D/DAan59hnoBz3LEjH0cnSQDNkMm+iebmPu6NBUfL4YD+suaXgD0i0m7jBqskrrn5BbIQqqLLspAtQ4xuE8RIhyIiKSiijlO51cUfcgPrOP/HCWMxMTxaxdcPIi64CqRe9wKJcF6GW03LEWc9tR05+RNsAHLEpTiTI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=none smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYP3pZdzKHMmj; Thu, 6 Nov 2025 20:07:53 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 38BA41A1066; Thu, 6 Nov 2025 20:08:02 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S13; Thu, 06 Nov 2025 20:08:02 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 09/11] md/raid10: fix any_working flag handling in raid10_sync_request Date: Thu, 6 Nov 2025 19:59:33 +0800 Message-Id: <20251106115935.2148714-10-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S13 X-Coremail-Antispam: 1UD129KBjvdXoWrtFy7uFy8Zw47GF1fKry8Krg_yoWkKFXEka 45ZF4Yqr1I9r12yw15Cr1SvrWSva4DWan7Gr1Utry8Z34fZ3WFkr98uas5Xw15AF98XF90 kw10g34Sva1DujkaLaAFLSUrUUUUbb8apTn2vfkv8UJUUUU8Yxn0WfASr-VFAUDa7-sFnT 9fnUUIcSsGvfJTRUUUbL8FF20E14v26rWj6s0DM7CY07I20VC2zVCF04k26cxKx2IYs7xG 6rWj6s0DM7CIcVAFz4kK6r1j6r18M28IrcIa0xkI8VA2jI8067AKxVWUAVCq3wA2048vs2 IY020Ec7CjxVAFwI0_Xr0E3s1l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28E F7xvwVC0I7IYx2IY67AKxVWDJVCq3wA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr 1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s0D M2vYz4IE04k24VAvwVAKI4IrM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64 kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r1Y6r17McIj6I8E87Iv67AKxVW8Jr0_Cr1U McvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I64 8v4I1lFIxGxcIEc7CjxVA2Y2ka0xkIwI1lw4CEc2x0rVAKj4xxMxkF7I0En4kS14v26r1q 6r43MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI 0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUtVW8ZwCIc40Y 0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxV W8Jr0_Cr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWx JwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUvcSsGvfC2KfnxnUUI43ZEXa7VUbQeOt UUUUU== X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan In raid10_sync_request(), 'any_working' indicates if any IO will be submitted. When there's only one In_sync disk with badblocks, 'any_working' might be set to 1 but no IO is submitted. Fix it by setting 'any_working' after badblock checks. Fixes: e875ecea266a ("md/raid10 record bad blocks as needed during recovery= .") Signed-off-by: Li Nan Reviewed-by: Yu Kuai --- drivers/md/raid10.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 30a3434e9cbc..2a7817b23e25 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3400,7 +3400,6 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, !test_bit(In_sync, &rdev->flags)) continue; /* This is where we read from */ - any_working =3D 1; sector =3D r10_bio->devs[j].addr; =20 if (is_badblock(rdev, sector, max_sync, @@ -3415,6 +3414,7 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, continue; } } + any_working =3D 1; bio =3D r10_bio->devs[0].bio; bio->bi_next =3D biolist; biolist =3D bio; --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 430FD3254B8; Thu, 6 Nov 2025 12:08:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430887; cv=none; b=ceScLSMkQzZwT4PppoqWr16Xb4321UCuZYDQs351hRi4uMD2H5vqzewKvcCCEqf6xL419OcAkuLhZF9UgW/KxCegh/15nx+exLv60tQhOyYGCWkpwTOH0zyN1IVIRoMdXEBvdw0jXpxm4dbMQckMvMbOlUNDCVYGxB6WGetI+dk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430887; c=relaxed/simple; bh=TnQ2wO8ai43tWB3eMyqM74hj50x8gZ9TnzIQkKXAB+k=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TGrdoXzNiw0DuFgrZ2oOJYP6mUFmzTP2LfnX8anE6LWjUGdBfZZACKAnCLLde/zaEz2K3ZfkPZq99ghpFvCkfFpadMUkMPS+XsIdsm6vPJSWgQWpw9fftUfDqeRnFfU/wQZ5KHPT/ealGKqzHMgUJc2tY2G0kmwNg9bAfxDxm/g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYC6tFzzYQv2Q; Thu, 6 Nov 2025 20:07:43 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 478101A106A; Thu, 6 Nov 2025 20:08:02 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S14; Thu, 06 Nov 2025 20:08:02 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 10/11] md/raid10: cleanup skip handling in raid10_sync_request Date: Thu, 6 Nov 2025 19:59:34 +0800 Message-Id: <20251106115935.2148714-11-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S14 X-Coremail-Antispam: 1UD129KBjvJXoWxKw4UXFyrGw1UZFy7Zr18Zrb_yoWxGFy8pa nxJFZrt3y8X3yrJwn8AryUWFyFyrWfJay5tr47W34Ikwn3KrsrZFW8XF40qFyDWFyrXFy5 X3yDXr45CasxtFJanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHq14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAac4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0V AKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4U JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20V AGYxC7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWU tVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14 v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkG c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI 0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_ Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUQqX LUUUUU= X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan Skip a sector in raid10_sync_request() when it needs no syncing or no readable device exists. Current skip handling is unnecessary: - Use 'skip' label to reissue the next sector instead of return directly - Complete sync and return 'max_sectors' when multiple sectors are skipped due to badblocks The first is error-prone. For example, commit bc49694a9e8f ("md: pass in max_sectors for pers->sync_request()") removed redundant max_sector assignments. Since skip modifies max_sectors, `goto skip` leaves max_sectors equal to sector_nr after the jump, which is incorrect. The second causes sync to complete erroneously when no actual sync occurs. For recovery, recording badblocks and continue syncing subsequent sectors is more suitable. For resync, just skip bad sectors and syncing subsequent sectors. Clean up complex and unnecessary skip code. Return immediately when a sector should be skipped. Reduce code paths and lower regression risk. Fixes: bc49694a9e8f ("md: pass in max_sectors for pers->sync_request()") Signed-off-by: Li Nan Reviewed-by: Yu Kuai --- drivers/md/raid10.c | 96 +++++++++++---------------------------------- 1 file changed, 22 insertions(+), 74 deletions(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 2a7817b23e25..bd91db9d09fc 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3166,11 +3166,8 @@ static sector_t raid10_sync_request(struct mddev *md= dev, sector_t sector_nr, int i; int max_sync; sector_t sync_blocks; - sector_t sectors_skipped =3D 0; - int chunks_skipped =3D 0; sector_t chunk_mask =3D conf->geo.chunk_mask; int page_idx =3D 0; - int error_disk =3D -1; =20 /* * Allow skipping a full rebuild for incremental assembly @@ -3191,7 +3188,6 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, if (init_resync(conf)) return 0; =20 - skipped: if (sector_nr >=3D max_sector) { conf->cluster_sync_low =3D 0; conf->cluster_sync_high =3D 0; @@ -3243,33 +3239,12 @@ static sector_t raid10_sync_request(struct mddev *m= ddev, sector_t sector_nr, mddev->bitmap_ops->close_sync(mddev); close_sync(conf); *skipped =3D 1; - return sectors_skipped; + return 0; } =20 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) return reshape_request(mddev, sector_nr, skipped); =20 - if (chunks_skipped >=3D conf->geo.raid_disks) { - pr_err("md/raid10:%s: %s fails\n", mdname(mddev), - test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ? "resync" : "recovery"); - if (error_disk >=3D 0 && - !test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { - /* - * recovery fails, set mirrors.recovery_disabled, - * device shouldn't be added to there. - */ - conf->mirrors[error_disk].recovery_disabled =3D - mddev->recovery_disabled; - return 0; - } - /* - * if there has been nothing to do on any drive, - * then there is nothing to do at all. - */ - *skipped =3D 1; - return (max_sector - sector_nr) + sectors_skipped; - } - if (max_sector > mddev->resync_max) max_sector =3D mddev->resync_max; /* Don't do IO beyond here */ =20 @@ -3352,7 +3327,6 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, /* yep, skip the sync_blocks here, but don't assume * that there will never be anything to do here */ - chunks_skipped =3D -1; continue; } if (mrdev) @@ -3483,29 +3457,19 @@ static sector_t raid10_sync_request(struct mddev *m= ddev, sector_t sector_nr, for (k =3D 0; k < conf->copies; k++) if (r10_bio->devs[k].devnum =3D=3D i) break; - if (mrdev && !test_bit(In_sync, - &mrdev->flags) - && !rdev_set_badblocks( - mrdev, - r10_bio->devs[k].addr, - max_sync, 0)) - any_working =3D 0; - if (mreplace && - !rdev_set_badblocks( - mreplace, - r10_bio->devs[k].addr, - max_sync, 0)) - any_working =3D 0; - } - if (!any_working) { - if (!test_and_set_bit(MD_RECOVERY_INTR, - &mddev->recovery)) - pr_warn("md/raid10:%s: insufficient working devices for recovery.\n", - mdname(mddev)); - mirror->recovery_disabled - =3D mddev->recovery_disabled; - } else { - error_disk =3D i; + if (mrdev && + !test_bit(In_sync, &mrdev->flags)) + rdev_set_badblocks( + mrdev, + r10_bio->devs[k].addr, + max_sync, 0); + if (mreplace) + rdev_set_badblocks( + mreplace, + r10_bio->devs[k].addr, + max_sync, 0); + pr_warn("md/raid10:%s: cannot recovery sector %llu + %d.\n", + mdname(mddev), r10_bio->devs[k].addr, max_sync); } put_buf(r10_bio); if (rb2) @@ -3546,7 +3510,8 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, rb2->master_bio =3D NULL; put_buf(rb2); } - goto giveup; + *skipped =3D 1; + return max_sync; } } else { /* resync. Schedule a read for every block at this virt offset */ @@ -3570,7 +3535,7 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, &mddev->recovery)) { /* We can skip this block */ *skipped =3D 1; - return sync_blocks + sectors_skipped; + return sync_blocks; } if (sync_blocks < max_sync) max_sync =3D sync_blocks; @@ -3662,8 +3627,8 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, mddev); } put_buf(r10_bio); - biolist =3D NULL; - goto giveup; + *skipped =3D 1; + return max_sync; } } =20 @@ -3683,7 +3648,8 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, if (WARN_ON(!bio_add_page(bio, page, len, 0))) { bio->bi_status =3D BLK_STS_RESOURCE; bio_endio(bio); - goto giveup; + *skipped =3D 1; + return max_sync; } } nr_sectors +=3D len>>9; @@ -3751,25 +3717,7 @@ static sector_t raid10_sync_request(struct mddev *md= dev, sector_t sector_nr, } } =20 - if (sectors_skipped) - /* pretend they weren't skipped, it makes - * no important difference in this case - */ - md_done_sync(mddev, sectors_skipped); - - return sectors_skipped + nr_sectors; - giveup: - /* There is nowhere to write, so all non-sync - * drives must be failed or in resync, all drives - * have a bad block, so try the next chunk... - */ - if (sector_nr + max_sync < max_sector) - max_sector =3D sector_nr + max_sync; - - sectors_skipped +=3D (max_sector - sector_nr); - chunks_skipped ++; - sector_nr =3D max_sector; - goto skipped; + return nr_sectors; } =20 static sector_t --=20 2.39.2 From nobody Fri Dec 19 15:49:19 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 607243254BE; Thu, 6 Nov 2025 12:08:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430890; cv=none; b=iIcMC1/exZs6DSoWONtEh1wVBW+8jehua6O/hTR5h1sW052Vgf434GEhPjJvAjSC0jyOWlWQRtLh1CbQxxozFjBNoSdlmJJYYtpcxs9AQqxxmhbxgid0OVFdE1p8SCT0w7RbvjNIPd5CgoePQt3MN39/9cg6060tzmfqFwhzOZw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762430890; c=relaxed/simple; bh=4DOB4e0ZFpFX4linEplpmq8DthgmoJgwvzpTxRTkHNg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Nebu2A2QXJkOBcAAEBRzMPtgZvNzxe6/D3dEdt2S0xT5OwJ7wB06gGrtq2v52FMy+324WGesH+obDyKq9MeyMYUIR4HRTk9DcggRlo/QCd2jKAFXNiQSP9aei29l1DRpqPt/QN0kNbBjRTetncF83k/3l6OYRh9ycxH1YSyoOQs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=none smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4d2LYD0dzDzYQthh; Thu, 6 Nov 2025 20:07:44 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 65B161A018D; Thu, 6 Nov 2025 20:08:02 +0800 (CST) Received: from huaweicloud.com (unknown [10.50.87.129]) by APP2 (Coremail) with SMTP id Syh0CgCH3UWfjwxpEbabCw--.33933S15; Thu, 06 Nov 2025 20:08:02 +0800 (CST) From: linan666@huaweicloud.com To: song@kernel.org, yukuai@fnnas.com, neil@brown.name, namhyung@gmail.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, xni@redhat.com, k@mgml.me, linan666@huaweicloud.com, yangerkun@huawei.com, yi.zhang@huawei.com Subject: [PATCH v2 11/11] md: remove recovery_disabled Date: Thu, 6 Nov 2025 19:59:35 +0800 Message-Id: <20251106115935.2148714-12-linan666@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20251106115935.2148714-1-linan666@huaweicloud.com> References: <20251106115935.2148714-1-linan666@huaweicloud.com> 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 X-CM-TRANSID: Syh0CgCH3UWfjwxpEbabCw--.33933S15 X-Coremail-Antispam: 1UD129KBjvJXoWxKw1fZF4fXFy5Jr4xtF48Crg_yoWfCFW3pa nxJF9a9rWUXayFyF1DJFWDWFyrt3yUKa97tFyfW3y8Za43trWkXa95XFyUXFyDJFWFva1I q3Z5GrW5GF1IgaUanT9S1TB71UUUUUDqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUHq14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAac4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0V AKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr1j6F4U JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20V AGYxC7M4IIrI8v6xkF7I0E8cxan2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVWU tVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14 v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkG c2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI 0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_ Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUQqX LUUUUU= X-CM-SenderInfo: polqt0awwwqx5xdzvxpfor3voofrz/ Content-Type: text/plain; charset="utf-8" From: Li Nan 'recovery_disabled' logic is complex and confusing, originally intended to preserve raid in extreme scenarios. It was used in following cases: - When sync fails and setting badblocks also fails, kick out non-In_sync rdev and block spare rdev from joining to preserve raid [1] - When last backup is unavailable, prevent repeated add-remove of spares triggering recovery [2] The original issues are now resolved: - Error handlers in all raid types prevent last rdev from being kicked out - Disks with failed recovery are marked Faulty and can't re-join Therefore, remove 'recovery_disabled' as it's no longer needed. [1] 5389042ffa36 ("md: change managed of recovery_disabled.") [2] 4044ba58dd15 ("md: don't retry recovery of raid1 that fails due to erro= r on source drive.") Signed-off-by: Li Nan --- drivers/md/md.h | 6 ------ drivers/md/raid1.h | 5 ----- drivers/md/raid10.h | 5 ----- drivers/md/raid5.h | 1 - drivers/md/md.c | 3 --- drivers/md/raid1.c | 17 +++-------------- drivers/md/raid10.c | 8 -------- drivers/md/raid5.c | 10 +--------- 8 files changed, 4 insertions(+), 51 deletions(-) diff --git a/drivers/md/md.h b/drivers/md/md.h index c5b5377e9049..fdd091ad1cc3 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -493,12 +493,6 @@ struct mddev { int ok_start_degraded; =20 unsigned long recovery; - /* If a RAID personality determines that recovery (of a particular - * device) will fail due to a read error on the source device, it - * takes a copy of this number and does not attempt recovery again - * until this number changes. - */ - int recovery_disabled; =20 int in_sync; /* know to not need resync */ /* 'open_mutex' avoids races between 'md_open' and 'do_md_stop', so diff --git a/drivers/md/raid1.h b/drivers/md/raid1.h index 2ebe35aaa534..c98d43a7ae99 100644 --- a/drivers/md/raid1.h +++ b/drivers/md/raid1.h @@ -93,11 +93,6 @@ struct r1conf { */ int fullsync; =20 - /* When the same as mddev->recovery_disabled we don't allow - * recovery to be attempted as we expect a read error. - */ - int recovery_disabled; - mempool_t *r1bio_pool; mempool_t r1buf_pool; =20 diff --git a/drivers/md/raid10.h b/drivers/md/raid10.h index da00a55f7a55..ec79d87fb92f 100644 --- a/drivers/md/raid10.h +++ b/drivers/md/raid10.h @@ -18,11 +18,6 @@ struct raid10_info { struct md_rdev *rdev, *replacement; sector_t head_position; - int recovery_disabled; /* matches - * mddev->recovery_disabled - * when we shouldn't try - * recovering this device. - */ }; =20 struct r10conf { diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index eafc6e9ed6ee..eff2bba9d76f 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h @@ -640,7 +640,6 @@ struct r5conf { * (fresh device added). * Cleared when a sync completes. */ - int recovery_disabled; /* per cpu variables */ struct raid5_percpu __percpu *percpu; int scribble_disks; diff --git a/drivers/md/md.c b/drivers/md/md.c index d97085a7f613..4da89da82eb7 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -2579,9 +2579,6 @@ static int bind_rdev_to_array(struct md_rdev *rdev, s= truct mddev *mddev) list_add_rcu(&rdev->same_set, &mddev->disks); bd_link_disk_holder(rdev->bdev, mddev->gendisk); =20 - /* May as well allow recovery to be retried once */ - mddev->recovery_disabled++; - return 0; =20 fail: diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a3e135a9391f..8befaf094cfd 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1760,7 +1760,6 @@ static void raid1_error(struct mddev *mddev, struct m= d_rdev *rdev) set_bit(MD_BROKEN, &mddev->flags); =20 if (!mddev->fail_last_dev) { - conf->recovery_disabled =3D mddev->recovery_disabled; spin_unlock_irqrestore(&conf->device_lock, flags); return; } @@ -1904,7 +1903,6 @@ static bool raid1_remove_conf(struct r1conf *conf, in= t disk) =20 /* Only remove non-faulty devices if recovery is not possible. */ if (!test_bit(Faulty, &rdev->flags) && - rdev->mddev->recovery_disabled !=3D conf->recovery_disabled && rdev->mddev->degraded < conf->raid_disks) return false; =20 @@ -1924,9 +1922,6 @@ static int raid1_add_disk(struct mddev *mddev, struct= md_rdev *rdev) int first =3D 0; int last =3D conf->raid_disks - 1; =20 - if (mddev->recovery_disabled =3D=3D conf->recovery_disabled) - return -EBUSY; - if (rdev->raid_disk >=3D 0) first =3D last =3D rdev->raid_disk; =20 @@ -2346,7 +2341,6 @@ static void sync_request_write(struct mddev *mddev, s= truct r1bio *r1_bio) */ if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) || !fix_sync_read_error(r1_bio)) { - conf->recovery_disabled =3D mddev->recovery_disabled; md_done_sync(mddev, r1_bio->sectors); md_sync_error(mddev); put_buf(r1_bio); @@ -2953,16 +2947,12 @@ static sector_t raid1_sync_request(struct mddev *md= dev, sector_t sector_nr, *skipped =3D 1; put_buf(r1_bio); =20 - if (!ok) { - /* Cannot record the badblocks, so need to + if (!ok) + /* Cannot record the badblocks, md_error has set INTR, * abort the resync. - * If there are multiple read targets, could just - * fail the really bad ones ??? */ - conf->recovery_disabled =3D mddev->recovery_disabled; - set_bit(MD_RECOVERY_INTR, &mddev->recovery); return 0; - } else + else return min_bad; =20 } @@ -3149,7 +3139,6 @@ static struct r1conf *setup_conf(struct mddev *mddev) init_waitqueue_head(&conf->wait_barrier); =20 bio_list_init(&conf->pending_bio_list); - conf->recovery_disabled =3D mddev->recovery_disabled - 1; =20 err =3D -EIO; for (i =3D 0; i < conf->raid_disks * 2; i++) { diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index bd91db9d09fc..b5a0f905229e 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2130,8 +2130,6 @@ static int raid10_add_disk(struct mddev *mddev, struc= t md_rdev *rdev) mirror =3D first; for ( ; mirror <=3D last ; mirror++) { p =3D &conf->mirrors[mirror]; - if (p->recovery_disabled =3D=3D mddev->recovery_disabled) - continue; if (p->rdev) { if (test_bit(WantReplacement, &p->rdev->flags) && p->replacement =3D=3D NULL && repl_slot < 0) @@ -2143,7 +2141,6 @@ static int raid10_add_disk(struct mddev *mddev, struc= t md_rdev *rdev) if (err) return err; p->head_position =3D 0; - p->recovery_disabled =3D mddev->recovery_disabled - 1; rdev->raid_disk =3D mirror; err =3D 0; if (rdev->saved_raid_disk !=3D mirror) @@ -2196,7 +2193,6 @@ static int raid10_remove_disk(struct mddev *mddev, st= ruct md_rdev *rdev) * is not possible. */ if (!test_bit(Faulty, &rdev->flags) && - mddev->recovery_disabled !=3D p->recovery_disabled && (!p->replacement || p->replacement =3D=3D rdev) && number < conf->geo.raid_disks && enough(conf, -1)) { @@ -2535,8 +2531,6 @@ static void fix_recovery_read_error(struct r10bio *r1= 0_bio) pr_notice("md/raid10:%s: recovery aborted due to read error\n", mdname(mddev)); =20 - conf->mirrors[dw].recovery_disabled - =3D mddev->recovery_disabled; set_bit(MD_RECOVERY_INTR, &mddev->recovery); break; @@ -4079,8 +4073,6 @@ static int raid10_run(struct mddev *mddev) disk->replacement->saved_raid_disk < 0) { conf->fullsync =3D 1; } - - disk->recovery_disabled =3D mddev->recovery_disabled - 1; } =20 if (mddev->resync_offset !=3D MaxSector) diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 187dc66629e6..e06cf20be7c2 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -2918,7 +2918,6 @@ static void raid5_error(struct mddev *mddev, struct m= d_rdev *rdev) =20 if (has_failed(conf)) { set_bit(MD_BROKEN, &conf->mddev->flags); - conf->recovery_disabled =3D mddev->recovery_disabled; =20 pr_crit("md/raid:%s: Cannot continue operation (%d/%d failed).\n", mdname(mddev), mddev->degraded, conf->raid_disks); @@ -3723,10 +3722,8 @@ handle_failed_sync(struct r5conf *conf, struct strip= e_head *sh, } md_done_sync(conf->mddev, RAID5_STRIPE_SECTORS(conf)); =20 - if (abort) { - conf->recovery_disabled =3D conf->mddev->recovery_disabled; + if (abort) md_sync_error(conf->mddev); - } } =20 static int want_replace(struct stripe_head *sh, int disk_idx) @@ -7530,8 +7527,6 @@ static struct r5conf *setup_conf(struct mddev *mddev) } =20 conf->bypass_threshold =3D BYPASS_THRESHOLD; - conf->recovery_disabled =3D mddev->recovery_disabled - 1; - conf->raid_disks =3D mddev->raid_disks; if (mddev->reshape_position =3D=3D MaxSector) conf->previous_raid_disks =3D mddev->raid_disks; @@ -8204,7 +8199,6 @@ static int raid5_remove_disk(struct mddev *mddev, str= uct md_rdev *rdev) * isn't possible. */ if (!test_bit(Faulty, &rdev->flags) && - mddev->recovery_disabled !=3D conf->recovery_disabled && !has_failed(conf) && (!p->replacement || p->replacement =3D=3D rdev) && number < conf->raid_disks) { @@ -8265,8 +8259,6 @@ static int raid5_add_disk(struct mddev *mddev, struct= md_rdev *rdev) =20 return 0; } - if (mddev->recovery_disabled =3D=3D conf->recovery_disabled) - return -EBUSY; =20 if (rdev->saved_raid_disk < 0 && has_failed(conf)) /* no point adding a device */ --=20 2.39.2