diff options
Diffstat (limited to 'drivers/md/md.c')
| -rw-r--r-- | drivers/md/md.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 46b3a044eadf..cb20d0b0555a 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -2087,6 +2087,7 @@ static void sync_sbs(mddev_t * mddev, int nospares) | |||
| 2087 | /* First make sure individual recovery_offsets are correct */ | 2087 | /* First make sure individual recovery_offsets are correct */ |
| 2088 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 2088 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
| 2089 | if (rdev->raid_disk >= 0 && | 2089 | if (rdev->raid_disk >= 0 && |
| 2090 | mddev->delta_disks >= 0 && | ||
| 2090 | !test_bit(In_sync, &rdev->flags) && | 2091 | !test_bit(In_sync, &rdev->flags) && |
| 2091 | mddev->curr_resync_completed > rdev->recovery_offset) | 2092 | mddev->curr_resync_completed > rdev->recovery_offset) |
| 2092 | rdev->recovery_offset = mddev->curr_resync_completed; | 2093 | rdev->recovery_offset = mddev->curr_resync_completed; |
| @@ -3001,6 +3002,9 @@ level_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3001 | return -EINVAL; | 3002 | return -EINVAL; |
| 3002 | } | 3003 | } |
| 3003 | 3004 | ||
| 3005 | list_for_each_entry(rdev, &mddev->disks, same_set) | ||
| 3006 | rdev->new_raid_disk = rdev->raid_disk; | ||
| 3007 | |||
| 3004 | /* ->takeover must set new_* and/or delta_disks | 3008 | /* ->takeover must set new_* and/or delta_disks |
| 3005 | * if it succeeds, and may set them when it fails. | 3009 | * if it succeeds, and may set them when it fails. |
| 3006 | */ | 3010 | */ |
| @@ -3051,13 +3055,35 @@ level_store(mddev_t *mddev, const char *buf, size_t len) | |||
| 3051 | mddev->safemode = 0; | 3055 | mddev->safemode = 0; |
| 3052 | } | 3056 | } |
| 3053 | 3057 | ||
| 3054 | module_put(mddev->pers->owner); | 3058 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
| 3055 | /* Invalidate devices that are now superfluous */ | 3059 | char nm[20]; |
| 3056 | list_for_each_entry(rdev, &mddev->disks, same_set) | 3060 | if (rdev->raid_disk < 0) |
| 3057 | if (rdev->raid_disk >= mddev->raid_disks) { | 3061 | continue; |
| 3058 | rdev->raid_disk = -1; | 3062 | if (rdev->new_raid_disk > mddev->raid_disks) |
| 3063 | rdev->new_raid_disk = -1; | ||
| 3064 | if (rdev->new_raid_disk == rdev->raid_disk) | ||
| 3065 | continue; | ||
| 3066 | sprintf(nm, "rd%d", rdev->raid_disk); | ||
| 3067 | sysfs_remove_link(&mddev->kobj, nm); | ||
| 3068 | } | ||
| 3069 | list_for_each_entry(rdev, &mddev->disks, same_set) { | ||
| 3070 | if (rdev->raid_disk < 0) | ||
| 3071 | continue; | ||
| 3072 | if (rdev->new_raid_disk == rdev->raid_disk) | ||
| 3073 | continue; | ||
| 3074 | rdev->raid_disk = rdev->new_raid_disk; | ||
| 3075 | if (rdev->raid_disk < 0) | ||
| 3059 | clear_bit(In_sync, &rdev->flags); | 3076 | clear_bit(In_sync, &rdev->flags); |
| 3077 | else { | ||
| 3078 | char nm[20]; | ||
| 3079 | sprintf(nm, "rd%d", rdev->raid_disk); | ||
| 3080 | if(sysfs_create_link(&mddev->kobj, &rdev->kobj, nm)) | ||
| 3081 | printk("md: cannot register %s for %s after level change\n", | ||
| 3082 | nm, mdname(mddev)); | ||
| 3060 | } | 3083 | } |
| 3084 | } | ||
| 3085 | |||
| 3086 | module_put(mddev->pers->owner); | ||
| 3061 | mddev->pers = pers; | 3087 | mddev->pers = pers; |
| 3062 | mddev->private = priv; | 3088 | mddev->private = priv; |
| 3063 | strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); | 3089 | strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); |
| @@ -5895,6 +5921,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) | |||
| 5895 | atomic_inc(&mddev->openers); | 5921 | atomic_inc(&mddev->openers); |
| 5896 | mutex_unlock(&mddev->open_mutex); | 5922 | mutex_unlock(&mddev->open_mutex); |
| 5897 | 5923 | ||
| 5924 | check_disk_size_change(mddev->gendisk, bdev); | ||
| 5898 | out: | 5925 | out: |
| 5899 | return err; | 5926 | return err; |
| 5900 | } | 5927 | } |
| @@ -6846,6 +6873,7 @@ void md_do_sync(mddev_t *mddev) | |||
| 6846 | rcu_read_lock(); | 6873 | rcu_read_lock(); |
| 6847 | list_for_each_entry_rcu(rdev, &mddev->disks, same_set) | 6874 | list_for_each_entry_rcu(rdev, &mddev->disks, same_set) |
| 6848 | if (rdev->raid_disk >= 0 && | 6875 | if (rdev->raid_disk >= 0 && |
| 6876 | mddev->delta_disks >= 0 && | ||
| 6849 | !test_bit(Faulty, &rdev->flags) && | 6877 | !test_bit(Faulty, &rdev->flags) && |
| 6850 | !test_bit(In_sync, &rdev->flags) && | 6878 | !test_bit(In_sync, &rdev->flags) && |
| 6851 | rdev->recovery_offset < mddev->curr_resync) | 6879 | rdev->recovery_offset < mddev->curr_resync) |
