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

Commit 9d8f0363 authored by Andre Noll's avatar Andre Noll Committed by NeilBrown
Browse files

md: Make mddev->chunk_size sector-based.



This patch renames the chunk_size field to chunk_sectors with the
implied change of semantics.  Since

	is_power_of_2(chunk_size) = is_power_of_2(chunk_sectors << 9)
				  = is_power_of_2(chunk_sectors)

these bits don't need an adjustment for the shift.

Signed-off-by: default avatarAndre Noll <maan@systemlinux.org>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent fbb704ef
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -305,7 +305,7 @@ static int linear_make_request (struct request_queue *q, struct bio *bio)
static void linear_status (struct seq_file *seq, mddev_t *mddev)
static void linear_status (struct seq_file *seq, mddev_t *mddev)
{
{


	seq_printf(seq, " %dk rounding", mddev->chunk_size/1024);
	seq_printf(seq, " %dk rounding", mddev->chunk_sectors / 2);
}
}




+26 −25
Original line number Original line Diff line number Diff line
@@ -869,7 +869,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
		mddev->minor_version = sb->minor_version;
		mddev->minor_version = sb->minor_version;
		mddev->patch_version = sb->patch_version;
		mddev->patch_version = sb->patch_version;
		mddev->external = 0;
		mddev->external = 0;
		mddev->chunk_size = sb->chunk_size;
		mddev->chunk_sectors = sb->chunk_size >> 9;
		mddev->ctime = sb->ctime;
		mddev->ctime = sb->ctime;
		mddev->utime = sb->utime;
		mddev->utime = sb->utime;
		mddev->level = sb->level;
		mddev->level = sb->level;
@@ -892,7 +892,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
			mddev->delta_disks = 0;
			mddev->delta_disks = 0;
			mddev->new_level = mddev->level;
			mddev->new_level = mddev->level;
			mddev->new_layout = mddev->layout;
			mddev->new_layout = mddev->layout;
			mddev->new_chunk = mddev->chunk_size;
			mddev->new_chunk = mddev->chunk_sectors << 9;
		}
		}


		if (sb->state & (1<<MD_SB_CLEAN))
		if (sb->state & (1<<MD_SB_CLEAN))
@@ -1021,7 +1021,7 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
		sb->recovery_cp = 0;
		sb->recovery_cp = 0;


	sb->layout = mddev->layout;
	sb->layout = mddev->layout;
	sb->chunk_size = mddev->chunk_size;
	sb->chunk_size = mddev->chunk_sectors << 9;


	if (mddev->bitmap && mddev->bitmap_file == NULL)
	if (mddev->bitmap && mddev->bitmap_file == NULL)
		sb->state |= (1<<MD_SB_BITMAP_PRESENT);
		sb->state |= (1<<MD_SB_BITMAP_PRESENT);
@@ -1278,7 +1278,7 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
		mddev->major_version = 1;
		mddev->major_version = 1;
		mddev->patch_version = 0;
		mddev->patch_version = 0;
		mddev->external = 0;
		mddev->external = 0;
		mddev->chunk_size = le32_to_cpu(sb->chunksize) << 9;
		mddev->chunk_sectors = le32_to_cpu(sb->chunksize);
		mddev->ctime = le64_to_cpu(sb->ctime) & ((1ULL << 32)-1);
		mddev->ctime = le64_to_cpu(sb->ctime) & ((1ULL << 32)-1);
		mddev->utime = le64_to_cpu(sb->utime) & ((1ULL << 32)-1);
		mddev->utime = le64_to_cpu(sb->utime) & ((1ULL << 32)-1);
		mddev->level = le32_to_cpu(sb->level);
		mddev->level = le32_to_cpu(sb->level);
@@ -1310,7 +1310,7 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
			mddev->delta_disks = 0;
			mddev->delta_disks = 0;
			mddev->new_level = mddev->level;
			mddev->new_level = mddev->level;
			mddev->new_layout = mddev->layout;
			mddev->new_layout = mddev->layout;
			mddev->new_chunk = mddev->chunk_size;
			mddev->new_chunk = mddev->chunk_sectors << 9;
		}
		}


	} else if (mddev->pers == NULL) {
	} else if (mddev->pers == NULL) {
@@ -1382,7 +1382,7 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)


	sb->raid_disks = cpu_to_le32(mddev->raid_disks);
	sb->raid_disks = cpu_to_le32(mddev->raid_disks);
	sb->size = cpu_to_le64(mddev->dev_sectors);
	sb->size = cpu_to_le64(mddev->dev_sectors);
	sb->chunksize = cpu_to_le32(mddev->chunk_size >> 9);
	sb->chunksize = cpu_to_le32(mddev->chunk_sectors);
	sb->level = cpu_to_le32(mddev->level);
	sb->level = cpu_to_le32(mddev->level);
	sb->layout = cpu_to_le32(mddev->layout);
	sb->layout = cpu_to_le32(mddev->layout);


