md: correctly update sysfs when a raid1 is reshaped
When a raid1 array is reshaped (number of drives changed), the list of devices is compacted, so that slots for missing devices are filled with working devices from later slots. This requires the "rd%d" symlinks in sysfs to be updated. Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
918f02383f
commit
a88aa7865b
1 changed files with 18 additions and 4 deletions
|
@ -2154,11 +2154,25 @@ static int raid1_reshape(mddev_t *mddev)
|
|||
oldpool = conf->r1bio_pool;
|
||||
conf->r1bio_pool = newpool;
|
||||
|
||||
for (d=d2=0; d < conf->raid_disks; d++)
|
||||
if (conf->mirrors[d].rdev) {
|
||||
conf->mirrors[d].rdev->raid_disk = d2;
|
||||
newmirrors[d2++].rdev = conf->mirrors[d].rdev;
|
||||
for (d = d2 = 0; d < conf->raid_disks; d++) {
|
||||
mdk_rdev_t *rdev = conf->mirrors[d].rdev;
|
||||
if (rdev && rdev->raid_disk != d2) {
|
||||
char nm[20];
|
||||
sprintf(nm, "rd%d", rdev->raid_disk);
|
||||
sysfs_remove_link(&mddev->kobj, nm);
|
||||
rdev->raid_disk = d2;
|
||||
sprintf(nm, "rd%d", rdev->raid_disk);
|
||||
sysfs_remove_link(&mddev->kobj, nm);
|
||||
if (sysfs_create_link(&mddev->kobj,
|
||||
&rdev->kobj, nm))
|
||||
printk(KERN_WARNING
|
||||
"md/raid1: cannot register "
|
||||
"%s for %s\n",
|
||||
nm, mdname(mddev));
|
||||
}
|
||||
if (rdev)
|
||||
newmirrors[d2++].rdev = rdev;
|
||||
}
|
||||
kfree(conf->mirrors);
|
||||
conf->mirrors = newmirrors;
|
||||
kfree(conf->poolinfo);
|
||||
|
|
Loading…
Reference in a new issue