diff options
Diffstat (limited to 'drivers/md/linear.c')
| -rw-r--r-- | drivers/md/linear.c | 20 | 
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index 6a866d7c8ae..b1eebf88c20 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c @@ -122,13 +122,13 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)  		return NULL;  	cnt = 0; -	conf->array_size = 0; +	conf->array_sectors = 0;  	rdev_for_each(rdev, tmp, mddev) {  		int j = rdev->raid_disk;  		dev_info_t *disk = conf->disks + j; -		if (j < 0 || j > raid_disks || disk->rdev) { +		if (j < 0 || j >= raid_disks || disk->rdev) {  			printk("linear: disk numbering problem. Aborting!\n");  			goto out;  		} @@ -146,7 +146,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)  			blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);  		disk->size = rdev->size; -		conf->array_size += rdev->size; +		conf->array_sectors += rdev->size * 2;  		cnt++;  	} @@ -155,7 +155,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)  		goto out;  	} -	min_spacing = conf->array_size; +	min_spacing = conf->array_sectors / 2;  	sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *));  	/* min_spacing is the minimum spacing that will fit the hash @@ -164,7 +164,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)  	 * that is larger than min_spacing as use the size of that as  	 * the actual spacing  	 */ -	conf->hash_spacing = conf->array_size; +	conf->hash_spacing = conf->array_sectors / 2;  	for (i=0; i < cnt-1 ; i++) {  		sector_t sz = 0;  		int j; @@ -194,7 +194,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)  		unsigned round;  		unsigned long base; -		sz = conf->array_size >> conf->preshift; +		sz = conf->array_sectors >> (conf->preshift + 1);  		sz += 1; /* force round-up */  		base = conf->hash_spacing >> conf->preshift;  		round = sector_div(sz, base); @@ -221,7 +221,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)  	curr_offset = 0;  	i = 0;  	for (curr_offset = 0; -	     curr_offset < conf->array_size; +	     curr_offset < conf->array_sectors / 2;  	     curr_offset += conf->hash_spacing) {  		while (i < raid_disks-1 && @@ -258,7 +258,7 @@ static int linear_run (mddev_t *mddev)  	if (!conf)  		return 1;  	mddev->private = conf; -	mddev->array_size = conf->array_size; +	mddev->array_sectors = conf->array_sectors;  	blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec);  	mddev->queue->unplug_fn = linear_unplug; @@ -292,8 +292,8 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)  	newconf->prev = mddev_to_conf(mddev);  	mddev->private = newconf;  	mddev->raid_disks++; -	mddev->array_size = newconf->array_size; -	set_capacity(mddev->gendisk, mddev->array_size << 1); +	mddev->array_sectors = newconf->array_sectors; +	set_capacity(mddev->gendisk, mddev->array_sectors);  	return 0;  }  |