aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid5.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r--drivers/md/raid5.c42
1 files changed, 16 insertions, 26 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index b84766e347c3..136051bc6725 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5165,7 +5165,7 @@ static void *raid5_takeover_raid6(mddev_t *mddev)
5165} 5165}
5166 5166
5167 5167
5168static int raid5_reconfig(mddev_t *mddev, int new_layout, int new_chunk) 5168static int raid5_reconfig(mddev_t *mddev)
5169{ 5169{
5170 /* For a 2-drive array, the layout and chunk size can be changed 5170 /* For a 2-drive array, the layout and chunk size can be changed
5171 * immediately as not restriping is needed. 5171 * immediately as not restriping is needed.
@@ -5173,15 +5173,16 @@ static int raid5_reconfig(mddev_t *mddev, int new_layout, int new_chunk)
5173 * to be used by a reshape pass. 5173 * to be used by a reshape pass.
5174 */ 5174 */
5175 raid5_conf_t *conf = mddev->private; 5175 raid5_conf_t *conf = mddev->private;
5176 int new_chunk = mddev->new_chunk_sectors;
5176 5177
5177 if (new_layout >= 0 && !algorithm_valid_raid5(new_layout)) 5178 if (mddev->new_layout >= 0 && !algorithm_valid_raid5(mddev->new_layout))
5178 return -EINVAL; 5179 return -EINVAL;
5179 if (new_chunk > 0) { 5180 if (new_chunk > 0) {
5180 if (!is_power_of_2(new_chunk)) 5181 if (!is_power_of_2(new_chunk))
5181 return -EINVAL; 5182 return -EINVAL;
5182 if (new_chunk < PAGE_SIZE) 5183 if (new_chunk < (PAGE_SIZE>>9))
5183 return -EINVAL; 5184 return -EINVAL;
5184 if (mddev->array_sectors & ((new_chunk>>9)-1)) 5185 if (mddev->array_sectors & (new_chunk-1))
5185 /* not factor of array size */ 5186 /* not factor of array size */
5186 return -EINVAL; 5187 return -EINVAL;
5187 } 5188 }
@@ -5189,48 +5190,37 @@ static int raid5_reconfig(mddev_t *mddev, int new_layout, int new_chunk)
5189 /* They look valid */ 5190 /* They look valid */
5190 5191
5191 if (mddev->raid_disks == 2) { 5192 if (mddev->raid_disks == 2) {
5192 5193 /* can make the change immediately */
5193 if (new_layout >= 0) { 5194 if (mddev->new_layout >= 0) {
5194 conf->algorithm = new_layout; 5195 conf->algorithm = mddev->new_layout;
5195 mddev->layout = mddev->new_layout = new_layout; 5196 mddev->layout = mddev->new_layout;
5196 } 5197 }
5197 if (new_chunk > 0) { 5198 if (new_chunk > 0) {
5198 conf->chunk_sectors = new_chunk >> 9; 5199 conf->chunk_sectors = new_chunk ;
5199 mddev->new_chunk_sectors = new_chunk >> 9; 5200 mddev->chunk_sectors = new_chunk;
5200 mddev->chunk_sectors = new_chunk >> 9;
5201 } 5201 }
5202 set_bit(MD_CHANGE_DEVS, &mddev->flags); 5202 set_bit(MD_CHANGE_DEVS, &mddev->flags);
5203 md_wakeup_thread(mddev->thread); 5203 md_wakeup_thread(mddev->thread);
5204 } else {
5205 if (new_layout >= 0)
5206 mddev->new_layout = new_layout;
5207 if (new_chunk > 0)
5208 mddev->new_chunk_sectors = new_chunk >> 9;
5209 } 5204 }
5210 return 0; 5205 return 0;
5211} 5206}
5212 5207
5213static int raid6_reconfig(mddev_t *mddev, int new_layout, int new_chunk) 5208static int raid6_reconfig(mddev_t *mddev)
5214{ 5209{
5215 if (new_layout >= 0 && !algorithm_valid_raid6(new_layout)) 5210 int new_chunk = mddev->new_chunk_sectors;
5211 if (mddev->new_layout >= 0 && !algorithm_valid_raid6(mddev->new_layout))
5216 return -EINVAL; 5212 return -EINVAL;
5217 if (new_chunk > 0) { 5213 if (new_chunk > 0) {
5218 if (!is_power_of_2(new_chunk)) 5214 if (!is_power_of_2(new_chunk))
5219 return -EINVAL; 5215 return -EINVAL;
5220 if (new_chunk < PAGE_SIZE) 5216 if (new_chunk < (PAGE_SIZE >> 9))
5221 return -EINVAL; 5217 return -EINVAL;
5222 if (mddev->array_sectors & ((new_chunk>>9)-1)) 5218 if (mddev->array_sectors & (new_chunk-1))
5223 /* not factor of array size */ 5219 /* not factor of array size */
5224 return -EINVAL; 5220 return -EINVAL;
5225 } 5221 }
5226 5222
5227 /* They look valid */ 5223 /* They look valid */
5228
5229 if (new_layout >= 0)
5230 mddev->new_layout = new_layout;
5231 if (new_chunk > 0)
5232 mddev->new_chunk_sectors = new_chunk >> 9;
5233
5234 return 0; 5224 return 0;
5235} 5225}
5236 5226