@@ -2753,7 +2753,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
	if (IS_ERR(priv)) {
	if (IS_ERR(priv)) {
		mddev->new_level = mddev->level;
		mddev->new_level = mddev->level;
		mddev->new_layout = mddev->layout;
		mddev->new_layout = mddev->layout;
		mddev->new_chunk = mddev->chunk_size;
		mddev->new_chunk = mddev->chunk_sectors << 9;
		mddev->raid_disks -= mddev->delta_disks;
		mddev->raid_disks -= mddev->delta_disks;
		mddev->delta_disks = 0;
		mddev->delta_disks = 0;
		module_put(pers->owner);
		module_put(pers->owner);
@@ -2771,7 +2771,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
	strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
	strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
	mddev->level = mddev->new_level;
	mddev->level = mddev->new_level;
	mddev->layout = mddev->new_layout;
	mddev->layout = mddev->new_layout;
	mddev->chunk_size = mddev->new_chunk;
	mddev->chunk_sectors = mddev->new_chunk >> 9;
	mddev->delta_disks = 0;
	mddev->delta_disks = 0;
	pers->run(mddev);
	pers->run(mddev);
	mddev_resume(mddev);
	mddev_resume(mddev);
@@ -2864,10 +2864,10 @@ static ssize_t
chunk_size_show(mddev_t *mddev, char *page)
chunk_size_show(mddev_t *mddev, char *page)
{
{
	if (mddev->reshape_position != MaxSector &&
	if (mddev->reshape_position != MaxSector &&
	    mddev->chunk_size != mddev->new_chunk)
	    mddev->chunk_sectors << 9 != mddev->new_chunk)
		return sprintf(page, "%d (%d)\n", mddev->new_chunk,
		return sprintf(page, "%d (%d)\n", mddev->new_chunk,
			       mddev->chunk_size);
			       mddev->chunk_sectors << 9);
	return sprintf(page, "%d\n", mddev->chunk_size);
	return sprintf(page, "%d\n", mddev->chunk_sectors << 9);
}
}


static ssize_t
static ssize_t
@@ -2889,7 +2889,7 @@ chunk_size_store(mddev_t *mddev, const char *buf, size_t len)
	} else {
	} else {
		mddev->new_chunk = n;
		mddev->new_chunk = n;
		if (mddev->reshape_position == MaxSector)
		if (mddev->reshape_position == MaxSector)
			mddev->chunk_size = n;
			mddev->chunk_sectors = n >> 9;
	}
	}
	return len;
	return len;
}
}
@@ -3534,9 +3534,9 @@ min_sync_store(mddev_t *mddev, const char *buf, size_t len)
		return -EBUSY;
		return -EBUSY;


	/* Must be a multiple of chunk_size */
	/* Must be a multiple of chunk_size */
	if (mddev->chunk_size) {
	if (mddev->chunk_sectors) {
		sector_t temp = min;
		sector_t temp = min;
		if (sector_div(temp, (mddev->chunk_size>>9)))
		if (sector_div(temp, mddev->chunk_sectors))
			return -EINVAL;
			return -EINVAL;
	}
	}
	mddev->resync_min = min;
	mddev->resync_min = min;
@@ -3572,9 +3572,9 @@ max_sync_store(mddev_t *mddev, const char *buf, size_t len)
			return -EBUSY;
			return -EBUSY;


		/* Must be a multiple of chunk_size */
		/* Must be a multiple of chunk_size */
		if (mddev->chunk_size) {
		if (mddev->chunk_sectors) {
			sector_t temp = max;
			sector_t temp = max;
			if (sector_div(temp, (mddev->chunk_size>>9)))
			if (sector_div(temp, mddev->chunk_sectors))
				return -EINVAL;
				return -EINVAL;
		}
		}
		mddev->resync_max = max;
		mddev->resync_max = max;
