summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-06-18 08:48:55 +1000
committerNeilBrown <neilb@suse.de>2009-06-18 08:48:55 +1000
commit13f2682b7216ebebd72b3d5868fe7fccec91a92d (patch)
treea5ba7509f0f6d61b2d7b478494a210794a8e55e3
parent1b57f132231593923cb4ab99943ddd777e8745bc (diff)
downloadop-kernel-dev-13f2682b7216ebebd72b3d5868fe7fccec91a92d.zip
op-kernel-dev-13f2682b7216ebebd72b3d5868fe7fccec91a92d.tar.gz
md: raid0/linear: ensure device sizes are rounded to chunk size.
This is currently ensured by common code, but it is more reliable to ensure it where it is needed in personality code. All the other personalities that care already round the size to the chunk_size. raid0 and linear are the only hold-outs. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/linear.c6
-rw-r--r--drivers/md/raid0.c6
2 files changed, 12 insertions, 0 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c
index 9f7cec4..dda2f1b 100644
--- a/drivers/md/linear.c
+++ b/drivers/md/linear.c
@@ -135,6 +135,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
list_for_each_entry(rdev, &mddev->disks, same_set) {
int j = rdev->raid_disk;
dev_info_t *disk = conf->disks + j;
+ sector_t sectors;
if (j < 0 || j >= raid_disks || disk->rdev) {
printk("linear: disk numbering problem. Aborting!\n");
@@ -142,6 +143,11 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
}
disk->rdev = rdev;
+ if (mddev->chunk_sectors) {
+ sectors = rdev->sectors;
+ sector_div(sectors, mddev->chunk_sectors);
+ rdev->sectors = sectors * mddev->chunk_sectors;
+ }
blk_queue_stack_limits(mddev->queue,
rdev->bdev->bd_disk->queue);
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 11e3842..717e64a 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -100,6 +100,12 @@ static int create_strip_zones(mddev_t *mddev)
printk(KERN_INFO "raid0: looking at %s\n",
bdevname(rdev1->bdev,b));
c = 0;
+
+ /* round size to chunk_size */
+ sectors = rdev1->sectors;
+ sector_div(sectors, mddev->chunk_sectors);
+ rdev1->sectors = sectors * mddev->chunk_sectors;
+
list_for_each_entry(rdev2, &mddev->disks, same_set) {
printk(KERN_INFO "raid0: comparing %s(%llu)",
bdevname(rdev1->bdev,b),
OpenPOWER on IntegriCloud