Thread (3 messages) 3 messages, 2 authors, 2023-06-25

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

From: Yu Kuai <hidden>
Date: 2023-06-25 02:06:42
Also in: lkml

Hi,

在 2023/06/24 1:25, linan666@huaweicloud.com 写道:
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. This patch fixes raid1.
This commit message "This patch ..." shound use imperative mood, other
than that, this patch LGTM.

Reviewed-by: Yu Kuai <redacted>
quoted hunk ↗ jump to hunk
Signed-off-by: Li Nan <redacted>
---
  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;
  }
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help