@@ -3665,7 +3665,7 @@ reshape_position_store(mddev_t *mddev, const char *buf, size_t len)
	mddev->delta_disks = 0;
	mddev->delta_disks = 0;
	mddev->new_level = mddev->level;
	mddev->new_level = mddev->level;
	mddev->new_layout = mddev->layout;
	mddev->new_layout = mddev->layout;
	mddev->new_chunk = mddev->chunk_size;
	mddev->new_chunk = mddev->chunk_sectors << 9;
	return len;
	return len;
}
}


@@ -4007,7 +4007,7 @@ static int do_md_run(mddev_t * mddev)
		analyze_sbs(mddev);
		analyze_sbs(mddev);
	}
	}


	chunk_size = mddev->chunk_size;
	chunk_size = mddev->chunk_sectors << 9;


	if (chunk_size) {
	if (chunk_size) {
		if (chunk_size > MAX_CHUNK_SIZE) {
		if (chunk_size > MAX_CHUNK_SIZE) {
@@ -4406,7 +4406,7 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
		mddev->flags = 0;
		mddev->flags = 0;
		mddev->ro = 0;
		mddev->ro = 0;
		mddev->metadata_type[0] = 0;
		mddev->metadata_type[0] = 0;
		mddev->chunk_size = 0;
		mddev->chunk_sectors = 0;
		mddev->ctime = mddev->utime = 0;
		mddev->ctime = mddev->utime = 0;
		mddev->layout = 0;
		mddev->layout = 0;
		mddev->max_disks = 0;
		mddev->max_disks = 0;
@@ -4619,7 +4619,7 @@ static int get_array_info(mddev_t * mddev, void __user * arg)
	info.spare_disks   = spare;
	info.spare_disks   = spare;


	info.layout        = mddev->layout;
	info.layout        = mddev->layout;
	info.chunk_size    = mddev->chunk_size;
	info.chunk_size    = mddev->chunk_sectors << 9;


	if (copy_to_user(arg, &info, sizeof(info)))
	if (copy_to_user(arg, &info, sizeof(info)))
		return -EFAULT;
		return -EFAULT;
@@ -4844,7 +4844,8 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
			rdev->sb_start = rdev->bdev->bd_inode->i_size / 512;
			rdev->sb_start = rdev->bdev->bd_inode->i_size / 512;
		} else 
		} else 
			rdev->sb_start = calc_dev_sboffset(rdev->bdev);
			rdev->sb_start = calc_dev_sboffset(rdev->bdev);
		rdev->sectors = calc_num_sectors(rdev, mddev->chunk_size);
		rdev->sectors = calc_num_sectors(rdev,
						 mddev->chunk_sectors << 9);


		err = bind_rdev_to_array(rdev, mddev);
		err = bind_rdev_to_array(rdev, mddev);
		if (err) {
		if (err) {
@@ -4914,7 +4915,7 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
	else
	else
		rdev->sb_start = rdev->bdev->bd_inode->i_size / 512;
		rdev->sb_start = rdev->bdev->bd_inode->i_size / 512;


	rdev->sectors = calc_num_sectors(rdev, mddev->chunk_size);
	rdev->sectors = calc_num_sectors(rdev, mddev->chunk_sectors << 9);


	if (test_bit(Faulty, &rdev->flags)) {
	if (test_bit(Faulty, &rdev->flags)) {
		printk(KERN_WARNING 
		printk(KERN_WARNING 
@@ -5063,7 +5064,7 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
	mddev->external	     = 0;
	mddev->external	     = 0;


	mddev->layout        = info->layout;
	mddev->layout        = info->layout;
	mddev->chunk_size    = info->chunk_size;
	mddev->chunk_sectors = info->chunk_size >> 9;


	mddev->max_disks     = MD_SB_DISKS;
	mddev->max_disks     = MD_SB_DISKS;


@@ -5082,7 +5083,7 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
	get_random_bytes(mddev->uuid, 16);
	get_random_bytes(mddev->uuid, 16);


	mddev->new_level = mddev->level;
	mddev->new_level = mddev->level;
	mddev->new_chunk = mddev->chunk_size;
	mddev->new_chunk = mddev->chunk_sectors << 9;
	mddev->new_layout = mddev->layout;
	mddev->new_layout = mddev->layout;
	mddev->delta_disks = 0;
	mddev->delta_disks = 0;


@@ -5192,7 +5193,7 @@ static int update_array_info(mddev_t *mddev, mdu_array_info_t *info)
	    mddev->level         != info->level         ||
	    mddev->level         != info->level         ||
/*	    mddev->layout        != info->layout        || */
/*	    mddev->layout        != info->layout        || */
	    !mddev->persistent	 != info->not_persistent||
	    !mddev->persistent	 != info->not_persistent||
	    mddev->chunk_size    != info->chunk_size    ||
	    mddev->chunk_sectors != info->chunk_size >> 9 ||
	    /* ignore bottom 8 bits of state, and allow SB_BITMAP_PRESENT to change */
	    /* ignore bottom 8 bits of state, and allow SB_BITMAP_PRESENT to change */
	    ((state^info->state) & 0xfffffe00)
	    ((state^info->state) & 0xfffffe00)
		)
		)
+1 −1
Original line number Original line Diff line number Diff line
@@ -145,7 +145,7 @@ struct mddev_s
	int 				external;	/* metadata is
	int 				external;	/* metadata is
							 * managed externally */
							 * managed externally */
	char				metadata_type[17]; /* externally set*/
	char				metadata_type[17]; /* externally set*/
	int				chunk_size;
	int				chunk_sectors;
	time_t				ctime, utime;
	time_t				ctime, utime;
	int				level, layout;
	int				level, layout;
	char				clevel[16];
	char				clevel[16];
+14 −13
Original line number Original line Diff line number Diff line
@@ -238,10 +238,10 @@ static int create_strip_zones(mddev_t *mddev)
	 * now since we have the hard sector sizes, we can make sure
	 * now since we have the hard sector sizes, we can make sure
	 * chunk size is a multiple of that sector size
	 * chunk size is a multiple of that sector size
	 */
	 */
	if (mddev->chunk_size % queue_logical_block_size(mddev->queue)) {
	if ((mddev->chunk_sectors << 9) % queue_logical_block_size(mddev->queue)) {
		printk(KERN_ERR "%s chunk_size of %d not valid\n",
		printk(KERN_ERR "%s chunk_size of %d not valid\n",
		       mdname(mddev),
		       mdname(mddev),
		       mddev->chunk_size);
		       mddev->chunk_sectors << 9);
		goto abort;
		goto abort;
	}
	}
	printk(KERN_INFO "raid0: done.\n");
	printk(KERN_INFO "raid0: done.\n");
@@ -270,10 +270,10 @@ static int raid0_mergeable_bvec(struct request_queue *q,
	mddev_t *mddev = q->queuedata;
	mddev_t *mddev = q->queuedata;
	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
	sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
	int max;
	int max;
	unsigned int chunk_sectors = mddev->chunk_size >> 9;
	unsigned int chunk_sectors = mddev->chunk_sectors;
	unsigned int bio_sectors = bvm->bi_size >> 9;
	unsigned int bio_sectors = bvm->bi_size >> 9;


	if (is_power_of_2(mddev->chunk_size))
	if (is_power_of_2(mddev->chunk_sectors))
		max =  (chunk_sectors - ((sector & (chunk_sectors-1))
		max =  (chunk_sectors - ((sector & (chunk_sectors-1))
						+ bio_sectors)) << 9;
						+ bio_sectors)) << 9;
	else
	else
@@ -304,11 +304,11 @@ static int raid0_run(mddev_t *mddev)
{
{
	int ret;
	int ret;


	if (mddev->chunk_size == 0) {
	if (mddev->chunk_sectors == 0) {
		printk(KERN_ERR "md/raid0: chunk size must be set.\n");
		printk(KERN_ERR "md/raid0: chunk size must be set.\n");
		return -EINVAL;
		return -EINVAL;
	}
	}
	blk_queue_max_sectors(mddev->queue, mddev->chunk_size >> 9);
	blk_queue_max_sectors(mddev->queue, mddev->chunk_sectors);
	mddev->queue->queue_lock = &mddev->queue->__queue_lock;
	mddev->queue->queue_lock = &mddev->queue->__queue_lock;


	ret = create_strip_zones(mddev);
	ret = create_strip_zones(mddev);
@@ -330,7 +330,8 @@ static int raid0_run(mddev_t *mddev)
	 * chunksize should be used in that case.
	 * chunksize should be used in that case.
	 */
	 */
	{
	{
		int stripe = mddev->raid_disks * mddev->chunk_size / PAGE_SIZE;
		int stripe = mddev->raid_disks *
			(mddev->chunk_sectors << 9) / PAGE_SIZE;
		if (mddev->queue->backing_dev_info.ra_pages < 2* stripe)
		if (mddev->queue->backing_dev_info.ra_pages < 2* stripe)
			mddev->queue->backing_dev_info.ra_pages = 2* stripe;
			mddev->queue->backing_dev_info.ra_pages = 2* stripe;
	}
	}
@@ -381,9 +382,9 @@ static mdk_rdev_t *map_sector(mddev_t *mddev, struct strip_zone *zone,
	unsigned int sect_in_chunk;
	unsigned int sect_in_chunk;
	sector_t chunk;
	sector_t chunk;
	raid0_conf_t *conf = mddev->private;
	raid0_conf_t *conf = mddev->private;
	unsigned int chunk_sects = mddev->chunk_size >> 9;
	unsigned int chunk_sects = mddev->chunk_sectors;


	if (is_power_of_2(mddev->chunk_size)) {
	if (is_power_of_2(mddev->chunk_sectors)) {
		int chunksect_bits = ffz(~chunk_sects);
		int chunksect_bits = ffz(~chunk_sects);
		/* find the sector offset inside the chunk */
		/* find the sector offset inside the chunk */
		sect_in_chunk  = sector & (chunk_sects - 1);
		sect_in_chunk  = sector & (chunk_sects - 1);
@@ -413,7 +414,7 @@ static mdk_rdev_t *map_sector(mddev_t *mddev, struct strip_zone *zone,
static inline int is_io_in_chunk_boundary(mddev_t *mddev,
static inline int is_io_in_chunk_boundary(mddev_t *mddev,
			unsigned int chunk_sects, struct bio *bio)
			unsigned int chunk_sects, struct bio *bio)
{
{
	if (likely(is_power_of_2(mddev->chunk_size))) {
	if (likely(is_power_of_2(mddev->chunk_sectors))) {
		return chunk_sects >= ((bio->bi_sector & (chunk_sects-1))
		return chunk_sects >= ((bio->bi_sector & (chunk_sects-1))
					+ (bio->bi_size >> 9));
					+ (bio->bi_size >> 9));
	} else{
	} else{
@@ -444,7 +445,7 @@ static int raid0_make_request(struct request_queue *q, struct bio *bio)
		      bio_sectors(bio));
		      bio_sectors(bio));
	part_stat_unlock();
	part_stat_unlock();


	chunk_sects = mddev->chunk_size >> 9;
	chunk_sects = mddev->chunk_sectors;
	if (unlikely(!is_io_in_chunk_boundary(mddev, chunk_sects, bio))) {
	if (unlikely(!is_io_in_chunk_boundary(mddev, chunk_sects, bio))) {
		sector_t sector = bio->bi_sector;
		sector_t sector = bio->bi_sector;
		struct bio_pair *bp;
		struct bio_pair *bp;
@@ -455,7 +456,7 @@ static int raid0_make_request(struct request_queue *q, struct bio *bio)
		/* This is a one page bio that upper layers
		/* This is a one page bio that upper layers
		 * refuse to split for us, so we need to split it.
		 * refuse to split for us, so we need to split it.
		 */
		 */
		if (likely(is_power_of_2(mddev->chunk_size)))
		if (likely(is_power_of_2(mddev->chunk_sectors)))
			bp = bio_split(bio, chunk_sects - (sector &
			bp = bio_split(bio, chunk_sects - (sector &
							   (chunk_sects-1)));
							   (chunk_sects-1)));
		else
		else
@@ -519,7 +520,7 @@ static void raid0_status(struct seq_file *seq, mddev_t *mddev)
		zone_start = conf->strip_zone[j].zone_end;
		zone_start = conf->strip_zone[j].zone_end;
	}
	}
#endif
#endif
	seq_printf(seq, " %dk chunks", mddev->chunk_size/1024);
	seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2);
	return;
	return;
}
}


+2 −2
Original line number Original line Diff line number Diff line
@@ -2161,10 +2161,10 @@ static int raid1_reshape(mddev_t *mddev)
	int d, d2, err;
	int d, d2, err;


	/* Cannot change chunk_size, layout, or level */
	/* Cannot change chunk_size, layout, or level */
	if (mddev->chunk_size != mddev->new_chunk ||
	if (mddev->chunk_sectors << 9 != mddev->new_chunk ||
	    mddev->layout != mddev->new_layout ||
	    mddev->layout != mddev->new_layout ||
	    mddev->level != mddev->new_level) {
	    mddev->level != mddev->new_level) {
		mddev->new_chunk = mddev->chunk_size;
		mddev->new_chunk = mddev->chunk_sectors << 9;
		mddev->new_layout = mddev->layout;
		mddev->new_layout = mddev->layout;
		mddev->new_level = mddev->level;
		mddev->new_level = mddev->level;
		return -EINVAL;
		return -EINVAL;
Loading