From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 926CCC001DF for ; Thu, 3 Aug 2023 13:27:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235615AbjHCN1q (ORCPT ); Thu, 3 Aug 2023 09:27:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47326 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235243AbjHCN1e (ORCPT ); Thu, 3 Aug 2023 09:27:34 -0400 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 095592109; Thu, 3 Aug 2023 06:27:30 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4RGqQN3bKKz4f3lXd; Thu, 3 Aug 2023 21:27:24 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S5; Thu, 03 Aug 2023 21:27:27 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 01/13] md: remove rdev flag 'RemoveSynchronized' Date: Thu, 3 Aug 2023 21:24:14 +0800 Message-Id: <20230803132426.2688608-2-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S5 X-Coremail-Antispam: 1UD129KBjvJXoW3Wr4xGFWDZrW7JrWxXF1UKFg_yoWxGryfpw s3XFy3Cw48Aw42qw4DtrW7Ca4rX3W7KayUCr93u34fZa4fAryDX348JFy5Ar90qFZ3Aa1F vF1UJw4DCF1xuF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9m14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26r1I6r4UM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrwCFx2 IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v2 6r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67 AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IY s7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr 0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUqAp5UUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai When multiple rdevs are removed from array in remove_and_add_spares(), which is only possible from daemon thread(user can only remove one rdev through ioctl/sysfs at one time), the flag is used to avoid calling synchronize_rcu() multiple times for each rdev. However, remove rdev from daemon thread really is super cold path, while removing n rdevs, it doesn't matter sync rcu n times or just one time. Hence remove this flag and make code simpler. Signed-off-by: Yu Kuai --- drivers/md/md-multipath.c | 15 +++++++-------- drivers/md/md.c | 26 ++------------------------ drivers/md/md.h | 5 ----- drivers/md/raid1.c | 15 +++++++-------- drivers/md/raid10.c | 15 +++++++-------- drivers/md/raid5.c | 15 +++++++-------- 6 files changed, 30 insertions(+), 61 deletions(-) diff --git a/drivers/md/md-multipath.c b/drivers/md/md-multipath.c index d22276870283..9e4ddd5240cd 100644 --- a/drivers/md/md-multipath.c +++ b/drivers/md/md-multipath.c @@ -258,14 +258,13 @@ static int multipath_remove_disk(struct mddev *mddev,= struct md_rdev *rdev) goto abort; } p->rdev =3D NULL; - if (!test_bit(RemoveSynchronized, &rdev->flags)) { - synchronize_rcu(); - if (atomic_read(&rdev->nr_pending)) { - /* lost the race, try later */ - err =3D -EBUSY; - p->rdev =3D rdev; - goto abort; - } + + synchronize_rcu(); + if (atomic_read(&rdev->nr_pending)) { + /* lost the race, try later */ + err =3D -EBUSY; + p->rdev =3D rdev; + goto abort; } err =3D md_integrity_register(mddev); } diff --git a/drivers/md/md.c b/drivers/md/md.c index a3d98273b295..cd7ac1dee3b8 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9155,7 +9155,6 @@ static int remove_and_add_spares(struct mddev *mddev, struct md_rdev *rdev; int spares =3D 0; int removed =3D 0; - bool remove_some =3D false; =20 if (this && test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) /* Mustn't remove devices when resync thread is running */ @@ -9165,28 +9164,9 @@ static int remove_and_add_spares(struct mddev *mddev, if ((this =3D=3D NULL || rdev =3D=3D this) && rdev->raid_disk >=3D 0 && !test_bit(Blocked, &rdev->flags) && - test_bit(Faulty, &rdev->flags) && + !test_bit(In_sync, &rdev->flags) && + !test_bit(Journal, &rdev->flags) && atomic_read(&rdev->nr_pending)=3D=3D0) { - /* Faulty non-Blocked devices with nr_pending =3D=3D 0 - * never get nr_pending incremented, - * never get Faulty cleared, and never get Blocked set. - * So we can synchronize_rcu now rather than once per device - */ - remove_some =3D true; - set_bit(RemoveSynchronized, &rdev->flags); - } - } - - if (remove_some) - synchronize_rcu(); - rdev_for_each(rdev, mddev) { - if ((this =3D=3D NULL || rdev =3D=3D this) && - rdev->raid_disk >=3D 0 && - !test_bit(Blocked, &rdev->flags) && - ((test_bit(RemoveSynchronized, &rdev->flags) || - (!test_bit(In_sync, &rdev->flags) && - !test_bit(Journal, &rdev->flags))) && - atomic_read(&rdev->nr_pending)=3D=3D0)) { if (mddev->pers->hot_remove_disk( mddev, rdev) =3D=3D 0) { sysfs_unlink_rdev(mddev, rdev); @@ -9195,8 +9175,6 @@ static int remove_and_add_spares(struct mddev *mddev, removed++; } } - if (remove_some && test_bit(RemoveSynchronized, &rdev->flags)) - clear_bit(RemoveSynchronized, &rdev->flags); } =20 if (removed && mddev->kobj.sd) diff --git a/drivers/md/md.h b/drivers/md/md.h index 8ae957480976..b25b6d061372 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -189,11 +189,6 @@ enum flag_bits { * than other devices in the array */ ClusterRemove, - RemoveSynchronized, /* synchronize_rcu() was called after - * this device was known to be faulty, - * so it is safe to remove without - * another synchronize_rcu() call. - */ ExternalBbl, /* External metadata provides bad * block management for a disk */ diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 23d211969565..acb6d6542619 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1859,15 +1859,14 @@ static int raid1_remove_disk(struct mddev *mddev, s= truct md_rdev *rdev) goto abort; } p->rdev =3D NULL; - if (!test_bit(RemoveSynchronized, &rdev->flags)) { - synchronize_rcu(); - if (atomic_read(&rdev->nr_pending)) { - /* lost the race, try later */ - err =3D -EBUSY; - p->rdev =3D rdev; - goto abort; - } + synchronize_rcu(); + if (atomic_read(&rdev->nr_pending)) { + /* lost the race, try later */ + err =3D -EBUSY; + p->rdev =3D rdev; + goto abort; } + if (conf->mirrors[conf->raid_disks + number].rdev) { /* We just removed a device that is being replaced. * Move down the replacement. We drain all IO before diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 7704a4c7f469..64dd5cb6133e 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -2247,15 +2247,14 @@ static int raid10_remove_disk(struct mddev *mddev, = struct md_rdev *rdev) goto abort; } *rdevp =3D NULL; - if (!test_bit(RemoveSynchronized, &rdev->flags)) { - synchronize_rcu(); - if (atomic_read(&rdev->nr_pending)) { - /* lost the race, try later */ - err =3D -EBUSY; - *rdevp =3D rdev; - goto abort; - } + synchronize_rcu(); + if (atomic_read(&rdev->nr_pending)) { + /* lost the race, try later */ + err =3D -EBUSY; + *rdevp =3D rdev; + goto abort; } + if (p->replacement) { /* We must have just cleared 'rdev' */ p->rdev =3D p->replacement; diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 4cdb35e54251..37d9865b180a 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -8267,15 +8267,14 @@ static int raid5_remove_disk(struct mddev *mddev, s= truct md_rdev *rdev) goto abort; } *rdevp =3D NULL; - if (!test_bit(RemoveSynchronized, &rdev->flags)) { - lockdep_assert_held(&mddev->reconfig_mutex); - synchronize_rcu(); - if (atomic_read(&rdev->nr_pending)) { - /* lost the race, try later */ - err =3D -EBUSY; - rcu_assign_pointer(*rdevp, rdev); - } + lockdep_assert_held(&mddev->reconfig_mutex); + synchronize_rcu(); + if (atomic_read(&rdev->nr_pending)) { + /* lost the race, try later */ + err =3D -EBUSY; + rcu_assign_pointer(*rdevp, rdev); } + if (!err) { err =3D log_modify(conf, rdev, false); if (err) --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1158DEB64DD for ; Thu, 3 Aug 2023 13:27:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235621AbjHCN1g (ORCPT ); Thu, 3 Aug 2023 09:27:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47280 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234160AbjHCN1b (ORCPT ); Thu, 3 Aug 2023 09:27:31 -0400 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EAE0B1BFA; Thu, 3 Aug 2023 06:27:30 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4RGqQQ4c6dz4f3l18; Thu, 3 Aug 2023 21:27:26 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S6; Thu, 03 Aug 2023 21:27:27 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 02/13] md: factor out a helper rdev_removeable() from remove_and_add_spares() Date: Thu, 3 Aug 2023 21:24:15 +0800 Message-Id: <20230803132426.2688608-3-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S6 X-Coremail-Antispam: 1UD129KBjvJXoW7Kr47Kr4xtr1fuF4UWFy7GFg_yoW8Ar18pa 1xKFySkr1UAa47t34kJr4UGa4aqa10ga1IkFyxG34SqasxAr90gw4rKFy5XryqyFZYvF43 AF18J3y5Cry0gF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9m14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrwCFx2 IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v2 6r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67 AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IY s7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr 0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUc6pPUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are no functional changes, just to make the code simpler and prepare to refactoer remove_and_add_spares(). Signed-off-by: Yu Kuai --- drivers/md/md.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index cd7ac1dee3b8..0d84754027ec 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9149,6 +9149,14 @@ void md_do_sync(struct md_thread *thread) } EXPORT_SYMBOL_GPL(md_do_sync); =20 +static bool rdev_removeable(struct md_rdev *rdev) +{ + return rdev->raid_disk >=3D 0 && !test_bit(Blocked, &rdev->flags) && + !test_bit(In_sync, &rdev->flags) && + !test_bit(Journal, &rdev->flags) && + !atomic_read(&rdev->nr_pending); +} + static int remove_and_add_spares(struct mddev *mddev, struct md_rdev *this) { @@ -9161,19 +9169,12 @@ static int remove_and_add_spares(struct mddev *mdde= v, return 0; =20 rdev_for_each(rdev, mddev) { - if ((this =3D=3D NULL || rdev =3D=3D this) && - rdev->raid_disk >=3D 0 && - !test_bit(Blocked, &rdev->flags) && - !test_bit(In_sync, &rdev->flags) && - !test_bit(Journal, &rdev->flags) && - atomic_read(&rdev->nr_pending)=3D=3D0) { - if (mddev->pers->hot_remove_disk( - mddev, rdev) =3D=3D 0) { - sysfs_unlink_rdev(mddev, rdev); - rdev->saved_raid_disk =3D rdev->raid_disk; - rdev->raid_disk =3D -1; - removed++; - } + if ((this =3D=3D NULL || rdev =3D=3D this) && rdev_removeable(rdev) && + !mddev->pers->hot_remove_disk(mddev, rdev)) { + sysfs_unlink_rdev(mddev, rdev); + rdev->saved_raid_disk =3D rdev->raid_disk; + rdev->raid_disk =3D -1; + removed++; } } =20 --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4E353EB64DD for ; Thu, 3 Aug 2023 13:27:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236010AbjHCN1n (ORCPT ); Thu, 3 Aug 2023 09:27:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235359AbjHCN1e (ORCPT ); Thu, 3 Aug 2023 09:27:34 -0400 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2FCD11702; Thu, 3 Aug 2023 06:27:31 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4RGqQP22mpz4f3knM; Thu, 3 Aug 2023 21:27:25 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S7; Thu, 03 Aug 2023 21:27:28 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 03/13] md: factor out a helper rdev_is_spare() from remove_and_add_spares() Date: Thu, 3 Aug 2023 21:24:16 +0800 Message-Id: <20230803132426.2688608-4-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S7 X-Coremail-Antispam: 1UD129KBjvJXoW7Kr47Kr4xtr45uw4rtw13urg_yoW8GF48pF 4fKFWYkw4UZFyjga1vgryUGa4ag3W0gayIkFyfCa4xZasxXry5Ka1vkF98tFnxAFWFvF45 ZF15tw48CFy5WF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9m14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JrWl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrwCFx2 IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v2 6r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67 AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IY s7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr 0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUd8n5UUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are no functional changes, just to make the code simpler and prepare to refactor remove_and_add_spares(). Signed-off-by: Yu Kuai --- drivers/md/md.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 0d84754027ec..0e4967f17115 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9157,6 +9157,14 @@ static bool rdev_removeable(struct md_rdev *rdev) !atomic_read(&rdev->nr_pending); } =20 +static bool rdev_is_spare(struct md_rdev *rdev) +{ + return !test_bit(Candidate, &rdev->flags) && rdev->raid_disk >=3D 0 && + !test_bit(In_sync, &rdev->flags) && + !test_bit(Journal, &rdev->flags) && + !test_bit(Faulty, &rdev->flags); +} + static int remove_and_add_spares(struct mddev *mddev, struct md_rdev *this) { @@ -9187,13 +9195,10 @@ static int remove_and_add_spares(struct mddev *mdde= v, rdev_for_each(rdev, mddev) { if (this && this !=3D rdev) continue; + if (rdev_is_spare(rdev)) + spares++; if (test_bit(Candidate, &rdev->flags)) continue; - if (rdev->raid_disk >=3D 0 && - !test_bit(In_sync, &rdev->flags) && - !test_bit(Journal, &rdev->flags) && - !test_bit(Faulty, &rdev->flags)) - spares++; if (rdev->raid_disk >=3D 0) continue; if (test_bit(Faulty, &rdev->flags)) --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C4F0C04E69 for ; Thu, 3 Aug 2023 13:27:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236215AbjHCN1v (ORCPT ); Thu, 3 Aug 2023 09:27:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235001AbjHCN1f (ORCPT ); Thu, 3 Aug 2023 09:27:35 -0400 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9E84A2130; Thu, 3 Aug 2023 06:27:33 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4RGqQP4nrDz4f3lw8; Thu, 3 Aug 2023 21:27:25 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S8; Thu, 03 Aug 2023 21:27:28 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 04/13] md: factor out a helper rdev_addable() from remove_and_add_spares() Date: Thu, 3 Aug 2023 21:24:17 +0800 Message-Id: <20230803132426.2688608-5-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S8 X-Coremail-Antispam: 1UD129KBjvJXoW7Kr47Kr4xtrykurWDtFW7twb_yoW8AF1fpa yfKFy3Kw45AF13Xa1DKryUJ3WYva10gFWxCa4aka4fXas8Jrn8Gw48CF98JFnxAFZY9r45 ZF45Jw48Cr12gFUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9C14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxK x2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI 0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUQSdkUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are no functional changes, just to make the code simpler and prepare to refactoer remove_and_add_spares(). Signed-off-by: Yu Kuai --- drivers/md/md.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 0e4967f17115..8017371a9e53 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9157,6 +9157,20 @@ static bool rdev_removeable(struct md_rdev *rdev) !atomic_read(&rdev->nr_pending); } =20 +static bool rdev_addable(struct md_rdev *rdev) +{ + if (test_bit(Candidate, &rdev->flags) || rdev->raid_disk >=3D 0 || + test_bit(Faulty, &rdev->flags)) + return false; + + if (!test_bit(Journal, &rdev->flags) && !md_is_rdwr(rdev->mddev) && + !(rdev->saved_raid_disk >=3D 0 && + !test_bit(Bitmap_sync, &rdev->flags))) + return false; + + return true; +} + static bool rdev_is_spare(struct md_rdev *rdev) { return !test_bit(Candidate, &rdev->flags) && rdev->raid_disk >=3D 0 && @@ -9197,20 +9211,10 @@ static int remove_and_add_spares(struct mddev *mdde= v, continue; if (rdev_is_spare(rdev)) spares++; - if (test_bit(Candidate, &rdev->flags)) + if (!rdev_addable(rdev)) continue; - if (rdev->raid_disk >=3D 0) - continue; - if (test_bit(Faulty, &rdev->flags)) - continue; - if (!test_bit(Journal, &rdev->flags)) { - if (!md_is_rdwr(mddev) && - !(rdev->saved_raid_disk >=3D 0 && - !test_bit(Bitmap_sync, &rdev->flags))) - continue; - + if (!test_bit(Journal, &rdev->flags)) rdev->recovery_offset =3D 0; - } if (mddev->pers->hot_add_disk(mddev, rdev) =3D=3D 0) { /* failure here is OK */ sysfs_link_rdev(mddev, rdev); --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5AB1CEB64DD for ; Thu, 3 Aug 2023 13:27:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234315AbjHCN1j (ORCPT ); Thu, 3 Aug 2023 09:27:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47328 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235267AbjHCN1e (ORCPT ); Thu, 3 Aug 2023 09:27:34 -0400 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 64031134; Thu, 3 Aug 2023 06:27:32 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4RGqQQ0VcHz4f4Hwm; Thu, 3 Aug 2023 21:27:26 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S9; Thu, 03 Aug 2023 21:27:28 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 05/13] md: factor out a helper hot_remove_rdev() from remove_and_add_spares() Date: Thu, 3 Aug 2023 21:24:18 +0800 Message-Id: <20230803132426.2688608-6-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S9 X-Coremail-Antispam: 1UD129KBjvJXoW7Kr47Kr4xtr47GrWfuw4kZwb_yoW8WF13pa 17KFyfWr43Aw17Ja13Xr4DGFy5Jw18ta1Iya4fWa4Iv3W3AryDWw1fXFy3Xr9YyFZY9F4f JF4ftw45Cry0gF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9C14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxK x2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI 0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUQSdkUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are no functional changes, just to make the code simpler and prepare to refactor remove_and_add_spares(). Signed-off-by: Yu Kuai --- drivers/md/md.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 8017371a9e53..74ee31f2706b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9179,6 +9179,23 @@ static bool rdev_is_spare(struct md_rdev *rdev) !test_bit(Faulty, &rdev->flags); } =20 +static bool hot_remove_rdev(struct md_rdev *rdev) +{ + struct mddev *mddev; + + if (!rdev_removeable(rdev)) + return false; + + mddev =3D rdev->mddev; + if (mddev->pers->hot_remove_disk(mddev, rdev)) + return false; + + sysfs_unlink_rdev(mddev, rdev); + rdev->saved_raid_disk =3D rdev->raid_disk; + rdev->raid_disk =3D -1; + return true; +} + static int remove_and_add_spares(struct mddev *mddev, struct md_rdev *this) { @@ -9190,15 +9207,9 @@ static int remove_and_add_spares(struct mddev *mddev, /* Mustn't remove devices when resync thread is running */ return 0; =20 - rdev_for_each(rdev, mddev) { - if ((this =3D=3D NULL || rdev =3D=3D this) && rdev_removeable(rdev) && - !mddev->pers->hot_remove_disk(mddev, rdev)) { - sysfs_unlink_rdev(mddev, rdev); - rdev->saved_raid_disk =3D rdev->raid_disk; - rdev->raid_disk =3D -1; + rdev_for_each(rdev, mddev) + if ((this =3D=3D NULL || rdev =3D=3D this) && hot_remove_rdev(rdev)) removed++; - } - } =20 if (removed && mddev->kobj.sd) sysfs_notify_dirent_safe(mddev->sysfs_degraded); --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 96DB1C04E69 for ; Thu, 3 Aug 2023 13:27:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236193AbjHCN1s (ORCPT ); Thu, 3 Aug 2023 09:27:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47388 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235461AbjHCN1f (ORCPT ); Thu, 3 Aug 2023 09:27:35 -0400 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1216E212B; Thu, 3 Aug 2023 06:27:33 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4RGqQS5Rv1z4f46Sg; Thu, 3 Aug 2023 21:27:28 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S10; Thu, 03 Aug 2023 21:27:29 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 06/13] md: factor out a helper hot_add_rdev() from remove_and_add_spares() Date: Thu, 3 Aug 2023 21:24:19 +0800 Message-Id: <20230803132426.2688608-7-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S10 X-Coremail-Antispam: 1UD129KBjvJXoW7Kr47Kr4xtr47XF1kZw47urg_yoW8WFWfpa 1SgFy5Kr47ZryfXa1DtF1DGFy5tF1IgrWIkFyak3yfZasxZr98K3WrXFyYq3s8AFZ09F4r Xa15tw4Uu347WF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9K14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAv wI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14 v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOBTYUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are no functional changes, just to make the code simpler and prepare to refactoer remove_and_add_spares(). Signed-off-by: Yu Kuai --- drivers/md/md.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 74ee31f2706b..77c48f7b605c 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9196,6 +9196,26 @@ static bool hot_remove_rdev(struct md_rdev *rdev) return true; } =20 +static bool hot_add_rdev(struct md_rdev *rdev) +{ + struct mddev *mddev; + + if (!rdev_addable(rdev)) + return false; + + if (!test_bit(Journal, &rdev->flags)) + rdev->recovery_offset =3D 0; + + mddev =3D rdev->mddev; + if (mddev->pers->hot_add_disk(mddev, rdev)) + return false; + + sysfs_link_rdev(mddev, rdev); + md_new_event(); + set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); + return true; +} + static int remove_and_add_spares(struct mddev *mddev, struct md_rdev *this) { @@ -9222,18 +9242,8 @@ static int remove_and_add_spares(struct mddev *mddev, continue; if (rdev_is_spare(rdev)) spares++; - if (!rdev_addable(rdev)) - continue; - if (!test_bit(Journal, &rdev->flags)) - rdev->recovery_offset =3D 0; - if (mddev->pers->hot_add_disk(mddev, rdev) =3D=3D 0) { - /* failure here is OK */ - sysfs_link_rdev(mddev, rdev); - if (!test_bit(Journal, &rdev->flags)) - spares++; - md_new_event(); - set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); - } + if (hot_add_rdev(rdev) && !test_bit(Journal, &rdev->flags)) + spares++; } no_add: if (removed) --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1BB5C001DF for ; Thu, 3 Aug 2023 13:27:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236228AbjHCN1y (ORCPT ); Thu, 3 Aug 2023 09:27:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47394 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235499AbjHCN1f (ORCPT ); Thu, 3 Aug 2023 09:27:35 -0400 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 41BBEE70; Thu, 3 Aug 2023 06:27:33 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4RGqQQ5zZ6z4f3lwY; Thu, 3 Aug 2023 21:27:26 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S11; Thu, 03 Aug 2023 21:27:29 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 07/13] md: factor out a helper remove_rdev() from state_store() Date: Thu, 3 Aug 2023 21:24:20 +0800 Message-Id: <20230803132426.2688608-8-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S11 X-Coremail-Antispam: 1UD129KBjvJXoW7Kw4fWrW8Jw15CFWDZry8AFb_yoW8uryfp3 yfKFy5Gr4UA343Jw43t3ykWa45Jr40qrZrtry3uw1S9anxArZ5Ja4FgF95Jr95Cayvvr45 Xa15Wa1rWryxWF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9K14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAv wI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14 v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOBTYUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai state_store() is a very big function already, factor out a helper to prevent that following changes will make state_store() more complicated. There are no functional changes. Signed-off-by: Yu Kuai --- drivers/md/md.c | 50 +++++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 77c48f7b605c..3903bdfe5293 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -2883,6 +2883,35 @@ state_show(struct md_rdev *rdev, char *page) return len+sprintf(page+len, "\n"); } =20 +static int remove_rdev(struct md_rdev *rdev) +{ + struct mddev *mddev =3D rdev->mddev; + + if (mddev->pers) { + clear_bit(Blocked, &rdev->flags); + remove_and_add_spares(mddev, rdev); + } + + if (rdev->raid_disk >=3D 0) + return -EBUSY; + + if (mddev_is_clustered(mddev)) { + int err =3D md_cluster_ops->remove_disk(mddev, rdev); + + if (err) + return err; + } + + md_kick_rdev_from_array(rdev); + if (mddev->pers) { + set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); + md_wakeup_thread(mddev->thread); + } + md_new_event(); + + return 0; +} + static ssize_t state_store(struct md_rdev *rdev, const char *buf, size_t len) { @@ -2913,26 +2942,7 @@ state_store(struct md_rdev *rdev, const char *buf, s= ize_t len) else err =3D 0; } else if (cmd_match(buf, "remove")) { - if (rdev->mddev->pers) { - clear_bit(Blocked, &rdev->flags); - remove_and_add_spares(rdev->mddev, rdev); - } - if (rdev->raid_disk >=3D 0) - err =3D -EBUSY; - else { - err =3D 0; - if (mddev_is_clustered(mddev)) - err =3D md_cluster_ops->remove_disk(mddev, rdev); - - if (err =3D=3D 0) { - md_kick_rdev_from_array(rdev); - if (mddev->pers) { - set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); - md_wakeup_thread(mddev->thread); - } - md_new_event(); - } - } + err =3D remove_rdev(rdev); } else if (cmd_match(buf, "writemostly")) { set_bit(WriteMostly, &rdev->flags); mddev_create_serial_pool(rdev->mddev, rdev, false); --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 750EBC04A6A for ; Thu, 3 Aug 2023 13:28:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235788AbjHCN2l (ORCPT ); Thu, 3 Aug 2023 09:28:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236006AbjHCN1m (ORCPT ); Thu, 3 Aug 2023 09:27:42 -0400 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7AE12109; Thu, 3 Aug 2023 06:27:35 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4RGqQR1nnrz4f3lwK; Thu, 3 Aug 2023 21:27:27 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S12; Thu, 03 Aug 2023 21:27:29 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 08/13] md: convert to use hot_remove_rdev() to hot remove one rdev Date: Thu, 3 Aug 2023 21:24:21 +0800 Message-Id: <20230803132426.2688608-9-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S12 X-Coremail-Antispam: 1UD129KBjvJXoW7Kr47Kr4xtF1UJF1fCw1ftFb_yoW8uFWkpa yxJas8Wr47Aw43Xw4UtF4DGa45tw10grZ2yry7ua4fZ3Z3Jr1kW3WrGFWUXr95Aa9YvF4r JF48ta1Uu3yIkFUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9K14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAv wI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14 v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOBTYUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are no functional changes, prepare to cleanup remove_and_add_spares(). Signed-off-by: Yu Kuai --- drivers/md/md.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 3903bdfe5293..de7399769c8d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -85,6 +85,7 @@ static struct workqueue_struct *md_wq; static struct workqueue_struct *md_misc_wq; struct workqueue_struct *md_bitmap_wq; =20 +static bool hot_remove_rdev(struct md_rdev *rdev); static int remove_and_add_spares(struct mddev *mddev, struct md_rdev *this); static void mddev_detach(struct mddev *mddev); @@ -2887,9 +2888,13 @@ static int remove_rdev(struct md_rdev *rdev) { struct mddev *mddev =3D rdev->mddev; =20 + if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) + return -EBUSY; + if (mddev->pers) { clear_bit(Blocked, &rdev->flags); - remove_and_add_spares(mddev, rdev); + if (!hot_remove_rdev(rdev)) + return -EBUSY; } =20 if (rdev->raid_disk >=3D 0) @@ -3133,8 +3138,8 @@ slot_store(struct md_rdev *rdev, const char *buf, siz= e_t len) if (rdev->mddev->pers->hot_remove_disk =3D=3D NULL) return -EINVAL; clear_bit(Blocked, &rdev->flags); - remove_and_add_spares(rdev->mddev, rdev); - if (rdev->raid_disk >=3D 0) + if (test_bit(MD_RECOVERY_RUNNING, &rdev->mddev->recovery) || + !hot_remove_rdev(rdev)) return -EBUSY; set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); md_wakeup_thread(rdev->mddev->thread); @@ -6931,6 +6936,9 @@ static int hot_remove_disk(struct mddev *mddev, dev_t= dev) if (!mddev->pers) return -ENODEV; =20 + if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) + return -EBUSY; + rdev =3D find_rdev(mddev, dev); if (!rdev) return -ENXIO; @@ -6939,9 +6947,7 @@ static int hot_remove_disk(struct mddev *mddev, dev_t= dev) goto kick_rdev; =20 clear_bit(Blocked, &rdev->flags); - remove_and_add_spares(mddev, rdev); - - if (rdev->raid_disk >=3D 0) + if (!hot_remove_rdev(rdev)) goto busy; =20 kick_rdev: --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AAECBEB64DD for ; Thu, 3 Aug 2023 13:28:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236242AbjHCN16 (ORCPT ); Thu, 3 Aug 2023 09:27:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47378 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235788AbjHCN1l (ORCPT ); Thu, 3 Aug 2023 09:27:41 -0400 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CA6F52737; Thu, 3 Aug 2023 06:27:34 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4RGqQT2fspz4f3l1p; Thu, 3 Aug 2023 21:27:29 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S13; Thu, 03 Aug 2023 21:27:30 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 09/13] md: convert to use hot_add_rdev() to hot add one rdev Date: Thu, 3 Aug 2023 21:24:22 +0800 Message-Id: <20230803132426.2688608-10-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S13 X-Coremail-Antispam: 1UD129KBjvJXoW7CrWDWw4xWFWfXF1rKw1Utrb_yoW8GF1fp3 yfJasIvrW7Zr43Aa17GFyDWFW5Aw10qrWUtFZxu393X3Wrtr4Fkw15KFyUJ34qyr93XF4r tr15Jr4DCw18CF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9K14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAv wI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14 v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOBTYUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai Replace remove_and_add_spares() with hot_add_rdev() in check_sb_changes(), also handle the case that hot add rdev failed. Signed-off-by: Yu Kuai --- drivers/md/md.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index de7399769c8d..1dc26bb1e096 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9773,13 +9773,20 @@ static void check_sb_changes(struct mddev *mddev, s= truct md_rdev *rdev) !(le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE)) { rdev2->saved_raid_disk =3D role; - ret =3D remove_and_add_spares(mddev, rdev2); - pr_info("Activated spare: %pg\n", - rdev2->bdev); - /* wakeup mddev->thread here, so array could - * perform resync with the new activated disk */ - set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); - md_wakeup_thread(mddev->thread); + if (!test_bit(MD_RECOVERY_RUNNING, + &mddev->recovery) && + hot_add_rdev(rdev2)) { + pr_info("Activated spare: %pg\n", + rdev2->bdev); + /* + * wakeup mddev->thread here, so array + * could perform resync with the new + * activated disk. + */ + set_bit(MD_RECOVERY_NEEDED, + &mddev->recovery); + md_wakeup_thread(mddev->thread); + } } /* device faulty * We just want to do the minimum to mark the disk --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C2C24C001DF for ; Thu, 3 Aug 2023 13:28:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235866AbjHCN2n (ORCPT ); Thu, 3 Aug 2023 09:28:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47400 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236015AbjHCN1n (ORCPT ); Thu, 3 Aug 2023 09:27:43 -0400 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 871E12D4E; Thu, 3 Aug 2023 06:27:36 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4RGqQS0FBxz4f3lx7; Thu, 3 Aug 2023 21:27:28 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S14; Thu, 03 Aug 2023 21:27:30 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 10/13] md: cleanup remove_and_add_spares() Date: Thu, 3 Aug 2023 21:24:23 +0800 Message-Id: <20230803132426.2688608-11-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S14 X-Coremail-Antispam: 1UD129KBjvJXoWxJFW7KF45tr4DZr15AFyxXwb_yoW5XFy3pa 1Ik3ZxCr4UZ3yfZayjqr4DGa45Jr10qrZFyFy7ua4fZ3Wayr1vga4rZFy7ArZ5AasY9F43 Aw48Kw45ur18GF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9K14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAv wI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY6I8E87Iv6xkF7I0E14 v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOBTYUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai Now that remove_and_add_spares() is only called from daemon thread, and the second parameter is always NULL, remove the second parameter. Signed-off-by: Yu Kuai --- drivers/md/md.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 1dc26bb1e096..e64d1d0b4c5c 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -86,8 +86,6 @@ static struct workqueue_struct *md_misc_wq; struct workqueue_struct *md_bitmap_wq; =20 static bool hot_remove_rdev(struct md_rdev *rdev); -static int remove_and_add_spares(struct mddev *mddev, - struct md_rdev *this); static void mddev_detach(struct mddev *mddev); static void export_rdev(struct md_rdev *rdev, struct mddev *mddev); static void md_wakeup_thread_directly(struct md_thread __rcu *thread); @@ -9232,36 +9230,26 @@ static bool hot_add_rdev(struct md_rdev *rdev) return true; } =20 -static int remove_and_add_spares(struct mddev *mddev, - struct md_rdev *this) +static int remove_and_add_spares(struct mddev *mddev) { struct md_rdev *rdev; int spares =3D 0; int removed =3D 0; =20 - if (this && test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) - /* Mustn't remove devices when resync thread is running */ - return 0; - rdev_for_each(rdev, mddev) - if ((this =3D=3D NULL || rdev =3D=3D this) && hot_remove_rdev(rdev)) + if (hot_remove_rdev(rdev)) removed++; =20 if (removed && mddev->kobj.sd) sysfs_notify_dirent_safe(mddev->sysfs_degraded); =20 - if (this && removed) - goto no_add; - rdev_for_each(rdev, mddev) { - if (this && this !=3D rdev) - continue; if (rdev_is_spare(rdev)) spares++; if (hot_add_rdev(rdev) && !test_bit(Journal, &rdev->flags)) spares++; } -no_add: + if (removed) set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); return spares; @@ -9381,7 +9369,7 @@ void md_check_recovery(struct mddev *mddev) * As we only add devices that are already in-sync, * we can activate the spares immediately. */ - remove_and_add_spares(mddev, NULL); + remove_and_add_spares(mddev); /* There is no thread, but we need to call * ->spare_active and clear saved_raid_disk */ @@ -9462,7 +9450,7 @@ void md_check_recovery(struct mddev *mddev) goto not_running; set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); - } else if ((spares =3D remove_and_add_spares(mddev, NULL))) { + } else if ((spares =3D remove_and_add_spares(mddev))) { clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 99F2DEB64DD for ; Thu, 3 Aug 2023 13:28:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235262AbjHCN2j (ORCPT ); Thu, 3 Aug 2023 09:28:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47394 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236001AbjHCN1m (ORCPT ); Thu, 3 Aug 2023 09:27:42 -0400 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A072A1FF0; Thu, 3 Aug 2023 06:27:35 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4RGqQV1C1Yz4f3lD2; Thu, 3 Aug 2023 21:27:30 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S15; Thu, 03 Aug 2023 21:27:31 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 11/13] md: use separate work_struct for md_start_sync() Date: Thu, 3 Aug 2023 21:24:24 +0800 Message-Id: <20230803132426.2688608-12-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S15 X-Coremail-Antispam: 1UD129KBjvJXoW7Ary3ur4xtw48KFW8JF13Arb_yoW5JFyfpa ySgFy3JrW8J390qw4UWFWDC3Wagw1vkryDtryfuwsYvF9xtr1UGa1FgayqqF98Cayrtr1a va1FqFW5ur18Gr7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9K14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAv wI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY6I8E87Iv6xkF7I0E14 v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOBTYUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai It's a little weird to borrow 'del_work' for md_start_sync(), declare a new work_struct 'sync_work' for md_start_sync(). Signed-off-by: Yu Kuai --- drivers/md/md.c | 10 ++++++---- drivers/md/md.h | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index e64d1d0b4c5c..8980a41bfe97 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -630,13 +630,13 @@ void mddev_put(struct mddev *mddev) * flush_workqueue() after mddev_find will succeed in waiting * for the work to be done. */ - INIT_WORK(&mddev->del_work, mddev_delayed_delete); queue_work(md_misc_wq, &mddev->del_work); } spin_unlock(&all_mddevs_lock); } =20 static void md_safemode_timeout(struct timer_list *t); +static void md_start_sync(struct work_struct *ws); =20 void mddev_init(struct mddev *mddev) { @@ -661,6 +661,9 @@ void mddev_init(struct mddev *mddev) mddev->resync_min =3D 0; mddev->resync_max =3D MaxSector; mddev->level =3D LEVEL_NONE; + + INIT_WORK(&mddev->sync_work, md_start_sync); + INIT_WORK(&mddev->del_work, mddev_delayed_delete); } EXPORT_SYMBOL_GPL(mddev_init); =20 @@ -9257,7 +9260,7 @@ static int remove_and_add_spares(struct mddev *mddev) =20 static void md_start_sync(struct work_struct *ws) { - struct mddev *mddev =3D container_of(ws, struct mddev, del_work); + struct mddev *mddev =3D container_of(ws, struct mddev, sync_work); =20 rcu_assign_pointer(mddev->sync_thread, md_register_thread(md_do_sync, mddev, "resync")); @@ -9470,8 +9473,7 @@ void md_check_recovery(struct mddev *mddev) */ md_bitmap_write_all(mddev->bitmap); } - INIT_WORK(&mddev->del_work, md_start_sync); - queue_work(md_misc_wq, &mddev->del_work); + queue_work(md_misc_wq, &mddev->sync_work); goto unlock; } not_running: diff --git a/drivers/md/md.h b/drivers/md/md.h index b25b6d061372..0381f2aa6cbb 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -445,7 +445,10 @@ struct mddev { struct kernfs_node *sysfs_degraded; /*handle for 'degraded' */ struct kernfs_node *sysfs_level; /*handle for 'level' */ =20 - struct work_struct del_work; /* used for delayed sysfs removal */ + /* used for delayed sysfs removal */ + struct work_struct del_work; + /* used for register new sync thread */ + struct work_struct sync_work; =20 /* "lock" protects: * flush_bio transition from NULL to !NULL --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2BE6FC41513 for ; Thu, 3 Aug 2023 13:28:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236274AbjHCN2B (ORCPT ); Thu, 3 Aug 2023 09:28:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47368 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235866AbjHCN1l (ORCPT ); Thu, 3 Aug 2023 09:27:41 -0400 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9C5802728; Thu, 3 Aug 2023 06:27:34 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4RGqQW0xXVz4f46Ry; Thu, 3 Aug 2023 21:27:31 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S16; Thu, 03 Aug 2023 21:27:31 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 12/13] md: delay choosing sync direction to md_start_sync() Date: Thu, 3 Aug 2023 21:24:25 +0800 Message-Id: <20230803132426.2688608-13-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S16 X-Coremail-Antispam: 1UD129KBjvJXoW3Xr4rXF1DWF4xtry8tFWfuFg_yoW3Gr1kpa yfJFn8GrW8JFy3ZrW2q3WDX3y5ur1jqrZrtFW3W3s5CFn0yF4SkFy5u3W7AFWDtas2ya12 vw4kJFZrZF15uw7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBj14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20E Y4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267 AKxVW8Jr0_Cr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUQSdkUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai Before this patch, for read-write array: 1) md_check_recover() found that something need to be done, and it'll try to grab 'reconfig_mutex'. The case that md_check_recover() need to do something: - array is not suspend; - super_block need to be updated; - 'MD_RECOVERY_NEEDED' or ''MD_RECOVERY_DONE' is set; - unusual case related to safemode; 2) if 'MD_RECOVERY_RUNNING' is not set, and 'MD_RECOVERY_NEEDED' is set, md_check_recover() will try to choose a sync direction, and then queue a work md_start_sync(). 3) md_start_sync() register sync_thread; After this patch, 1) is the same; 2) if 'MD_RECOVERY_RUNNING' is not set, and 'MD_RECOVERY_NEEDED' is set, queue a work md_start_sync() directly; 3) md_start_sync() will try to choose a sync direction, and then register sync_thread(); Because 'MD_RECOVERY_RUNNING' is cleared when sync_thread is done, 2) and 3) is always runned in serial and they can never concurrent, this change should not introduce any behavior change for now. Also fix a problem that md_start_sync() can clear 'MD_RECOVERY_RUNNING' without protection in error path, which might affect the logical in md_check_recovery(). The advantage to change this is that array reconfiguration is independent from daemon now, and it'll be much easier to synchronize it with io, consider that io may rely on daemon thread to be done. Signed-off-by: Yu Kuai --- drivers/md/md.c | 126 +++++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 59 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 8980a41bfe97..ef88581d9a39 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9261,6 +9261,44 @@ static int remove_and_add_spares(struct mddev *mddev) static void md_start_sync(struct work_struct *ws) { struct mddev *mddev =3D container_of(ws, struct mddev, sync_work); + int spares =3D 0; + + mddev_lock_nointr(mddev); + + /* + * No recovery is running, remove any failed drives, then add spares if + * possible. Spares are also removed and re-added, to allow the + * personality to fail the re-add. + */ + if (mddev->reshape_position !=3D MaxSector) { + if (mddev->pers->check_reshape =3D=3D NULL || + mddev->pers->check_reshape(mddev) !=3D 0) + /* Cannot proceed */ + goto not_running; + set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); + clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); + } else if ((spares =3D remove_and_add_spares(mddev))) { + clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); + clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); + clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); + set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); + } else if (mddev->recovery_cp < MaxSector) { + set_bit(MD_RECOVERY_SYNC, &mddev->recovery); + clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); + } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) { + /* nothing to be done ... */ + goto not_running; + } + + if (!mddev->pers->sync_request) + goto not_running; + + /* + * We are adding a device or devices to an array which has the bitmap + * stored on all devices. So make sure all bitmap pages get written. + */ + if (spares) + md_bitmap_write_all(mddev->bitmap); =20 rcu_assign_pointer(mddev->sync_thread, md_register_thread(md_do_sync, mddev, "resync")); @@ -9268,20 +9306,27 @@ static void md_start_sync(struct work_struct *ws) pr_warn("%s: could not start resync thread...\n", mdname(mddev)); /* leave the spares where they are, it shouldn't hurt */ - clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); - clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); - clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); - clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); - clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); - wake_up(&resync_wait); - if (test_and_clear_bit(MD_RECOVERY_RECOVER, - &mddev->recovery)) - if (mddev->sysfs_action) - sysfs_notify_dirent_safe(mddev->sysfs_action); - } else - md_wakeup_thread(mddev->sync_thread); + goto not_running; + } + + mddev_unlock(mddev); + md_wakeup_thread(mddev->sync_thread); sysfs_notify_dirent_safe(mddev->sysfs_action); md_new_event(); + return; + +not_running: + clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); + clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); + clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); + clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); + clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); + mddev_unlock(mddev); + + wake_up(&resync_wait); + if (test_and_clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery) && + mddev->sysfs_action) + sysfs_notify_dirent_safe(mddev->sysfs_action); } =20 /* @@ -9349,7 +9394,6 @@ void md_check_recovery(struct mddev *mddev) return; =20 if (mddev_trylock(mddev)) { - int spares =3D 0; bool try_set_sync =3D mddev->safemode !=3D 0; =20 if (!mddev->external && mddev->safemode =3D=3D 1) @@ -9436,56 +9480,20 @@ void md_check_recovery(struct mddev *mddev) clear_bit(MD_RECOVERY_INTR, &mddev->recovery); clear_bit(MD_RECOVERY_DONE, &mddev->recovery); =20 - if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || - test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) - goto not_running; - /* no recovery is running. - * remove any failed drives, then - * add spares if possible. - * Spares are also removed and re-added, to allow - * the personality to fail the re-add. - */ - - if (mddev->reshape_position !=3D MaxSector) { - if (mddev->pers->check_reshape =3D=3D NULL || - mddev->pers->check_reshape(mddev) !=3D 0) - /* Cannot proceed */ - goto not_running; - set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); - clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); - } else if ((spares =3D remove_and_add_spares(mddev))) { - clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); - clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); - clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); - set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); - } else if (mddev->recovery_cp < MaxSector) { - set_bit(MD_RECOVERY_SYNC, &mddev->recovery); - clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); - } else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) - /* nothing to be done ... */ - goto not_running; - - if (mddev->pers->sync_request) { - if (spares) { - /* We are adding a device or devices to an array - * which has the bitmap stored on all devices. - * So make sure all bitmap pages get written - */ - md_bitmap_write_all(mddev->bitmap); - } + if (test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) && + !test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) { + /* + * Before this sync thread is done and + * MD_RECOVERY_RUNNING is cleared, new sync_work won't + * be queued. + */ queue_work(md_misc_wq, &mddev->sync_work); - goto unlock; - } - not_running: - if (!mddev->sync_thread) { + } else { clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); wake_up(&resync_wait); - if (test_and_clear_bit(MD_RECOVERY_RECOVER, - &mddev->recovery)) - if (mddev->sysfs_action) - sysfs_notify_dirent_safe(mddev->sysfs_action); } - unlock: + +unlock: wake_up(&mddev->sb_wait); mddev_unlock(mddev); } --=20 2.39.2 From nobody Mon Feb 9 14:51:10 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C3EADC001DF for ; Thu, 3 Aug 2023 13:28:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234115AbjHCN2g (ORCPT ); Thu, 3 Aug 2023 09:28:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47388 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235961AbjHCN1l (ORCPT ); Thu, 3 Aug 2023 09:27:41 -0400 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A07C6273E; Thu, 3 Aug 2023 06:27:35 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.143]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4RGqQV6gD1z4f3jMN; Thu, 3 Aug 2023 21:27:30 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgCnD7M6q8tk5SrlPQ--.7420S17; Thu, 03 Aug 2023 21:27:31 +0800 (CST) From: Yu Kuai To: song@kernel.org, xni@redhat.com Cc: linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai3@huawei.com, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH -next 13/13] md: delay remove_and_add_spares() for read only array to md_start_sync() Date: Thu, 3 Aug 2023 21:24:26 +0800 Message-Id: <20230803132426.2688608-14-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230803132426.2688608-1-yukuai1@huaweicloud.com> References: <20230803132426.2688608-1-yukuai1@huaweicloud.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: gCh0CgCnD7M6q8tk5SrlPQ--.7420S17 X-Coremail-Antispam: 1UD129KBjvJXoWxZry5GFyrZryfZF17uw4fAFb_yoW5Zr15pr 4SyF909r4Dt34fZr47Gw1DWa4Fkr10qrZFyry3ua48Aw13Ars7G34rWa4DJryrJa4Sya13 Ja18KFs8CF18GaDanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBj14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrw CFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE 14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2 IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20E Y4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267 AKxVW8Jr0_Cr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUQSdkUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Yu Kuai Before this patch, for read-only array: md_check_recovery() check that 'MD_RECOVERY_NEEDED' is set, then it will call remove_and_add_spares() directly to try to remove and add rdevs from array. After this patch: 1) md_check_recovery() check that 'MD_RECOVERY_NEEDED' is set, and the worker 'sync_work' is not pending, and there are rdevs can be added or removed, then it will queue new work md_start_sync(); 2) md_start_sync() will call remove_and_add_spares() and exist; This change make sure that array reconfiguration is independent from daemon, and it'll be much easier to synchronize it with io, consier that io may rely on daemon thread to be done. Signed-off-by: Yu Kuai --- drivers/md/md.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index ef88581d9a39..f6e024c15530 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -9188,6 +9188,16 @@ static bool rdev_addable(struct md_rdev *rdev) return true; } =20 +static bool md_spares_need_change(struct mddev *mddev) +{ + struct md_rdev *rdev; + + rdev_for_each(rdev, mddev) + if (rdev_removeable(rdev) || rdev_addable(rdev)) + return true; + return false; +} + static bool rdev_is_spare(struct md_rdev *rdev) { return !test_bit(Candidate, &rdev->flags) && rdev->raid_disk >=3D 0 && @@ -9265,6 +9275,12 @@ static void md_start_sync(struct work_struct *ws) =20 mddev_lock_nointr(mddev); =20 + if (!md_is_rdwr(mddev)) { + remove_and_add_spares(mddev); + mddev_unlock(mddev); + return; + } + /* * No recovery is running, remove any failed drives, then add spares if * possible. Spares are also removed and re-added, to allow the @@ -9381,7 +9397,8 @@ void md_check_recovery(struct mddev *mddev) } =20 if (!md_is_rdwr(mddev) && - !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) + (!test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || + work_pending(&mddev->sync_work))) return; if ( ! ( (mddev->sb_flags & ~ (1<flags); - /* On a read-only array we can: - * - remove failed devices - * - add already-in_sync devices if the array itself - * is in-sync. - * As we only add devices that are already in-sync, - * we can activate the spares immediately. - */ - remove_and_add_spares(mddev); - /* There is no thread, but we need to call + /* + * There is no thread, but we need to call * ->spare_active and clear saved_raid_disk */ set_bit(MD_RECOVERY_INTR, &mddev->recovery); @@ -9425,6 +9435,13 @@ void md_check_recovery(struct mddev *mddev) clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery); clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags); + + /* + * Let md_start_sync() to remove and add rdevs to the + * array. + */ + if (md_spares_need_change(mddev)) + queue_work(md_misc_wq, &mddev->sync_work); goto unlock; } =20 --=20 2.39.2