Thread (2 messages) 2 messages, 2 authors, 2023-07-07

Re: [PATCH v2] md/raid1: prioritize adding disk to 'removed' mirror

From: Song Liu <song@kernel.org>
Date: 2023-07-07 08:02:23
Also in: lkml

On Tue, Jun 27, 2023 at 9:44 AM [off-list ref] wrote:
From: Li Nan <redacted>

New disk should be added to "removed" position first instead of to be a
replacement. Commit 6090368abcb4 ("md/raid10: prioritize adding disk to
'removed' mirror") has fixed this issue for raid10. Fix it for raid1 now.

Signed-off-by: Li Nan <redacted>
Reviewed-by: Yu Kuai <redacted>
Applied to md-next. Thanks!

Song
quoted hunk ↗ jump to hunk
---
Changes in v2:
 - improve commit log.

 drivers/md/raid1.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 68a9e2d9985b..320bede4bfab 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1782,7 +1782,7 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
 {
        struct r1conf *conf = mddev->private;
        int err = -EEXIST;
-       int mirror = 0;
+       int mirror = 0, repl_slot = -1;
        struct raid1_info *p;
        int first = 0;
        int last = conf->raid_disks - 1;
@@ -1825,17 +1825,21 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
                        break;
                }
                if (test_bit(WantReplacement, &p->rdev->flags) &&
-                   p[conf->raid_disks].rdev == NULL) {
-                       /* Add this device as a replacement */
-                       clear_bit(In_sync, &rdev->flags);
-                       set_bit(Replacement, &rdev->flags);
-                       rdev->raid_disk = mirror;
-                       err = 0;
-                       conf->fullsync = 1;
-                       rcu_assign_pointer(p[conf->raid_disks].rdev, rdev);
-                       break;
-               }
+                   p[conf->raid_disks].rdev == NULL && repl_slot < 0)
+                       repl_slot = mirror;
        }
+
+       if (err && repl_slot >= 0) {
+               /* Add this device as a replacement */
+               p = conf->mirrors + repl_slot;
+               clear_bit(In_sync, &rdev->flags);
+               set_bit(Replacement, &rdev->flags);
+               rdev->raid_disk = repl_slot;
+               err = 0;
+               conf->fullsync = 1;
+               rcu_assign_pointer(p[conf->raid_disks].rdev, rdev);
+       }
+
        print_conf(conf);
        return err;
 }
--
2.39.2
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help