Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b414579f authored by NeilBrown's avatar NeilBrown
Browse files

md: raid0: remove ->dev pointer from strip_zone structure



If we treat conf->devlist more like a 2 dimensional array,
we can get the devlist for a particular zone simply by indexing
that array, so we don't need to store the pointers to subarrays
in strip_zone.  This makes strip_zone smaller and so (hopefully)
searches faster.

Signed-of-by: default avatarNeilBrown <neilb@suse.de>
parent 49f357a2
Loading
Loading
Loading
Loading
+11 −10
Original line number Original line Diff line number Diff line
@@ -27,7 +27,7 @@ static void raid0_unplug(struct request_queue *q)
{
{
	mddev_t *mddev = q->queuedata;
	mddev_t *mddev = q->queuedata;
	raid0_conf_t *conf = mddev_to_conf(mddev);
	raid0_conf_t *conf = mddev_to_conf(mddev);
	mdk_rdev_t **devlist = conf->strip_zone[0].dev;
	mdk_rdev_t **devlist = conf->devlist;
	int i;
	int i;


	for (i=0; i<mddev->raid_disks; i++) {
	for (i=0; i<mddev->raid_disks; i++) {
@@ -41,7 +41,7 @@ static int raid0_congested(void *data, int bits)
{
{
	mddev_t *mddev = data;
	mddev_t *mddev = data;
	raid0_conf_t *conf = mddev_to_conf(mddev);
	raid0_conf_t *conf = mddev_to_conf(mddev);
	mdk_rdev_t **devlist = conf->strip_zone[0].dev;
	mdk_rdev_t **devlist = conf->devlist;
	int i, ret = 0;
	int i, ret = 0;


	for (i = 0; i < mddev->raid_disks && !ret ; i++) {
	for (i = 0; i < mddev->raid_disks && !ret ; i++) {
@@ -56,7 +56,7 @@ static int create_strip_zones(mddev_t *mddev)
{
{
	int i, c, j, err;
	int i, c, j, err;
	sector_t curr_zone_end, sectors;
	sector_t curr_zone_end, sectors;
	mdk_rdev_t *smallest, *rdev1, *rdev2, *rdev;
	mdk_rdev_t *smallest, *rdev1, *rdev2, *rdev, **dev;
	struct strip_zone *zone;
	struct strip_zone *zone;
	int cnt;
	int cnt;
	char b[BDEVNAME_SIZE];
	char b[BDEVNAME_SIZE];
@@ -115,7 +115,7 @@ static int create_strip_zones(mddev_t *mddev)
	zone = &conf->strip_zone[0];
	zone = &conf->strip_zone[0];
	cnt = 0;
	cnt = 0;
	smallest = NULL;
	smallest = NULL;
	zone->dev = conf->devlist;
	dev = conf->devlist;
	err = -EINVAL;
	err = -EINVAL;
	list_for_each_entry(rdev1, &mddev->disks, same_set) {
	list_for_each_entry(rdev1, &mddev->disks, same_set) {
		int j = rdev1->raid_disk;
		int j = rdev1->raid_disk;
@@ -125,12 +125,12 @@ static int create_strip_zones(mddev_t *mddev)
				"aborting!\n", j);
				"aborting!\n", j);
			goto abort;
			goto abort;
		}
		}
		if (zone->dev[j]) {
		if (dev[j]) {
			printk(KERN_ERR "raid0: multiple devices for %d - "
			printk(KERN_ERR "raid0: multiple devices for %d - "
				"aborting!\n", j);
				"aborting!\n", j);
			goto abort;
			goto abort;
		}
		}
		zone->dev[j] = rdev1;
		dev[j] = rdev1;


		blk_queue_stack_limits(mddev->queue,
		blk_queue_stack_limits(mddev->queue,
				       rdev1->bdev->bd_disk->queue);
				       rdev1->bdev->bd_disk->queue);
@@ -161,7 +161,7 @@ static int create_strip_zones(mddev_t *mddev)
	for (i = 1; i < conf->nr_strip_zones; i++)
	for (i = 1; i < conf->nr_strip_zones; i++)
	{
	{
		zone = conf->strip_zone + i;
		zone = conf->strip_zone + i;
		zone->dev = conf->strip_zone[i-1].dev + mddev->raid_disks;
		dev = conf->devlist + i * mddev->raid_disks;


		printk(KERN_INFO "raid0: zone %d\n", i);
		printk(KERN_INFO "raid0: zone %d\n", i);
		zone->dev_start = smallest->sectors;
		zone->dev_start = smallest->sectors;
@@ -170,7 +170,7 @@ static int create_strip_zones(mddev_t *mddev)


		for (j=0; j<cnt; j++) {
		for (j=0; j<cnt; j++) {
			char b[BDEVNAME_SIZE];
			char b[BDEVNAME_SIZE];
			rdev = conf->strip_zone[0].dev[j];
			rdev = conf->devlist[j];
			printk(KERN_INFO "raid0: checking %s ...",
			printk(KERN_INFO "raid0: checking %s ...",
				bdevname(rdev->bdev, b));
				bdevname(rdev->bdev, b));
			if (rdev->sectors <= zone->dev_start) {
			if (rdev->sectors <= zone->dev_start) {
@@ -178,7 +178,7 @@ static int create_strip_zones(mddev_t *mddev)
				continue;
				continue;
			}
			}
			printk(KERN_INFO " contained as device %d\n", c);
			printk(KERN_INFO " contained as device %d\n", c);
			zone->dev[c] = rdev;
			dev[c] = rdev;
			c++;
			c++;
			if (!smallest || rdev->sectors < smallest->sectors) {
			if (!smallest || rdev->sectors < smallest->sectors) {
				smallest = rdev;
				smallest = rdev;
@@ -383,7 +383,8 @@ static int raid0_make_request (struct request_queue *q, struct bio *bio)
		chunk = x;
		chunk = x;


		x = sector >> chunksect_bits;
		x = sector >> chunksect_bits;
		tmp_dev = zone->dev[sector_div(x, zone->nb_dev)];
		tmp_dev = conf->devlist[(zone - conf->strip_zone)*mddev->raid_disks
					+ sector_div(x, zone->nb_dev)];
	}
	}
	rsect = (chunk << chunksect_bits) + zone->dev_start + sect_in_chunk;
	rsect = (chunk << chunksect_bits) + zone->dev_start + sect_in_chunk;
 
 
+0 −1
Original line number Original line Diff line number Diff line
@@ -6,7 +6,6 @@ struct strip_zone
	sector_t zone_end;	/* Start of the next zone (in sectors) */
	sector_t zone_end;	/* Start of the next zone (in sectors) */
	sector_t dev_start;	/* Zone offset in real dev (in sectors) */
	sector_t dev_start;	/* Zone offset in real dev (in sectors) */
	int nb_dev;		/* # of devices attached to the zone */
	int nb_dev;		/* # of devices attached to the zone */
	mdk_rdev_t **dev;	/* Devices attached to the zone */
};
};


struct raid0_private_data
struct raid0_private_data