* [PATCH 0/8] md: Make raid0 use sector-based quantities
@ 2008-10-18 15:24 Andre Noll
2008-10-18 15:24 ` [PATCH 1/8] md: raid0_make_request(): Remove local variable chunk_size Andre Noll
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid
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
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/8] md: raid0_make_request(): Remove local variable chunk_size.
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
@ 2008-10-18 15:24 ` Andre Noll
2008-10-18 15:24 ` [PATCH 2/8] md: raid0_make_request(): Replace local variable block by sector Andre Noll
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid, Andre Noll
We might as well use chunk_sects instead.
Signed-off-by: Andre Noll <maan@systemlinux.org>
---
drivers/md/raid0.c | 7 +++----
1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 62a193c..d843849 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -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);
--
1.5.3.8
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/8] md: raid0_make_request(): Replace local variable block by sector.
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
2008-10-18 15:24 ` [PATCH 1/8] md: raid0_make_request(): Remove local variable chunk_size Andre Noll
@ 2008-10-18 15:24 ` Andre Noll
2008-10-18 15:24 ` [PATCH 3/8] md: raid0: Represent device offset in sectors Andre Noll
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid, Andre Noll
This change already simplifies the code a bit.
Signed-off-by: Andre Noll <maan@systemlinux.org>
---
drivers/md/raid0.c | 13 ++++++-------
1 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index d843849..fd65d88 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -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)
--
1.5.3.8
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/8] md: raid0: Represent device offset in sectors.
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
2008-10-18 15:24 ` [PATCH 1/8] md: raid0_make_request(): Remove local variable chunk_size Andre Noll
2008-10-18 15:24 ` [PATCH 2/8] md: raid0_make_request(): Replace local variable block by sector Andre Noll
@ 2008-10-18 15:24 ` Andre Noll
2008-10-18 15:24 ` [PATCH 4/8] md: raid0: Represent zone->zone_offset " Andre Noll
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid, Andre Noll
Rename zone->dev_offset to zone->dev_start to make sure all users
have been converted.
Signed-off-by: Andre Noll <maan@systemlinux.org>
---
drivers/md/raid0.c | 9 ++++-----
include/linux/raid/raid0.h | 2 +-
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index fd65d88..b860536 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -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
diff --git a/include/linux/raid/raid0.h b/include/linux/raid/raid0.h
index 1b2dda0..61c3d29 100644
--- a/include/linux/raid/raid0.h
+++ b/include/linux/raid/raid0.h
@@ -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 */
--
1.5.3.8
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/8] md: raid0: Represent zone->zone_offset in sectors.
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
` (2 preceding siblings ...)
2008-10-18 15:24 ` [PATCH 3/8] md: raid0: Represent device offset in sectors Andre Noll
@ 2008-10-18 15:24 ` Andre Noll
2008-10-18 15:24 ` [PATCH 5/8] md: raid0 create_strip_zones(): Make two local variables sector-based Andre Noll
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid, Andre Noll
For the same reason as in the previous patch, rename it from zone_offset
to zone_start.
Signed-off-by: Andre Noll <maan@systemlinux.org>
---
drivers/md/raid0.c | 12 ++++++------
include/linux/raid/raid0.h | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index b860536..6e12a35 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -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);
}
diff --git a/include/linux/raid/raid0.h b/include/linux/raid/raid0.h
index 61c3d29..eaf4f6a 100644
--- a/include/linux/raid/raid0.h
+++ b/include/linux/raid/raid0.h
@@ -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 */
--
1.5.3.8
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/8] md: raid0 create_strip_zones(): Make two local variables sector-based.
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
` (3 preceding siblings ...)
2008-10-18 15:24 ` [PATCH 4/8] md: raid0: Represent zone->zone_offset " Andre Noll
@ 2008-10-18 15:24 ` Andre Noll
2008-10-18 15:24 ` [PATCH 6/8] md: raid0 create_strip_zones(): Add KERN_INFO/KERN_ERR to printk's Andre Noll
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid, Andre Noll
current_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.
Signed-off-by: Andre Noll <maan@systemlinux.org>
---
drivers/md/raid0.c | 27 +++++++++++++--------------
1 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 6e12a35..9074ea4 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -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;
--
1.5.3.8
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/8] md: raid0 create_strip_zones(): Add KERN_INFO/KERN_ERR to printk's.
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
` (4 preceding siblings ...)
2008-10-18 15:24 ` [PATCH 5/8] md: raid0 create_strip_zones(): Make two local variables sector-based Andre Noll
@ 2008-10-18 15:24 ` Andre Noll
2008-10-18 15:24 ` [PATCH 7/8] md: raid0: Represent the size of strip zones in sectors Andre Noll
2008-10-18 15:24 ` [PATCH 8/8] md: raid0: make hash_spacing and preshift sector-based Andre Noll
7 siblings, 0 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid, Andre Noll
This patch consists only of these trivial changes.
Signed-off-by: Andre Noll <maan@systemlinux.org>
---
drivers/md/raid0.c | 46 +++++++++++++++++++++++++---------------------
1 files changed, 25 insertions(+), 21 deletions(-)
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 9074ea4..c759436 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -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;
--
1.5.3.8
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 7/8] md: raid0: Represent the size of strip zones in sectors.
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
` (5 preceding siblings ...)
2008-10-18 15:24 ` [PATCH 6/8] md: raid0 create_strip_zones(): Add KERN_INFO/KERN_ERR to printk's Andre Noll
@ 2008-10-18 15:24 ` Andre Noll
2008-10-18 15:24 ` [PATCH 8/8] md: raid0: make hash_spacing and preshift sector-based Andre Noll
7 siblings, 0 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid, Andre Noll
This completes the block -> sector conversion of struct strip_zone.
Signed-off-by: Andre Noll <maan@systemlinux.org>
---
drivers/md/raid0.c | 26 +++++++++++++-------------
include/linux/raid/raid0.h | 2 +-
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index c759436..6e85e88 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -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);
diff --git a/include/linux/raid/raid0.h b/include/linux/raid/raid0.h
index eaf4f6a..c12521d 100644
--- a/include/linux/raid/raid0.h
+++ b/include/linux/raid/raid0.h
@@ -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 */
};
--
1.5.3.8
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 8/8] md: raid0: make hash_spacing and preshift sector-based.
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
` (6 preceding siblings ...)
2008-10-18 15:24 ` [PATCH 7/8] md: raid0: Represent the size of strip zones in sectors Andre Noll
@ 2008-10-18 15:24 ` Andre Noll
7 siblings, 0 replies; 9+ messages in thread
From: Andre Noll @ 2008-10-18 15:24 UTC (permalink / raw)
To: neilb; +Cc: linux-raid, Andre Noll
This 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.
Signed-off-by: Andre Noll <maan@systemlinux.org>
---
drivers/md/raid0.c | 58 ++++++++++++++++++++++----------------------
include/linux/raid/raid0.h | 4 +-
2 files changed, 31 insertions(+), 31 deletions(-)
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 6e85e88..90f5b24 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -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];
}
diff --git a/include/linux/raid/raid0.h b/include/linux/raid/raid0.h
index c12521d..fd42aa8 100644
--- a/include/linux/raid/raid0.h
+++ b/include/linux/raid/raid0.h
@@ -19,8 +19,8 @@ struct raid0_private_data
mdk_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;
--
1.5.3.8
^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-10-18 15:24 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-18 15:24 [PATCH 0/8] md: Make raid0 use sector-based quantities Andre Noll
2008-10-18 15:24 ` [PATCH 1/8] md: raid0_make_request(): Remove local variable chunk_size Andre Noll
2008-10-18 15:24 ` [PATCH 2/8] md: raid0_make_request(): Replace local variable block by sector Andre Noll
2008-10-18 15:24 ` [PATCH 3/8] md: raid0: Represent device offset in sectors Andre Noll
2008-10-18 15:24 ` [PATCH 4/8] md: raid0: Represent zone->zone_offset " Andre Noll
2008-10-18 15:24 ` [PATCH 5/8] md: raid0 create_strip_zones(): Make two local variables sector-based Andre Noll
2008-10-18 15:24 ` [PATCH 6/8] md: raid0 create_strip_zones(): Add KERN_INFO/KERN_ERR to printk's Andre Noll
2008-10-18 15:24 ` [PATCH 7/8] md: raid0: Represent the size of strip zones in sectors Andre Noll
2008-10-18 15:24 ` [PATCH 8/8] md: raid0: make hash_spacing and preshift sector-based Andre Noll
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).