md: Make raid0 use sector-based quantities
cover md: Make raid0 use sector-based quantities
This series of patches against Neil's for-next branch converts the internal representations of block-based quantities in the raid0 code to sector-based quantities.
There's also one trivial patch in this series, #6, which adds KERN_INFO/KERN_ERR to a couple of printk's.
checkpatch.pl is happy with all eight patches, and the patched kernel passes the raid0 tests of mdadm's test suite on my i386 UP box.
Please review.
Andre
PATCH 1/8 md: raid0_make_request(): Remove local variable chunk_size.
We might as well use chunk_sects instead.
--- drivers/md/raid0.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-)
drivers/md/raid0.c +3 -4
@@ -387,7 +387,7 @@ static int raid0_stop (mddev_t *mddev)static int raid0_make_request (struct request_queue *q,struct bio *bio) {mddev_t *mddev = q->queuedata; -unsigned int sect_in_chunk, chunksect_bits, chunk_size, chunk_sects; +unsigned int sect_in_chunk, chunksect_bits, chunk_sects;raid0_conf_t *conf =mddev_to_conf (mddev);struct strip_zone *zone;mdk_rdev_t *tmp_dev;
@@ -407,7 +407,6 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio) bio_sectors(bio));part_stat_unlock (); - chunk_size = mddev->chunk_size >>10 ; chunk_sects = mddev->chunk_size >>9 ; chunksect_bits =ffz (~chunk_sects); block = bio->bi_sector >>1 ;
@@ -442,7 +441,7 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio)while (block >= (zone->zone_offset + zone->size)) zone++; - sect_in_chunk = bio->bi_sector & ((chunk_size<<1 ) -1 ); + sect_in_chunk = bio->bi_sector & (chunk_sects -1 ); {
@@ -467,7 +466,7 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio) bad_map:printk ("raid0_make_request bug: can't convert block across chunks" -" or bigger than %dk %llu %d\n" , chunk_size, +" or bigger than %dk %llu %d\n" , chunk_sects /2 , (unsigned long long )bio->bi_sector, bio->bi_size >>10 );bio_io_error (bio);
Signature · 1 line
1.5.3.8
PATCH 2/8 md: raid0_make_request(): Replace local variable block by sector.
In reply to Andre NollThis change already simplifies the code a bit.
--- drivers/md/raid0.c | 13 ++++++------- 1 files changed, 6 insertions(+), 7 deletions(-)
drivers/md/raid0.c +6 -7
@@ -392,7 +392,7 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio)struct strip_zone *zone;mdk_rdev_t *tmp_dev;sector_t chunk; -sector_t block, rsect; +sector_t sector, rsect;const int rw =bio_data_dir (bio);int cpu;
@@ -409,8 +409,7 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio) chunk_sects = mddev->chunk_size >>9 ; chunksect_bits =ffz (~chunk_sects); - block = bio->bi_sector >>1 ; - + sector = bio->bi_sector;if (unlikely (chunk_sects < (bio->bi_sector & (chunk_sects -1 )) + (bio->bi_size >>9 ))) {struct bio_pair *bp;
@@ -433,24 +432,24 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio) { -sector_t x = block >> conf->preshift; +sector_t x = sector >> (conf->preshift +1 );sector_div (x, (u32 )conf->hash_spacing); zone = conf->hash_table[x]; } -while (block >= (zone->zone_offset + zone->size)) +while (sector /2 >= (zone->zone_offset + zone->size)) zone++; sect_in_chunk = bio->bi_sector & (chunk_sects -1 ); { -sector_t x = (block - zone->zone_offset) >> (chunksect_bits -1 ); +sector_t x = (sector - zone->zone_offset *2 ) >> chunksect_bits;sector_div (x, zone->nb_dev); chunk = x; - x = block >> (chunksect_bits -1 ); + x = sector >> chunksect_bits; tmp_dev = zone->dev[sector_div (x, zone->nb_dev)]; } rsect = (((chunk << (chunksect_bits -1 )) + zone->dev_offset)<<1 )
Signature · 1 line
1.5.3.8
PATCH 3/8 md: raid0: Represent device offset in sectors.
In reply to Andre NollRename zone->dev_offset to zone->dev_start to make sure all users have been converted.
--- drivers/md/raid0.c | 9 ++++----- include/linux/raid/raid0.h | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-)
drivers/md/raid0.c +4 -5
@@ -167,7 +167,7 @@ static int create_strip_zones (mddev_t *mddev) zone->dev = conf->strip_zone[i-1 ].dev + mddev->raid_disks;printk ("raid0: zone %d\n" , i); - zone->dev_offset = current_offset; + zone->dev_start = current_offset *2 ; smallest =NULL ; c =0 ;
@@ -452,8 +452,7 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio) x = sector >> chunksect_bits; tmp_dev = zone->dev[sector_div (x, zone->nb_dev)]; } - rsect = (((chunk << (chunksect_bits -1 )) + zone->dev_offset)<<1 ) - + sect_in_chunk; + rsect = (chunk << chunksect_bits) + zone->dev_start + sect_in_chunk; bio->bi_bdev = tmp_dev->bdev; bio->bi_sector = rsect + tmp_dev->data_offset;
@@ -490,9 +489,9 @@ static void raid0_status (struct seq_file *seq, mddev_t *mddev)seq_printf (seq,"%s/" ,bdevname ( conf->strip_zone[j].dev[k]->bdev,b)); -seq_printf (seq,"] zo=%d do=%d s=%d\n" , +seq_printf (seq,"] zo=%d ds=%d s=%d\n" , conf->strip_zone[j].zone_offset, - conf->strip_zone[j].dev_offset, + conf->strip_zone[j].dev_start, conf->strip_zone[j].size); }#endif
include/linux/raid/raid0.h +1 -1
@@ -6,7 +6,7 @@struct strip_zone {sector_t zone_offset;/* Zone offset in md_dev */ -sector_t dev_offset;/* Zone offset in real dev */ +sector_t dev_start;/* Zone offset in real dev (in sectors) */ sector_t size;/* Zone size */ int nb_dev;/* # of devices attached to the zone */ mdk_rdev_t **dev;/* Devices attached to the zone */
Signature · 1 line
1.5.3.8
PATCH 4/8 md: raid0: Represent zone->zone_offset in sectors.
In reply to Andre NollFor the same reason as in the previous patch, rename it from zone_offset to zone_start.
--- drivers/md/raid0.c | 12 ++++++------ include/linux/raid/raid0.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-)
drivers/md/raid0.c +6 -6
@@ -155,7 +155,7 @@ static int create_strip_zones (mddev_t *mddev) } zone->nb_dev = cnt; zone->size = smallest->size * cnt; - zone->zone_offset =0 ; + zone->zone_start =0 ; current_offset = smallest->size; curr_zone_offset = zone->size;
@@ -194,7 +194,7 @@ static int create_strip_zones (mddev_t *mddev)printk ("raid0: zone->nb_dev: %d, size: %llu\n" , zone->nb_dev, (unsigned long long )zone->size); - zone->zone_offset = curr_zone_offset; + zone->zone_start = curr_zone_offset *2 ; curr_zone_offset += zone->size; current_offset = smallest->size;
@@ -437,14 +437,14 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio) zone = conf->hash_table[x]; } -while (sector /2 >= (zone->zone_offset + zone->size)) +while (sector /2 >= (zone->zone_start /2 + zone->size)) zone++; sect_in_chunk = bio->bi_sector & (chunk_sects -1 ); { -sector_t x = (sector - zone->zone_offset *2 ) >> chunksect_bits; +sector_t x = (sector - zone->zone_start) >> chunksect_bits;sector_div (x, zone->nb_dev); chunk = x;
@@ -489,8 +489,8 @@ static void raid0_status (struct seq_file *seq, mddev_t *mddev)seq_printf (seq,"%s/" ,bdevname ( conf->strip_zone[j].dev[k]->bdev,b)); -seq_printf (seq,"] zo=%d ds=%d s=%d\n" , - conf->strip_zone[j].zone_offset, +seq_printf (seq,"] zs=%d ds=%d s=%d\n" , + conf->strip_zone[j].zone_start, conf->strip_zone[j].dev_start, conf->strip_zone[j].size); }
include/linux/raid/raid0.h +1 -1
@@ -5,7 +5,7 @@struct strip_zone { -sector_t zone_offset;/* Zone offset in md_dev */ +sector_t zone_start;/* Zone offset in md_dev (in sectors) */ sector_t dev_start;/* Zone offset in real dev (in sectors) */ sector_t size;/* Zone size */ int nb_dev;/* # of devices attached to the zone */
Signature · 1 line
1.5.3.8
PATCH 5/8 md: raid0 create_strip_zones(): Make two local variables sector-based.
In reply to Andre Nollcurrent_offset and curr_zone_offset stored the corresponding offsets as 1K quantities. Rename them to current_start and curr_zone_start to match the naming of struct strip_zone and store the offsets as sector counts.
Also, add KERN_INFO to the printk() affected by this change to make checkpatch happy.
--- drivers/md/raid0.c | 27 +++++++++++++-------------- 1 files changed, 13 insertions(+), 14 deletions(-)
drivers/md/raid0.c +13 -14
@@ -53,7 +53,7 @@ static int raid0_congested(void *data, int bits)static int create_strip_zones (mddev_t *mddev) {int i, c, j; -sector_t current_offset, curr_zone_offset; +sector_t current_start, curr_zone_start;sector_t min_spacing;raid0_conf_t *conf =mddev_to_conf (mddev);mdk_rdev_t *smallest, *rdev1, *rdev2, *rdev;
@@ -157,8 +157,8 @@ static int create_strip_zones (mddev_t *mddev) zone->size = smallest->size * cnt; zone->zone_start =0 ; - current_offset = smallest->size; - curr_zone_offset = zone->size; + current_start = smallest->size *2 ; + curr_zone_start = zone->size *2 ;/* now do the other zones */ for (i =1 ; i < conf->nr_strip_zones; i++)
@@ -167,7 +167,7 @@ static int create_strip_zones (mddev_t *mddev) zone->dev = conf->strip_zone[i-1 ].dev + mddev->raid_disks;printk ("raid0: zone %d\n" , i); - zone->dev_start = current_offset *2 ; + zone->dev_start = current_start; smallest =NULL ; c =0 ;
@@ -175,8 +175,7 @@ static int create_strip_zones (mddev_t *mddev)char b[BDEVNAME_SIZE ]; rdev = conf->strip_zone[0 ].dev[j];printk ("raid0: checking %s ..." ,bdevname (rdev->bdev,b)); -if (rdev->size > current_offset) - { +if (rdev->size > current_start /2 ) {printk (" contained as device %d\n" , c); zone->dev[c] = rdev; c++;
@@ -190,16 +189,16 @@ static int create_strip_zones (mddev_t *mddev) } zone->nb_dev = c; - zone->size = (smallest->size - current_offset) * c; + zone->size = (smallest->size - current_start /2 ) * c;printk ("raid0: zone->nb_dev: %d, size: %llu\n" , zone->nb_dev, (unsigned long long )zone->size); - zone->zone_start = curr_zone_offset *2 ; - curr_zone_offset += zone->size; + zone->zone_start = curr_zone_start; + curr_zone_start += zone->size *2 ; - current_offset = smallest->size; -printk ("raid0: current zone offset: %llu\n" , - (unsigned long long )current_offset); + current_start = smallest->size *2 ; +printk (KERN_INFO "raid0: current zone start: %llu\n" , + (unsigned long long )current_start); }/* Now find appropriate hash spacing.
@@ -210,8 +209,8 @@ static int create_strip_zones (mddev_t *mddev)* strip though as it's size has no bearing on the efficacy of the hash * table. */ - conf->hash_spacing = curr_zone_offset; - min_spacing = curr_zone_offset; + conf->hash_spacing = curr_zone_start /2 ; + min_spacing = curr_zone_start /2 ;sector_div (min_spacing,PAGE_SIZE /sizeof (struct strip_zone *));for (i=0 ; i < conf->nr_strip_zones-1 ; i++) {sector_t sz =0 ;
Signature · 1 line
1.5.3.8
PATCH 6/8 md: raid0 create_strip_zones(): Add KERN_INFO/KERN_ERR to printk's.
In reply to Andre NollThis patch consists only of these trivial changes.
--- drivers/md/raid0.c | 46 +++++++++++++++++++++++++--------------------- 1 files changed, 25 insertions(+), 21 deletions(-)
drivers/md/raid0.c +25 -21
@@ -68,18 +68,18 @@ static int create_strip_zones (mddev_t *mddev) conf->nr_strip_zones =0 ;rdev_for_each (rdev1, tmp1, mddev) { -printk ("raid0: looking at %s\n" , +printk (KERN_INFO "raid0: looking at %s\n" ,bdevname (rdev1->bdev,b)); c =0 ;rdev_for_each (rdev2, tmp2, mddev) { -printk ("raid0: comparing %s(%llu)" , +printk (KERN_INFO "raid0: comparing %s(%llu)" ,bdevname (rdev1->bdev,b), (unsigned long long )rdev1->size); -printk (" with %s(%llu)\n" , +printk (KERN_INFO " with %s(%llu)\n" ,bdevname (rdev2->bdev,b), (unsigned long long )rdev2->size);if (rdev2 == rdev1) { -printk ("raid0: END\n" ); +printk (KERN_INFO "raid0: END\n" );break ; }if (rdev2->size == rdev1->size)
@@ -88,19 +88,20 @@ static int create_strip_zones (mddev_t *mddev)* Not unique, don't count it as a new * group */ -printk ("raid0: EQUAL\n" ); +printk (KERN_INFO "raid0: EQUAL\n" ); c =1 ;break ; } -printk ("raid0: NOT EQUAL\n" ); +printk (KERN_INFO "raid0: NOT EQUAL\n" ); }if (!c) { -printk ("raid0: ==> UNIQUE\n" ); +printk (KERN_INFO "raid0: ==> UNIQUE\n" ); conf->nr_strip_zones++; -printk ("raid0: %d zones\n" , conf->nr_strip_zones); +printk (KERN_INFO "raid0: %d zones\n" , + conf->nr_strip_zones); } } -printk ("raid0: FINAL %d zones\n" , conf->nr_strip_zones); +printk (KERN_INFO "raid0: FINAL %d zones\n" , conf->nr_strip_zones); conf->strip_zone =kzalloc (sizeof (struct strip_zone )* conf->nr_strip_zones,GFP_KERNEL );
@@ -123,12 +124,13 @@ static int create_strip_zones (mddev_t *mddev)int j = rdev1->raid_disk;if (j <0 || j >= mddev->raid_disks) { -printk ("raid0: bad disk number %d - aborting!\n" , j); +printk (KERN_ERR "raid0: bad disk number %d - " +"aborting!\n" , j); goto abort; }if (zone->dev[j]) { -printk ("raid0: multiple devices for %d - aborting!\n" , - j); +printk (KERN_ERR "raid0: multiple devices for %d - " +"aborting!\n" , j); goto abort; } zone->dev[j] = rdev1;
@@ -149,8 +151,8 @@ static int create_strip_zones (mddev_t *mddev) cnt++; }if (cnt != mddev->raid_disks) { -printk ("raid0: too few disks (%d of %d) - aborting!\n" , - cnt, mddev->raid_disks); +printk (KERN_ERR "raid0: too few disks (%d of %d) - " +"aborting!\n" , cnt, mddev->raid_disks); goto abort; } zone->nb_dev = cnt;
@@ -166,7 +168,7 @@ static int create_strip_zones (mddev_t *mddev) zone = conf->strip_zone + i; zone->dev = conf->strip_zone[i-1 ].dev + mddev->raid_disks; -printk ("raid0: zone %d\n" , i); +printk (KERN_INFO "raid0: zone %d\n" , i); zone->dev_start = current_start; smallest =NULL ; c =0 ;
@@ -174,23 +176,25 @@ static int create_strip_zones (mddev_t *mddev)for (j=0 ; j<cnt; j++) {char b[BDEVNAME_SIZE ]; rdev = conf->strip_zone[0 ].dev[j]; -printk ("raid0: checking %s ..." ,bdevname (rdev->bdev,b)); +printk (KERN_INFO "raid0: checking %s ..." , +bdevname (rdev->bdev, b));if (rdev->size > current_start /2 ) { -printk (" contained as device %d\n" , c); +printk (KERN_INFO " contained as device %d\n" , + c); zone->dev[c] = rdev; c++;if (!smallest || (rdev->size <smallest->size)) { smallest = rdev; -printk (" (%llu) is smallest!.\n" , +printk (KERN_INFO " (%llu) is smallest!.\n" , (unsigned long long )rdev->size); } }else -printk (" nope.\n" ); +printk (KERN_INFO " nope.\n" ); } zone->nb_dev = c; zone->size = (smallest->size - current_start /2 ) * c; -printk ("raid0: zone->nb_dev: %d, size: %llu\n" , +printk (KERN_INFO "raid0: zone->nb_dev: %d, size: %llu\n" , zone->nb_dev, (unsigned long long )zone->size); zone->zone_start = curr_zone_start;
@@ -226,7 +230,7 @@ static int create_strip_zones (mddev_t *mddev) mddev->queue->backing_dev_info.congested_fn = raid0_congested; mddev->queue->backing_dev_info.congested_data = mddev; -printk ("raid0: done.\n" ); +printk (KERN_INFO "raid0: done.\n" );return 0 ; abort:return 1 ;
Signature · 1 line
1.5.3.8
PATCH 7/8 md: raid0: Represent the size of strip zones in sectors.
In reply to Andre NollThis completes the block -> sector conversion of struct strip_zone.
--- drivers/md/raid0.c | 26 +++++++++++++------------- include/linux/raid/raid0.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-)
drivers/md/raid0.c +13 -13
@@ -156,11 +156,11 @@ static int create_strip_zones (mddev_t *mddev) goto abort; } zone->nb_dev = cnt; - zone->size = smallest->size * cnt; + zone->sectors = smallest->size * cnt *2 ; zone->zone_start =0 ; current_start = smallest->size *2 ; - curr_zone_start = zone->size *2 ; + curr_zone_start = zone->sectors;/* now do the other zones */ for (i =1 ; i < conf->nr_strip_zones; i++)
@@ -193,12 +193,12 @@ static int create_strip_zones (mddev_t *mddev) } zone->nb_dev = c; - zone->size = (smallest->size - current_start /2 ) * c; -printk (KERN_INFO "raid0: zone->nb_dev: %d, size: %llu\n" , - zone->nb_dev, (unsigned long long )zone->size); + zone->sectors = (smallest->size *2 - current_start) * c; +printk (KERN_INFO "raid0: zone->nb_dev: %d, sectors: %llu\n" , + zone->nb_dev, (unsigned long long )zone->sectors); zone->zone_start = curr_zone_start; - curr_zone_start += zone->size *2 ; + curr_zone_start += zone->sectors; current_start = smallest->size *2 ; printk(KERN_INFO "raid0: current zone start: %llu\n",
@@ -220,7 +220,7 @@ static int create_strip_zones (mddev_t *mddev)sector_t sz =0 ;for (j=i; j<conf->nr_strip_zones-1 && sz < min_spacing ; j++) - sz += conf->strip_zone[j].size; + sz += conf->strip_zone[j].sectors /2 ;if (sz >= min_spacing && sz < conf->hash_spacing) conf->hash_spacing = sz; }
@@ -325,13 +325,13 @@ static int raid0_run (mddev_t *mddev) conf->hash_table =kmalloc (sizeof (struct strip_zone *)*nb_zone,GFP_KERNEL );if (!conf->hash_table) goto out_free_conf; - size = conf->strip_zone[cur].size; + size = conf->strip_zone[cur].sectors /2 ; conf->hash_table[0 ] = conf->strip_zone + cur;for (i=1 ; i< nb_zone; i++) {while (size <= conf->hash_spacing) { cur++; - size += conf->strip_zone[cur].size; + size += conf->strip_zone[cur].sectors /2 ; } size -= conf->hash_spacing; conf->hash_table[i] = conf->strip_zone + cur;
@@ -439,10 +439,10 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio)sector_div (x, (u32 )conf->hash_spacing); zone = conf->hash_table[x]; } - -while (sector /2 >= (zone->zone_start /2 + zone->size)) + +while (sector >= zone->zone_start + zone->sectors) zone++; - + sect_in_chunk = bio->bi_sector & (chunk_sects -1 );
@@ -495,7 +495,7 @@ static void raid0_status (struct seq_file *seq, mddev_t *mddev)seq_printf (seq,"] zs=%d ds=%d s=%d\n" , conf->strip_zone[j].zone_start, conf->strip_zone[j].dev_start, - conf->strip_zone[j].size); + conf->strip_zone[j].sectors); }#endif seq_printf (seq," %dk chunks" , mddev->chunk_size/1024 );
include/linux/raid/raid0.h +1 -1
@@ -7,7 +7,7 @@ struct strip_zone {sector_t zone_start;/* Zone offset in md_dev (in sectors) */ sector_t dev_start;/* Zone offset in real dev (in sectors) */ -sector_t size;/* Zone size */ +sector_t sectors;/* Zone size in sectors */ int nb_dev;/* # of devices attached to the zone */ mdk_rdev_t **dev;/* Devices attached to the zone */ };
Signature · 1 line
1.5.3.8
PATCH 8/8 md: raid0: make hash_spacing and preshift sector-based.
In reply to Andre NollThis patch renames the hash_spacing and preshift members of struct raid0_private_data to spacing and sector_shift respectively and changes the semantics as follows:
We always have spacing = 2 * hash_spacing. In case sizeof(sector_t) > sizeof(u32) we also have sector_shift = preshift + 1 while sector_shift = preshift = 0 otherwise.
Note that the values of nb_zone and zone are unaffected by these changes because in the sector_div() preceeding the assignement of these two variables both arguments double.
--- drivers/md/raid0.c | 58 ++++++++++++++++++++++---------------------- include/linux/raid/raid0.h | 4 +- 2 files changed, 31 insertions(+), 31 deletions(-)
drivers/md/raid0.c +29 -29
@@ -213,16 +213,16 @@ static int create_strip_zones (mddev_t *mddev)* strip though as it's size has no bearing on the efficacy of the hash * table. */ - conf->hash_spacing = curr_zone_start /2 ; - min_spacing = curr_zone_start /2 ; + conf->spacing = curr_zone_start; + min_spacing = curr_zone_start;sector_div (min_spacing,PAGE_SIZE /sizeof (struct strip_zone *));for (i=0 ; i < conf->nr_strip_zones-1 ; i++) { -sector_t sz =0 ; -for (j=i; j<conf->nr_strip_zones-1 && - sz < min_spacing ; j++) - sz += conf->strip_zone[j].sectors /2 ; -if (sz >= min_spacing && sz < conf->hash_spacing) - conf->hash_spacing = sz; +sector_t s =0 ; +for (j = i; j < conf->nr_strip_zones -1 && + s < min_spacing; j++) + s += conf->strip_zone[j].sectors; +if (s >= min_spacing && s < conf->spacing) + conf->spacing = s; } mddev->queue->unplug_fn = raid0_unplug;
@@ -265,7 +265,7 @@ static int raid0_mergeable_bvec(struct request_queue *q,static int raid0_run (mddev_t *mddev) {unsigned cur=0 , i=0 , nb_zone; -s64 size; +s64 sectors;raid0_conf_t *conf;mdk_rdev_t *rdev;struct list_head *tmp;
@@ -297,51 +297,51 @@ static int raid0_run (mddev_t *mddev)rdev_for_each (rdev, tmp, mddev) mddev->array_sectors += rdev->size *2 ; -printk ("raid0 : md_size is %llu blocks.\n" , - (unsigned long long )mddev->array_sectors /2 ); -printk ("raid0 : conf->hash_spacing is %llu blocks.\n" , - (unsigned long long )conf->hash_spacing); +printk (KERN_INFO "raid0 : md_size is %llu sectors.\n" , + (unsigned long long )mddev->array_sectors); +printk (KERN_INFO "raid0 : conf->spacing is %llu sectors.\n" , + (unsigned long long )conf->spacing); { -sector_t s = mddev->array_sectors /2 ; -sector_t space = conf->hash_spacing; +sector_t s = mddev->array_sectors; +sector_t space = conf->spacing;int round; - conf->preshift =0 ; + conf->sector_shift =0 ;if (sizeof (sector_t) >sizeof (u32)) {/*shift down space and s so that sector_div will work */ while (space > (sector_t) (~(u32 )0 )) { s >>=1 ; space >>=1 ; s +=1 ;/* force round-up */ - conf->preshift++; + conf->sector_shift++; } } round =sector_div (s, (u32 )space) ?1 :0 ; nb_zone = s + round; } -printk ("raid0 : nb_zone is %d.\n" , nb_zone); +printk (KERN_INFO "raid0 : nb_zone is %d.\n" , nb_zone); -printk ("raid0 : Allocating %Zd bytes for hash.\n" , +printk (KERN_INFO "raid0 : Allocating %zu bytes for hash.\n" , nb_zone*sizeof (struct strip_zone *)); conf->hash_table =kmalloc (sizeof (struct strip_zone *)*nb_zone,GFP_KERNEL );if (!conf->hash_table) goto out_free_conf; - size = conf->strip_zone[cur].sectors /2 ; + sectors = conf->strip_zone[cur].sectors; conf->hash_table[0 ] = conf->strip_zone + cur;for (i=1 ; i< nb_zone; i++) { -while (size <= conf->hash_spacing) { +while (sectors <= conf->spacing) { cur++; - size += conf->strip_zone[cur].sectors /2 ; + sectors += conf->strip_zone[cur].sectors; } - size -= conf->hash_spacing; + sectors -= conf->spacing; conf->hash_table[i] = conf->strip_zone + cur; } -if (conf->preshift) { - conf->hash_spacing >>= conf->preshift; -/* round hash_spacing up so when we divide by it, we +if (conf->sector_shift) { + conf->spacing >>= conf->sector_shift; +/* round spacing up so when we divide by it, we * err on the side of too-low, which is safest */ - conf->hash_spacing++; + conf->spacing++; }/* calculate the max read-ahead size.
@@ -435,8 +435,8 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio) { -sector_t x = sector >> (conf->preshift +1 ); -sector_div (x, (u32 )conf->hash_spacing); +sector_t x = sector >> conf->sector_shift; +sector_div (x, (u32 )conf->spacing); zone = conf->hash_table[x]; }
include/linux/raid/raid0.h +2 -2
@@ -19,8 +19,8 @@ struct raid0_private_datamdk_rdev_t **devlist;/* lists of rdevs, pointed to by strip_zone->dev */ int nr_strip_zones; -sector_t hash_spacing; -int preshift;/* shift this before divide by hash_spacing */ +sector_t spacing; +int sector_shift;/* shift this before divide by spacing */ };typedef struct raid0_private_data raid0_conf_t ;
Signature · 1 line
1.5.3.8