diff options
author | Andre Noll <maan@systemlinux.org> | 2009-06-17 18:45:01 -0400 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-06-17 18:45:01 -0400 |
commit | 9d8f0363623b3da12c43007cf77f5e1a4e8a5964 (patch) | |
tree | 0fee53971a397ade209dd36c4f1ed50db6450faf | |
parent | fbb704efb784e2c8418e34dc3013af76bdd58101 (diff) |
md: Make mddev->chunk_size sector-based.
This patch renames the chunk_size field to chunk_sectors with the
implied change of semantics. Since
is_power_of_2(chunk_size) = is_power_of_2(chunk_sectors << 9)
= is_power_of_2(chunk_sectors)
these bits don't need an adjustment for the shift.
Signed-off-by: Andre Noll <maan@systemlinux.org>
Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r-- | drivers/md/linear.c | 2 | ||||
-rw-r--r-- | drivers/md/md.c | 51 | ||||
-rw-r--r-- | drivers/md/md.h | 2 | ||||
-rw-r--r-- | drivers/md/raid0.c | 27 | ||||
-rw-r--r-- | drivers/md/raid1.c | 4 | ||||
-rw-r--r-- | drivers/md/raid10.c | 15 | ||||
-rw-r--r-- | drivers/md/raid5.c | 41 |
7 files changed, 74 insertions, 68 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index 9b02a73fbc6b..9f7cec42dd8e 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
@@ -305,7 +305,7 @@ static int linear_make_request (struct request_queue *q, struct bio *bio) | |||
305 | static void linear_status (struct seq_file *seq, mddev_t *mddev) | 305 | static void linear_status (struct seq_file *seq, mddev_t *mddev) |
306 | { | 306 | { |
307 | 307 | ||
308 | seq_printf(seq, " %dk rounding", mddev->chunk_size/1024); | 308 | seq_printf(seq, " %dk rounding", mddev->chunk_sectors / 2); |
309 | } | 309 | } |
310 | 310 | ||
311 | 311 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index a02bde70874b..abcc0fef30e3 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -869,7 +869,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) | |||
869 | mddev->minor_version = sb->minor_version; | 869 | mddev->minor_version = sb->minor_version; |
870 | mddev->patch_version = sb->patch_version; | 870 | mddev->patch_version = sb->patch_version; |
871 | mddev->external = 0; | 871 | mddev->external = 0; |
872 | mddev->chunk_size = sb->chunk_size; | 872 | mddev->chunk_sectors = sb->chunk_size >> 9; |
873 | mddev->ctime = sb->ctime; | 873 | mddev->ctime = sb->ctime; |
874 | mddev->utime = sb->utime; | 874 | mddev->utime = sb->utime; |
875 | mddev->level = sb->level; | 875 | mddev->level = sb->level; |
@@ -892,7 +892,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev) | |||
892 | mddev->delta_disks = 0; | 892 | mddev->delta_disks = 0; |
893 | mddev->new_level = mddev->level; | 893 | mddev->new_level = mddev->level; |
894 | mddev->new_layout = mddev->layout; | 894 | mddev->new_layout = mddev->layout; |
895 | mddev->new_chunk = mddev->chunk_size; | 895 | mddev->new_chunk = mddev->chunk_sectors << 9; |
896 | } | 896 | } |
897 | 897 | ||
898 | if (sb->state & (1<<MD_SB_CLEAN)) | 898 | if (sb->state & (1<<MD_SB_CLEAN)) |
@@ -1021,7 +1021,7 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1021 | sb->recovery_cp = 0; | 1021 | sb->recovery_cp = 0; |
1022 | 1022 | ||
1023 | sb->layout = mddev->layout; | 1023 | sb->layout = mddev->layout; |
1024 | sb->chunk_size = mddev->chunk_size; | 1024 | sb->chunk_size = mddev->chunk_sectors << 9; |
1025 | 1025 | ||
1026 | if (mddev->bitmap && mddev->bitmap_file == NULL) | 1026 | if (mddev->bitmap && mddev->bitmap_file == NULL) |
1027 | sb->state |= (1<<MD_SB_BITMAP_PRESENT); | 1027 | sb->state |= (1<<MD_SB_BITMAP_PRESENT); |
@@ -1278,7 +1278,7 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1278 | mddev->major_version = 1; | 1278 | mddev->major_version = 1; |
1279 | mddev->patch_version = 0; | 1279 | mddev->patch_version = 0; |
1280 | mddev->external = 0; | 1280 | mddev->external = 0; |
1281 | mddev->chunk_size = le32_to_cpu(sb->chunksize) << 9; | 1281 | mddev->chunk_sectors = le32_to_cpu(sb->chunksize); |
1282 | mddev->ctime = le64_to_cpu(sb->ctime) & ((1ULL << 32)-1); | 1282 | mddev->ctime = le64_to_cpu(sb->ctime) & ((1ULL << 32)-1); |
1283 | mddev->utime = le64_to_cpu(sb->utime) & ((1ULL << 32)-1); | 1283 | mddev->utime = le64_to_cpu(sb->utime) & ((1ULL << 32)-1); |
1284 | mddev->level = le32_to_cpu(sb->level); | 1284 | mddev->level = le32_to_cpu(sb->level); |
@@ -1310,7 +1310,7 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1310 | mddev->delta_disks = 0; | 1310 | mddev->delta_disks = 0; |
1311 | mddev->new_level = mddev->level; | 1311 | mddev->new_level = mddev->level; |
1312 | mddev->new_layout = mddev->layout; | 1312 | mddev->new_layout = mddev->layout; |
1313 | mddev->new_chunk = mddev->chunk_size; | 1313 | mddev->new_chunk = mddev->chunk_sectors << 9; |
1314 | } | 1314 | } |
1315 | 1315 | ||
1316 | } else if (mddev->pers == NULL) { | 1316 | } else if (mddev->pers == NULL) { |
@@ -1382,7 +1382,7 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1382 | 1382 | ||
1383 | sb->raid_disks = cpu_to_le32(mddev->raid_disks); | 1383 | sb->raid_disks = cpu_to_le32(mddev->raid_disks); |
1384 | sb->size = cpu_to_le64(mddev->dev_sectors); | 1384 | sb->size = cpu_to_le64(mddev->dev_sectors); |
1385 | sb->chunksize = cpu_to_le32(mddev->chunk_size >> 9); | 1385 | sb->chunksize = cpu_to_le32(mddev->chunk_sectors); |
1386 | sb->level = cpu_to_le32(mddev->level); | 1386 | sb->level = cpu_to_le32(mddev->level); |
1387 | sb->layout = cpu_to_le32(mddev->layout); | 1387 | sb->layout = cpu_to_le32(mddev->layout); |
1388 | 1388 | ||
@@ -2753,7 +2753,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len) | |||
2753 | if (IS_ERR(priv)) { | 2753 | if (IS_ERR(priv)) { |
2754 | mddev->new_level = mddev->level; | 2754 | mddev->new_level = mddev->level; |
2755 | mddev->new_layout = mddev->layout; | 2755 | mddev->new_layout = mddev->layout; |
2756 | mddev->new_chunk = mddev->chunk_size; | 2756 | mddev->new_chunk = mddev->chunk_sectors << 9; |
2757 | mddev->raid_disks -= mddev->delta_disks; | 2757 | mddev->raid_disks -= mddev->delta_disks; |
2758 | mddev->delta_disks = 0; | 2758 | mddev->delta_disks = 0; |
2759 | module_put(pers->owner); | 2759 | module_put(pers->owner); |
@@ -2771,7 +2771,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len) | |||
2771 | strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); | 2771 | strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel)); |
2772 | mddev->level = mddev->new_level; | 2772 | mddev->level = mddev->new_level; |
2773 | mddev->layout = mddev->new_layout; | 2773 | mddev->layout = mddev->new_layout; |
2774 | mddev->chunk_size = mddev->new_chunk; | 2774 | mddev->chunk_sectors = mddev->new_chunk >> 9; |
2775 | mddev->delta_disks = 0; | 2775 | mddev->delta_disks = 0; |
2776 | pers->run(mddev); | 2776 | pers->run(mddev); |
2777 | mddev_resume(mddev); | 2777 | mddev_resume(mddev); |
@@ -2864,10 +2864,10 @@ static ssize_t | |||
2864 | chunk_size_show(mddev_t *mddev, char *page) | 2864 | chunk_size_show(mddev_t *mddev, char *page) |
2865 | { | 2865 | { |
2866 | if (mddev->reshape_position != MaxSector && | 2866 | if (mddev->reshape_position != MaxSector && |
2867 | mddev->chunk_size != mddev->new_chunk) | 2867 | mddev->chunk_sectors << 9 != mddev->new_chunk) |
2868 | return sprintf(page, "%d (%d)\n", mddev->new_chunk, | 2868 | return sprintf(page, "%d (%d)\n", mddev->new_chunk, |
2869 | mddev->chunk_size); | 2869 | mddev->chunk_sectors << 9); |
2870 | return sprintf(page, "%d\n", mddev->chunk_size); | 2870 | return sprintf(page, "%d\n", mddev->chunk_sectors << 9); |
2871 | } | 2871 | } |
2872 | 2872 | ||
2873 | static ssize_t | 2873 | static ssize_t |
@@ -2889,7 +2889,7 @@ chunk_size_store(mddev_t *mddev, const char *buf, size_t len) | |||
2889 | } else { | 2889 | } else { |
2890 | mddev->new_chunk = n; | 2890 | mddev->new_chunk = n; |
2891 | if (mddev->reshape_position == MaxSector) | 2891 | if (mddev->reshape_position == MaxSector) |
2892 | mddev->chunk_size = n; | 2892 | mddev->chunk_sectors = n >> 9; |
2893 | } | 2893 | } |
2894 | return len; | 2894 | return len; |
2895 | } | 2895 | } |
@@ -3534,9 +3534,9 @@ min_sync_store(mddev_t *mddev, const char *buf, size_t len) | |||
3534 | return -EBUSY; | 3534 | return -EBUSY; |
3535 | 3535 | ||
3536 | /* Must be a multiple of chunk_size */ | 3536 | /* Must be a multiple of chunk_size */ |
3537 | if (mddev->chunk_size) { | 3537 | if (mddev->chunk_sectors) { |
3538 | sector_t temp = min; | 3538 | sector_t temp = min; |
3539 | if (sector_div(temp, (mddev->chunk_size>>9))) | 3539 | if (sector_div(temp, mddev->chunk_sectors)) |
3540 | return -EINVAL; | 3540 | return -EINVAL; |
3541 | } | 3541 | } |
3542 | mddev->resync_min = min; | 3542 | mddev->resync_min = min; |
@@ -3572,9 +3572,9 @@ max_sync_store(mddev_t *mddev, const char *buf, size_t len) | |||
3572 | return -EBUSY; | 3572 | return -EBUSY; |
3573 | 3573 | ||
3574 | /* Must be a multiple of chunk_size */ | 3574 | /* Must be a multiple of chunk_size */ |
3575 | if (mddev->chunk_size) { | 3575 | if (mddev->chunk_sectors) { |
3576 | sector_t temp = max; | 3576 | sector_t temp = max; |
3577 | if (sector_div(temp, (mddev->chunk_size>>9))) | 3577 | if (sector_div(temp, mddev->chunk_sectors)) |
3578 | return -EINVAL; | 3578 | return -EINVAL; |
3579 | } | 3579 | } |
3580 | mddev->resync_max = max; | 3580 | mddev->resync_max = max; |
@@ -3665,7 +3665,7 @@ reshape_position_store(mddev_t *mddev, const char *buf, size_t len) | |||
3665 | mddev->delta_disks = 0; | 3665 | mddev->delta_disks = 0; |
3666 | mddev->new_level = mddev->level; | 3666 | mddev->new_level = mddev->level; |
3667 | mddev->new_layout = mddev->layout; | 3667 | mddev->new_layout = mddev->layout; |
3668 | mddev->new_chunk = mddev->chunk_size; | 3668 | mddev->new_chunk = mddev->chunk_sectors << 9; |
3669 | return len; | 3669 | return len; |
3670 | } | 3670 | } |
3671 | 3671 | ||
@@ -4007,7 +4007,7 @@ static int do_md_run(mddev_t * mddev) | |||
4007 | analyze_sbs(mddev); | 4007 | analyze_sbs(mddev); |
4008 | } | 4008 | } |
4009 | 4009 | ||
4010 | chunk_size = mddev->chunk_size; | 4010 | chunk_size = mddev->chunk_sectors << 9; |
4011 | 4011 | ||
4012 | if (chunk_size) { | 4012 | if (chunk_size) { |
4013 | if (chunk_size > MAX_CHUNK_SIZE) { | 4013 | if (chunk_size > MAX_CHUNK_SIZE) { |
@@ -4406,7 +4406,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open) | |||
4406 | mddev->flags = 0; | 4406 | mddev->flags = 0; |
4407 | mddev->ro = 0; | 4407 | mddev->ro = 0; |
4408 | mddev->metadata_type[0] = 0; | 4408 | mddev->metadata_type[0] = 0; |
4409 | mddev->chunk_size = 0; | 4409 | mddev->chunk_sectors = 0; |
4410 | mddev->ctime = mddev->utime = 0; | 4410 | mddev->ctime = mddev->utime = 0; |
4411 | mddev->layout = 0; | 4411 | mddev->layout = 0; |
4412 | mddev->max_disks = 0; | 4412 | mddev->max_disks = 0; |
@@ -4619,7 +4619,7 @@ static int get_array_info(mddev_t * mddev, void __user * arg) | |||
4619 | info.spare_disks = spare; | 4619 | info.spare_disks = spare; |
4620 | 4620 | ||
4621 | info.layout = mddev->layout; | 4621 | info.layout = mddev->layout; |
4622 | info.chunk_size = mddev->chunk_size; | 4622 | info.chunk_size = mddev->chunk_sectors << 9; |
4623 | 4623 | ||
4624 | if (copy_to_user(arg, &info, sizeof(info))) | 4624 | if (copy_to_user(arg, &info, sizeof(info))) |
4625 | return -EFAULT; | 4625 | return -EFAULT; |
@@ -4844,7 +4844,8 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info) | |||
4844 | rdev->sb_start = rdev->bdev->bd_inode->i_size / 512; | 4844 | rdev->sb_start = rdev->bdev->bd_inode->i_size / 512; |
4845 | } else | 4845 | } else |
4846 | rdev->sb_start = calc_dev_sboffset(rdev->bdev); | 4846 | rdev->sb_start = calc_dev_sboffset(rdev->bdev); |
4847 | rdev->sectors = calc_num_sectors(rdev, mddev->chunk_size); | 4847 | rdev->sectors = calc_num_sectors(rdev, |
4848 | mddev->chunk_sectors << 9); | ||
4848 | 4849 | ||
4849 | err = bind_rdev_to_array(rdev, mddev); | 4850 | err = bind_rdev_to_array(rdev, mddev); |
4850 | if (err) { | 4851 | if (err) { |
@@ -4914,7 +4915,7 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev) | |||
4914 | else | 4915 | else |
4915 | rdev->sb_start = rdev->bdev->bd_inode->i_size / 512; | 4916 | rdev->sb_start = rdev->bdev->bd_inode->i_size / 512; |
4916 | 4917 | ||
4917 | rdev->sectors = calc_num_sectors(rdev, mddev->chunk_size); | 4918 | rdev->sectors = calc_num_sectors(rdev, mddev->chunk_sectors << 9); |
4918 | 4919 | ||
4919 | if (test_bit(Faulty, &rdev->flags)) { | 4920 | if (test_bit(Faulty, &rdev->flags)) { |
4920 | printk(KERN_WARNING | 4921 | printk(KERN_WARNING |
@@ -5063,7 +5064,7 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info) | |||
5063 | mddev->external = 0; | 5064 | mddev->external = 0; |
5064 | 5065 | ||
5065 | mddev->layout = info->layout; | 5066 | mddev->layout = info->layout; |
5066 | mddev->chunk_size = info->chunk_size; | 5067 | mddev->chunk_sectors = info->chunk_size >> 9; |
5067 | 5068 | ||
5068 | mddev->max_disks = MD_SB_DISKS; | 5069 | mddev->max_disks = MD_SB_DISKS; |
5069 | 5070 | ||
@@ -5082,7 +5083,7 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info) | |||
5082 | get_random_bytes(mddev->uuid, 16); | 5083 | get_random_bytes(mddev->uuid, 16); |
5083 | 5084 | ||
5084 | mddev->new_level = mddev->level; | 5085 | mddev->new_level = mddev->level; |
5085 | mddev->new_chunk = mddev->chunk_size; | 5086 | mddev->new_chunk = mddev->chunk_sectors << 9; |
5086 | mddev->new_layout = mddev->layout; | 5087 | mddev->new_layout = mddev->layout; |
5087 | mddev->delta_disks = 0; | 5088 | mddev->delta_disks = 0; |
5088 | 5089 | ||
@@ -5192,7 +5193,7 @@ static int update_array_info(mddev_t *mddev, mdu_array_info_t *info) | |||
5192 | mddev->level != info->level || | 5193 | mddev->level != info->level || |
5193 | /* mddev->layout != info->layout || */ | 5194 | /* mddev->layout != info->layout || */ |
5194 | !mddev->persistent != info->not_persistent|| | 5195 | !mddev->persistent != info->not_persistent|| |
5195 | mddev->chunk_size != info->chunk_size || | 5196 | mddev->chunk_sectors != info->chunk_size >> 9 || |
5196 | /* ignore bottom 8 bits of state, and allow SB_BITMAP_PRESENT to change */ | 5197 | /* ignore bottom 8 bits of state, and allow SB_BITMAP_PRESENT to change */ |
5197 | ((state^info->state) & 0xfffffe00) | 5198 | ((state^info->state) & 0xfffffe00) |
5198 | ) | 5199 | ) |
diff --git a/drivers/md/md.h b/drivers/md/md.h index 8227ab909d44..5d78830043d0 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
@@ -145,7 +145,7 @@ struct mddev_s | |||
145 | int external; /* metadata is | 145 | int external; /* metadata is |
146 | * managed externally */ | 146 | * managed externally */ |
147 | char metadata_type[17]; /* externally set*/ | 147 | char metadata_type[17]; /* externally set*/ |
148 | int chunk_size; | 148 | int chunk_sectors; |
149 | time_t ctime, utime; | 149 | time_t ctime, utime; |
150 | int level, layout; | 150 | int level, layout; |
151 | char clevel[16]; | 151 | char clevel[16]; |
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 7cd2671cc794..f20b18ff7969 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
@@ -238,10 +238,10 @@ static int create_strip_zones(mddev_t *mddev) | |||
238 | * now since we have the hard sector sizes, we can make sure | 238 | * now since we have the hard sector sizes, we can make sure |
239 | * chunk size is a multiple of that sector size | 239 | * chunk size is a multiple of that sector size |
240 | */ | 240 | */ |
241 | if (mddev->chunk_size % queue_logical_block_size(mddev->queue)) { | 241 | if ((mddev->chunk_sectors << 9) % queue_logical_block_size(mddev->queue)) { |
242 | printk(KERN_ERR "%s chunk_size of %d not valid\n", | 242 | printk(KERN_ERR "%s chunk_size of %d not valid\n", |
243 | mdname(mddev), | 243 | mdname(mddev), |
244 | mddev->chunk_size); | 244 | mddev->chunk_sectors << 9); |
245 | goto abort; | 245 | goto abort; |
246 | } | 246 | } |
247 | printk(KERN_INFO "raid0: done.\n"); | 247 | printk(KERN_INFO "raid0: done.\n"); |
@@ -270,10 +270,10 @@ static int raid0_mergeable_bvec(struct request_queue *q, | |||
270 | mddev_t *mddev = q->queuedata; | 270 | mddev_t *mddev = q->queuedata; |
271 | sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev); | 271 | sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev); |
272 | int max; | 272 | int max; |
273 | unsigned int chunk_sectors = mddev->chunk_size >> 9; | 273 | unsigned int chunk_sectors = mddev->chunk_sectors; |
274 | unsigned int bio_sectors = bvm->bi_size >> 9; | 274 | unsigned int bio_sectors = bvm->bi_size >> 9; |
275 | 275 | ||
276 | if (is_power_of_2(mddev->chunk_size)) | 276 | if (is_power_of_2(mddev->chunk_sectors)) |
277 | max = (chunk_sectors - ((sector & (chunk_sectors-1)) | 277 | max = (chunk_sectors - ((sector & (chunk_sectors-1)) |
278 | + bio_sectors)) << 9; | 278 | + bio_sectors)) << 9; |
279 | else | 279 | else |
@@ -304,11 +304,11 @@ static int raid0_run(mddev_t *mddev) | |||
304 | { | 304 | { |
305 | int ret; | 305 | int ret; |
306 | 306 | ||
307 | if (mddev->chunk_size == 0) { | 307 | if (mddev->chunk_sectors == 0) { |
308 | printk(KERN_ERR "md/raid0: chunk size must be set.\n"); | 308 | printk(KERN_ERR "md/raid0: chunk size must be set.\n"); |
309 | return -EINVAL; | 309 | return -EINVAL; |
310 | } | 310 | } |
311 | blk_queue_max_sectors(mddev->queue, mddev->chunk_size >> 9); | 311 | blk_queue_max_sectors(mddev->queue, mddev->chunk_sectors); |
312 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; | 312 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; |
313 | 313 | ||
314 | ret = create_strip_zones(mddev); | 314 | ret = create_strip_zones(mddev); |
@@ -330,7 +330,8 @@ static int raid0_run(mddev_t *mddev) | |||
330 | * chunksize should be used in that case. | 330 | * chunksize should be used in that case. |
331 | */ | 331 | */ |
332 | { | 332 | { |
333 | int stripe = mddev->raid_disks * mddev->chunk_size / PAGE_SIZE; | 333 | int stripe = mddev->raid_disks * |
334 | (mddev->chunk_sectors << 9) / PAGE_SIZE; | ||
334 | if (mddev->queue->backing_dev_info.ra_pages < 2* stripe) | 335 | if (mddev->queue->backing_dev_info.ra_pages < 2* stripe) |
335 | mddev->queue->backing_dev_info.ra_pages = 2* stripe; | 336 | mddev->queue->backing_dev_info.ra_pages = 2* stripe; |
336 | } | 337 | } |
@@ -381,9 +382,9 @@ static mdk_rdev_t *map_sector(mddev_t *mddev, struct strip_zone *zone, | |||
381 | unsigned int sect_in_chunk; | 382 | unsigned int sect_in_chunk; |
382 | sector_t chunk; | 383 | sector_t chunk; |
383 | raid0_conf_t *conf = mddev->private; | 384 | raid0_conf_t *conf = mddev->private; |
384 | unsigned int chunk_sects = mddev->chunk_size >> 9; | 385 | unsigned int chunk_sects = mddev->chunk_sectors; |
385 | 386 | ||
386 | if (is_power_of_2(mddev->chunk_size)) { | 387 | if (is_power_of_2(mddev->chunk_sectors)) { |
387 | int chunksect_bits = ffz(~chunk_sects); | 388 | int chunksect_bits = ffz(~chunk_sects); |
388 | /* find the sector offset inside the chunk */ | 389 | /* find the sector offset inside the chunk */ |
389 | sect_in_chunk = sector & (chunk_sects - 1); | 390 | sect_in_chunk = sector & (chunk_sects - 1); |
@@ -413,7 +414,7 @@ static mdk_rdev_t *map_sector(mddev_t *mddev, struct strip_zone *zone, | |||
413 | static inline int is_io_in_chunk_boundary(mddev_t *mddev, | 414 | static inline int is_io_in_chunk_boundary(mddev_t *mddev, |
414 | unsigned int chunk_sects, struct bio *bio) | 415 | unsigned int chunk_sects, struct bio *bio) |
415 | { | 416 | { |
416 | if (likely(is_power_of_2(mddev->chunk_size))) { | 417 | if (likely(is_power_of_2(mddev->chunk_sectors))) { |
417 | return chunk_sects >= ((bio->bi_sector & (chunk_sects-1)) | 418 | return chunk_sects >= ((bio->bi_sector & (chunk_sects-1)) |
418 | + (bio->bi_size >> 9)); | 419 | + (bio->bi_size >> 9)); |
419 | } else{ | 420 | } else{ |
@@ -444,7 +445,7 @@ static int raid0_make_request(struct request_queue *q, struct bio *bio) | |||
444 | bio_sectors(bio)); | 445 | bio_sectors(bio)); |
445 | part_stat_unlock(); | 446 | part_stat_unlock(); |
446 | 447 | ||
447 | chunk_sects = mddev->chunk_size >> 9; | 448 | chunk_sects = mddev->chunk_sectors; |
448 | if (unlikely(!is_io_in_chunk_boundary(mddev, chunk_sects, bio))) { | 449 | if (unlikely(!is_io_in_chunk_boundary(mddev, chunk_sects, bio))) { |
449 | sector_t sector = bio->bi_sector; | 450 | sector_t sector = bio->bi_sector; |
450 | struct bio_pair *bp; | 451 | struct bio_pair *bp; |
@@ -455,7 +456,7 @@ static int raid0_make_request(struct request_queue *q, struct bio *bio) | |||
455 | /* This is a one page bio that upper layers | 456 | /* This is a one page bio that upper layers |
456 | * refuse to split for us, so we need to split it. | 457 | * refuse to split for us, so we need to split it. |
457 | */ | 458 | */ |
458 | if (likely(is_power_of_2(mddev->chunk_size))) | 459 | if (likely(is_power_of_2(mddev->chunk_sectors))) |
459 | bp = bio_split(bio, chunk_sects - (sector & | 460 | bp = bio_split(bio, chunk_sects - (sector & |
460 | (chunk_sects-1))); | 461 | (chunk_sects-1))); |
461 | else | 462 | else |
@@ -519,7 +520,7 @@ static void raid0_status(struct seq_file *seq, mddev_t *mddev) | |||
519 | zone_start = conf->strip_zone[j].zone_end; | 520 | zone_start = conf->strip_zone[j].zone_end; |
520 | } | 521 | } |
521 | #endif | 522 | #endif |
522 | seq_printf(seq, " %dk chunks", mddev->chunk_size/1024); | 523 | seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2); |
523 | return; | 524 | return; |
524 | } | 525 | } |
525 | 526 | ||
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 5ea5bca53a5e..388635735ae5 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -2161,10 +2161,10 @@ static int raid1_reshape(mddev_t *mddev) | |||
2161 | int d, d2, err; | 2161 | int d, d2, err; |
2162 | 2162 | ||
2163 | /* Cannot change chunk_size, layout, or level */ | 2163 | /* Cannot change chunk_size, layout, or level */ |
2164 | if (mddev->chunk_size != mddev->new_chunk || | 2164 | if (mddev->chunk_sectors << 9 != mddev->new_chunk || |
2165 | mddev->layout != mddev->new_layout || | 2165 | mddev->layout != mddev->new_layout || |
2166 | mddev->level != mddev->new_level) { | 2166 | mddev->level != mddev->new_level) { |
2167 | mddev->new_chunk = mddev->chunk_size; | 2167 | mddev->new_chunk = mddev->chunk_sectors << 9; |
2168 | mddev->new_layout = mddev->layout; | 2168 | mddev->new_layout = mddev->layout; |
2169 | mddev->new_level = mddev->level; | 2169 | mddev->new_level = mddev->level; |
2170 | return -EINVAL; | 2170 | return -EINVAL; |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 06bef686f91b..30029a312cf5 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -461,7 +461,7 @@ static int raid10_mergeable_bvec(struct request_queue *q, | |||
461 | mddev_t *mddev = q->queuedata; | 461 | mddev_t *mddev = q->queuedata; |
462 | sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev); | 462 | sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev); |
463 | int max; | 463 | int max; |
464 | unsigned int chunk_sectors = mddev->chunk_size >> 9; | 464 | unsigned int chunk_sectors = mddev->chunk_sectors; |
465 | unsigned int bio_sectors = bvm->bi_size >> 9; | 465 | unsigned int bio_sectors = bvm->bi_size >> 9; |
466 | 466 | ||
467 | max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9; | 467 | max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9; |
@@ -985,7 +985,7 @@ static void status(struct seq_file *seq, mddev_t *mddev) | |||
985 | int i; | 985 | int i; |
986 | 986 | ||
987 | if (conf->near_copies < conf->raid_disks) | 987 | if (conf->near_copies < conf->raid_disks) |
988 | seq_printf(seq, " %dK chunks", mddev->chunk_size/1024); | 988 | seq_printf(seq, " %dK chunks", mddev->chunk_sectors / 2); |
989 | if (conf->near_copies > 1) | 989 | if (conf->near_copies > 1) |
990 | seq_printf(seq, " %d near-copies", conf->near_copies); | 990 | seq_printf(seq, " %d near-copies", conf->near_copies); |
991 | if (conf->far_copies > 1) { | 991 | if (conf->far_copies > 1) { |
@@ -2050,8 +2050,8 @@ static int run(mddev_t *mddev) | |||
2050 | int nc, fc, fo; | 2050 | int nc, fc, fo; |
2051 | sector_t stride, size; | 2051 | sector_t stride, size; |
2052 | 2052 | ||
2053 | if (mddev->chunk_size < PAGE_SIZE || | 2053 | if (mddev->chunk_sectors < (PAGE_SIZE >> 9) || |
2054 | !is_power_of_2(mddev->chunk_size)) { | 2054 | !is_power_of_2(mddev->chunk_sectors)) { |
2055 | printk(KERN_ERR "md/raid10: chunk size must be " | 2055 | printk(KERN_ERR "md/raid10: chunk size must be " |
2056 | "at least PAGE_SIZE(%ld) and be a power of 2.\n", PAGE_SIZE); | 2056 | "at least PAGE_SIZE(%ld) and be a power of 2.\n", PAGE_SIZE); |
2057 | return -EINVAL; | 2057 | return -EINVAL; |
@@ -2096,8 +2096,8 @@ static int run(mddev_t *mddev) | |||
2096 | conf->far_copies = fc; | 2096 | conf->far_copies = fc; |
2097 | conf->copies = nc*fc; | 2097 | conf->copies = nc*fc; |
2098 | conf->far_offset = fo; | 2098 | conf->far_offset = fo; |
2099 | conf->chunk_mask = (sector_t)(mddev->chunk_size>>9)-1; | 2099 | conf->chunk_mask = mddev->chunk_sectors - 1; |
2100 | conf->chunk_shift = ffz(~mddev->chunk_size) - 9; | 2100 | conf->chunk_shift = ffz(~mddev->chunk_sectors); |
2101 | size = mddev->dev_sectors >> conf->chunk_shift; | 2101 | size = mddev->dev_sectors >> conf->chunk_shift; |
2102 | sector_div(size, fc); | 2102 | sector_div(size, fc); |
2103 | size = size * conf->raid_disks; | 2103 | size = size * conf->raid_disks; |
@@ -2205,7 +2205,8 @@ static int run(mddev_t *mddev) | |||
2205 | * maybe... | 2205 | * maybe... |
2206 | */ | 2206 | */ |
2207 | { | 2207 | { |
2208 | int stripe = conf->raid_disks * (mddev->chunk_size / PAGE_SIZE); | 2208 | int stripe = conf->raid_disks * |
2209 | ((mddev->chunk_sectors << 9) / PAGE_SIZE); | ||
2209 | stripe /= conf->near_copies; | 2210 | stripe /= conf->near_copies; |
2210 | if (mddev->queue->backing_dev_info.ra_pages < 2* stripe) | 2211 | if (mddev->queue->backing_dev_info.ra_pages < 2* stripe) |
2211 | mddev->queue->backing_dev_info.ra_pages = 2* stripe; | 2212 | mddev->queue->backing_dev_info.ra_pages = 2* stripe; |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index be4e62f611bc..1e4fd5e8bfdd 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3352,13 +3352,13 @@ static int raid5_mergeable_bvec(struct request_queue *q, | |||
3352 | mddev_t *mddev = q->queuedata; | 3352 | mddev_t *mddev = q->queuedata; |
3353 | sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev); | 3353 | sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev); |
3354 | int max; | 3354 | int max; |
3355 | unsigned int chunk_sectors = mddev->chunk_size >> 9; | 3355 | unsigned int chunk_sectors = mddev->chunk_sectors; |
3356 | unsigned int bio_sectors = bvm->bi_size >> 9; | 3356 | unsigned int bio_sectors = bvm->bi_size >> 9; |
3357 | 3357 | ||
3358 | if ((bvm->bi_rw & 1) == WRITE) | 3358 | if ((bvm->bi_rw & 1) == WRITE) |
3359 | return biovec->bv_len; /* always allow writes to be mergeable */ | 3359 | return biovec->bv_len; /* always allow writes to be mergeable */ |
3360 | 3360 | ||
3361 | if (mddev->new_chunk < mddev->chunk_size) | 3361 | if (mddev->new_chunk < mddev->chunk_sectors << 9) |
3362 | chunk_sectors = mddev->new_chunk >> 9; | 3362 | chunk_sectors = mddev->new_chunk >> 9; |
3363 | max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9; | 3363 | max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9; |
3364 | if (max < 0) max = 0; | 3364 | if (max < 0) max = 0; |
@@ -3372,10 +3372,10 @@ static int raid5_mergeable_bvec(struct request_queue *q, | |||
3372 | static int in_chunk_boundary(mddev_t *mddev, struct bio *bio) | 3372 | static int in_chunk_boundary(mddev_t *mddev, struct bio *bio) |
3373 | { | 3373 | { |
3374 | sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev); | 3374 | sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev); |
3375 | unsigned int chunk_sectors = mddev->chunk_size >> 9; | 3375 | unsigned int chunk_sectors = mddev->chunk_sectors; |
3376 | unsigned int bio_sectors = bio->bi_size >> 9; | 3376 | unsigned int bio_sectors = bio->bi_size >> 9; |
3377 | 3377 | ||
3378 | if (mddev->new_chunk < mddev->chunk_size) | 3378 | if (mddev->new_chunk < mddev->chunk_sectors << 9) |
3379 | chunk_sectors = mddev->new_chunk >> 9; | 3379 | chunk_sectors = mddev->new_chunk >> 9; |
3380 | return chunk_sectors >= | 3380 | return chunk_sectors >= |
3381 | ((sector & (chunk_sectors - 1)) + bio_sectors); | 3381 | ((sector & (chunk_sectors - 1)) + bio_sectors); |
@@ -3791,10 +3791,10 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped | |||
3791 | * If old and new chunk sizes differ, we need to process the | 3791 | * If old and new chunk sizes differ, we need to process the |
3792 | * largest of these | 3792 | * largest of these |
3793 | */ | 3793 | */ |
3794 | if (mddev->new_chunk > mddev->chunk_size) | 3794 | if (mddev->new_chunk > mddev->chunk_sectors << 9) |
3795 | reshape_sectors = mddev->new_chunk / 512; | 3795 | reshape_sectors = mddev->new_chunk / 512; |
3796 | else | 3796 | else |
3797 | reshape_sectors = mddev->chunk_size / 512; | 3797 | reshape_sectors = mddev->chunk_sectors; |
3798 | 3798 | ||
3799 | /* we update the metadata when there is more than 3Meg | 3799 | /* we update the metadata when there is more than 3Meg |
3800 | * in the block range (that is rather arbitrary, should | 3800 | * in the block range (that is rather arbitrary, should |
@@ -4303,7 +4303,7 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks) | |||
4303 | raid_disks = conf->previous_raid_disks; | 4303 | raid_disks = conf->previous_raid_disks; |
4304 | } | 4304 | } |
4305 | 4305 | ||
4306 | sectors &= ~((sector_t)mddev->chunk_size/512 - 1); | 4306 | sectors &= ~((sector_t)mddev->chunk_sectors - 1); |
4307 | sectors &= ~((sector_t)mddev->new_chunk/512 - 1); | 4307 | sectors &= ~((sector_t)mddev->new_chunk/512 - 1); |
4308 | return sectors * (raid_disks - conf->max_degraded); | 4308 | return sectors * (raid_disks - conf->max_degraded); |
4309 | } | 4309 | } |
@@ -4412,7 +4412,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev) | |||
4412 | conf->max_nr_stripes = NR_STRIPES; | 4412 | conf->max_nr_stripes = NR_STRIPES; |
4413 | conf->reshape_progress = mddev->reshape_position; | 4413 | conf->reshape_progress = mddev->reshape_position; |
4414 | if (conf->reshape_progress != MaxSector) { | 4414 | if (conf->reshape_progress != MaxSector) { |
4415 | conf->prev_chunk = mddev->chunk_size; | 4415 | conf->prev_chunk = mddev->chunk_sectors << 9; |
4416 | conf->prev_algo = mddev->layout; | 4416 | conf->prev_algo = mddev->layout; |
4417 | } | 4417 | } |
4418 | 4418 | ||
@@ -4484,7 +4484,7 @@ static int run(mddev_t *mddev) | |||
4484 | } | 4484 | } |
4485 | /* here_new is the stripe we will write to */ | 4485 | /* here_new is the stripe we will write to */ |
4486 | here_old = mddev->reshape_position; | 4486 | here_old = mddev->reshape_position; |
4487 | sector_div(here_old, (mddev->chunk_size>>9)* | 4487 | sector_div(here_old, mddev->chunk_sectors * |
4488 | (old_disks-max_degraded)); | 4488 | (old_disks-max_degraded)); |
4489 | /* here_old is the first stripe that we might need to read | 4489 | /* here_old is the first stripe that we might need to read |
4490 | * from */ | 4490 | * from */ |
@@ -4499,7 +4499,7 @@ static int run(mddev_t *mddev) | |||
4499 | } else { | 4499 | } else { |
4500 | BUG_ON(mddev->level != mddev->new_level); | 4500 | BUG_ON(mddev->level != mddev->new_level); |
4501 | BUG_ON(mddev->layout != mddev->new_layout); | 4501 | BUG_ON(mddev->layout != mddev->new_layout); |
4502 | BUG_ON(mddev->chunk_size != mddev->new_chunk); | 4502 | BUG_ON(mddev->chunk_sectors << 9 != mddev->new_chunk); |
4503 | BUG_ON(mddev->delta_disks != 0); | 4503 | BUG_ON(mddev->delta_disks != 0); |
4504 | } | 4504 | } |
4505 | 4505 | ||
@@ -4533,7 +4533,7 @@ static int run(mddev_t *mddev) | |||
4533 | } | 4533 | } |
4534 | 4534 | ||
4535 | /* device size must be a multiple of chunk size */ | 4535 | /* device size must be a multiple of chunk size */ |
4536 | mddev->dev_sectors &= ~(mddev->chunk_size / 512 - 1); | 4536 | mddev->dev_sectors &= ~(mddev->chunk_sectors - 1); |
4537 | mddev->resync_max_sectors = mddev->dev_sectors; | 4537 | mddev->resync_max_sectors = mddev->dev_sectors; |
4538 | 4538 | ||
4539 | if (mddev->degraded > 0 && | 4539 | if (mddev->degraded > 0 && |
@@ -4582,7 +4582,7 @@ static int run(mddev_t *mddev) | |||
4582 | { | 4582 | { |
4583 | int data_disks = conf->previous_raid_disks - conf->max_degraded; | 4583 | int data_disks = conf->previous_raid_disks - conf->max_degraded; |
4584 | int stripe = data_disks * | 4584 | int stripe = data_disks * |
4585 | (mddev->chunk_size / PAGE_SIZE); | 4585 | ((mddev->chunk_sectors << 9) / PAGE_SIZE); |
4586 | if (mddev->queue->backing_dev_info.ra_pages < 2 * stripe) | 4586 | if (mddev->queue->backing_dev_info.ra_pages < 2 * stripe) |
4587 | mddev->queue->backing_dev_info.ra_pages = 2 * stripe; | 4587 | mddev->queue->backing_dev_info.ra_pages = 2 * stripe; |
4588 | } | 4588 | } |
@@ -4679,7 +4679,8 @@ static void status(struct seq_file *seq, mddev_t *mddev) | |||
4679 | raid5_conf_t *conf = (raid5_conf_t *) mddev->private; | 4679 | raid5_conf_t *conf = (raid5_conf_t *) mddev->private; |
4680 | int i; | 4680 | int i; |
4681 | 4681 | ||
4682 | seq_printf (seq, " level %d, %dk chunk, algorithm %d", mddev->level, mddev->chunk_size >> 10, mddev->layout); | 4682 | seq_printf(seq, " level %d, %dk chunk, algorithm %d", mddev->level, |
4683 | mddev->chunk_sectors / 2, mddev->layout); | ||
4683 | seq_printf (seq, " [%d/%d] [", conf->raid_disks, conf->raid_disks - mddev->degraded); | 4684 | seq_printf (seq, " [%d/%d] [", conf->raid_disks, conf->raid_disks - mddev->degraded); |
4684 | for (i = 0; i < conf->raid_disks; i++) | 4685 | for (i = 0; i < conf->raid_disks; i++) |
4685 | seq_printf (seq, "%s", | 4686 | seq_printf (seq, "%s", |
@@ -4827,7 +4828,7 @@ static int raid5_resize(mddev_t *mddev, sector_t sectors) | |||
4827 | * any io in the removed space completes, but it hardly seems | 4828 | * any io in the removed space completes, but it hardly seems |
4828 | * worth it. | 4829 | * worth it. |
4829 | */ | 4830 | */ |
4830 | sectors &= ~((sector_t)mddev->chunk_size/512 - 1); | 4831 | sectors &= ~((sector_t)mddev->chunk_sectors - 1); |
4831 | md_set_array_sectors(mddev, raid5_size(mddev, sectors, | 4832 | md_set_array_sectors(mddev, raid5_size(mddev, sectors, |
4832 | mddev->raid_disks)); | 4833 | mddev->raid_disks)); |
4833 | if (mddev->array_sectors > | 4834 | if (mddev->array_sectors > |
@@ -4850,7 +4851,7 @@ static int raid5_check_reshape(mddev_t *mddev) | |||
4850 | 4851 | ||
4851 | if (mddev->delta_disks == 0 && | 4852 | if (mddev->delta_disks == 0 && |
4852 | mddev->new_layout == mddev->layout && | 4853 | mddev->new_layout == mddev->layout && |
4853 | mddev->new_chunk == mddev->chunk_size) | 4854 | mddev->new_chunk == mddev->chunk_sectors << 9) |
4854 | return -EINVAL; /* nothing to do */ | 4855 | return -EINVAL; /* nothing to do */ |
4855 | if (mddev->bitmap) | 4856 | if (mddev->bitmap) |
4856 | /* Cannot grow a bitmap yet */ | 4857 | /* Cannot grow a bitmap yet */ |
@@ -4878,10 +4879,11 @@ static int raid5_check_reshape(mddev_t *mddev) | |||
4878 | * If the chunk size is greater, user-space should request more | 4879 | * If the chunk size is greater, user-space should request more |
4879 | * stripe_heads first. | 4880 | * stripe_heads first. |
4880 | */ | 4881 | */ |
4881 | if ((mddev->chunk_size / STRIPE_SIZE) * 4 > conf->max_nr_stripes || | 4882 | if (((mddev->chunk_sectors << 9) / STRIPE_SIZE) * 4 |
4883 | > conf->max_nr_stripes || | ||
4882 | (mddev->new_chunk / STRIPE_SIZE) * 4 > conf->max_nr_stripes) { | 4884 | (mddev->new_chunk / STRIPE_SIZE) * 4 > conf->max_nr_stripes) { |
4883 | printk(KERN_WARNING "raid5: reshape: not enough stripes. Needed %lu\n", | 4885 | printk(KERN_WARNING "raid5: reshape: not enough stripes. Needed %lu\n", |
4884 | (max(mddev->chunk_size, mddev->new_chunk) | 4886 | (max(mddev->chunk_sectors << 9, mddev->new_chunk) |
4885 | / STRIPE_SIZE)*4); | 4887 | / STRIPE_SIZE)*4); |
4886 | return -ENOSPC; | 4888 | return -ENOSPC; |
4887 | } | 4889 | } |
@@ -5054,7 +5056,7 @@ static void raid5_finish_reshape(mddev_t *mddev) | |||
5054 | raid5_remove_disk(mddev, d); | 5056 | raid5_remove_disk(mddev, d); |
5055 | } | 5057 | } |
5056 | mddev->layout = conf->algorithm; | 5058 | mddev->layout = conf->algorithm; |
5057 | mddev->chunk_size = conf->chunk_size; | 5059 | mddev->chunk_sectors = conf->chunk_size >> 9; |
5058 | mddev->reshape_position = MaxSector; | 5060 | mddev->reshape_position = MaxSector; |
5059 | mddev->delta_disks = 0; | 5061 | mddev->delta_disks = 0; |
5060 | } | 5062 | } |
@@ -5183,7 +5185,8 @@ static int raid5_reconfig(mddev_t *mddev, int new_layout, int new_chunk) | |||
5183 | } | 5185 | } |
5184 | if (new_chunk > 0) { | 5186 | if (new_chunk > 0) { |
5185 | conf->chunk_size = new_chunk; | 5187 | conf->chunk_size = new_chunk; |
5186 | mddev->chunk_size = mddev->new_chunk = new_chunk; | 5188 | mddev->new_chunk = new_chunk; |
5189 | mddev->chunk_sectors = new_chunk >> 9; | ||
5187 | } | 5190 | } |
5188 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 5191 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
5189 | md_wakeup_thread(mddev->thread); | 5192 | md_wakeup_thread(mddev->thread); |