|
@@ -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);
|