aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 4edcda8f4869..4869128bf742 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -3001,6 +3001,9 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
3001 return -EINVAL; 3001 return -EINVAL;
3002 } 3002 }
3003 3003
3004 list_for_each_entry(rdev, &mddev->disks, same_set)
3005 rdev->new_raid_disk = rdev->raid_disk;
3006
3004 /* ->takeover must set new_* and/or delta_disks 3007 /* ->takeover must set new_* and/or delta_disks
3005 * if it succeeds, and may set them when it fails. 3008 * if it succeeds, and may set them when it fails.
3006 */ 3009 */
@@ -3051,13 +3054,35 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
3051 mddev->safemode = 0; 3054 mddev->safemode = 0;
3052 } 3055 }
3053 3056
3054 module_put(mddev->pers->owner); 3057 list_for_each_entry(rdev, &mddev->disks, same_set) {
3055 /* Invalidate devices that are now superfluous */ 3058 char nm[20];
3056 list_for_each_entry(rdev, &mddev->disks, same_set) 3059 if (rdev->raid_disk < 0)
3057 if (rdev->raid_disk >= mddev->raid_disks) { 3060 continue;
3058 rdev->raid_disk = -1; 3061 if (rdev->new_raid_disk > mddev->raid_disks)
3062 rdev->new_raid_disk = -1;
3063 if (rdev->new_raid_disk == rdev->raid_disk)
3064 continue;
3065 sprintf(nm, "rd%d", rdev->raid_disk);
3066 sysfs_remove_link(&mddev->kobj, nm);
3067 }
3068 list_for_each_entry(rdev, &mddev->disks, same_set) {
3069 if (rdev->raid_disk < 0)
3070 continue;
3071 if (rdev->new_raid_disk == rdev->raid_disk)
3072 continue;
3073 rdev->raid_disk = rdev->new_raid_disk;
3074 if (rdev->raid_disk < 0)
3059 clear_bit(In_sync, &rdev->flags); 3075 clear_bit(In_sync, &rdev->flags);
3076 else {
3077 char nm[20];
3078 sprintf(nm, "rd%d", rdev->raid_disk);
3079 if(sysfs_create_link(&mddev->kobj, &rdev->kobj, nm))
3080 printk("md: cannot register %s for %s after level change\n",
3081 nm, mdname(mddev));
3060 } 3082 }
3083 }
3084
3085 module_put(mddev->pers->owner);
3061 mddev->pers = pers; 3086 mddev->pers = pers;
3062 mddev->private = priv; 3087 mddev->private = priv;
3063 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); 3088 strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));