aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/linear.c16
-rw-r--r--include/linux/raid/linear.h2
2 files changed, 9 insertions, 9 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c
index 57644a780f16..1cafaa959443 100644
--- a/drivers/md/linear.c
+++ b/drivers/md/linear.c
@@ -120,7 +120,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
120 return NULL; 120 return NULL;
121 121
122 cnt = 0; 122 cnt = 0;
123 conf->array_size = 0; 123 conf->array_sectors = 0;
124 124
125 rdev_for_each(rdev, tmp, mddev) { 125 rdev_for_each(rdev, tmp, mddev) {
126 int j = rdev->raid_disk; 126 int j = rdev->raid_disk;
@@ -144,7 +144,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
144 blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); 144 blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);
145 145
146 disk->size = rdev->size; 146 disk->size = rdev->size;
147 conf->array_size += rdev->size; 147 conf->array_sectors += rdev->size * 2;
148 148
149 cnt++; 149 cnt++;
150 } 150 }
@@ -153,7 +153,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
153 goto out; 153 goto out;
154 } 154 }
155 155
156 min_spacing = conf->array_size; 156 min_spacing = conf->array_sectors / 2;
157 sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *)); 157 sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *));
158 158
159 /* min_spacing is the minimum spacing that will fit the hash 159 /* min_spacing is the minimum spacing that will fit the hash
@@ -162,7 +162,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
162 * that is larger than min_spacing as use the size of that as 162 * that is larger than min_spacing as use the size of that as
163 * the actual spacing 163 * the actual spacing
164 */ 164 */
165 conf->hash_spacing = conf->array_size; 165 conf->hash_spacing = conf->array_sectors / 2;
166 for (i=0; i < cnt-1 ; i++) { 166 for (i=0; i < cnt-1 ; i++) {
167 sector_t sz = 0; 167 sector_t sz = 0;
168 int j; 168 int j;
@@ -192,7 +192,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
192 unsigned round; 192 unsigned round;
193 unsigned long base; 193 unsigned long base;
194 194
195 sz = conf->array_size >> conf->preshift; 195 sz = conf->array_sectors >> (conf->preshift + 1);
196 sz += 1; /* force round-up */ 196 sz += 1; /* force round-up */
197 base = conf->hash_spacing >> conf->preshift; 197 base = conf->hash_spacing >> conf->preshift;
198 round = sector_div(sz, base); 198 round = sector_div(sz, base);
@@ -219,7 +219,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
219 curr_offset = 0; 219 curr_offset = 0;
220 i = 0; 220 i = 0;
221 for (curr_offset = 0; 221 for (curr_offset = 0;
222 curr_offset < conf->array_size; 222 curr_offset < conf->array_sectors / 2;
223 curr_offset += conf->hash_spacing) { 223 curr_offset += conf->hash_spacing) {
224 224
225 while (i < raid_disks-1 && 225 while (i < raid_disks-1 &&
@@ -256,7 +256,7 @@ static int linear_run (mddev_t *mddev)
256 if (!conf) 256 if (!conf)
257 return 1; 257 return 1;
258 mddev->private = conf; 258 mddev->private = conf;
259 mddev->array_sectors = conf->array_size * 2; 259 mddev->array_sectors = conf->array_sectors;
260 260
261 blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec); 261 blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec);
262 mddev->queue->unplug_fn = linear_unplug; 262 mddev->queue->unplug_fn = linear_unplug;
@@ -290,7 +290,7 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)
290 newconf->prev = mddev_to_conf(mddev); 290 newconf->prev = mddev_to_conf(mddev);
291 mddev->private = newconf; 291 mddev->private = newconf;
292 mddev->raid_disks++; 292 mddev->raid_disks++;
293 mddev->array_sectors = newconf->array_size * 2; 293 mddev->array_sectors = newconf->array_sectors;
294 set_capacity(mddev->gendisk, mddev->array_sectors); 294 set_capacity(mddev->gendisk, mddev->array_sectors);
295 return 0; 295 return 0;
296} 296}
diff --git a/include/linux/raid/linear.h b/include/linux/raid/linear.h
index ba15469daf11..7e375111d007 100644
--- a/include/linux/raid/linear.h
+++ b/include/linux/raid/linear.h
@@ -16,7 +16,7 @@ struct linear_private_data
16 struct linear_private_data *prev; /* earlier version */ 16 struct linear_private_data *prev; /* earlier version */
17 dev_info_t **hash_table; 17 dev_info_t **hash_table;
18 sector_t hash_spacing; 18 sector_t hash_spacing;
19 sector_t array_size; 19 sector_t array_sectors;
20 int preshift; /* shift before dividing by hash_spacing */ 20 int preshift; /* shift before dividing by hash_spacing */
21 dev_info_t disks[0]; 21 dev_info_t disks[0];
22}; 22};