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

Commit 80c3a6ce authored by Dan Williams's avatar Dan Williams
Browse files

md: add 'size' as a personality method



In preparation for giving userspace control over ->array_sectors we need
to be able to retrieve the 'default' size, and the 'anticipated' size
when a reshape is requested.  For personalities that do not reshape emit
a warning if anything but the default size is requested.

In the raid5 case we need to update ->previous_raid_disks to make the
new 'default' size available.

Reviewed-by: default avatarAndre Noll <maan@systemlinux.org>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 93ed05e2
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -283,6 +283,17 @@ static int reconfig(mddev_t *mddev, int layout, int chunk_size)
	return 0;
}

static sector_t faulty_size(mddev_t *mddev, sector_t sectors, int raid_disks)
{
	WARN_ONCE(raid_disks,
		  "%s does not support generic reshape\n", __func__);

	if (sectors == 0)
		return mddev->dev_sectors;

	return sectors;
}

static int run(mddev_t *mddev)
{
	mdk_rdev_t *rdev;
@@ -301,7 +312,7 @@ static int run(mddev_t *mddev)
	list_for_each_entry(rdev, &mddev->disks, same_set)
		conf->rdev = rdev;

	mddev->array_sectors = mddev->dev_sectors;
	mddev->array_sectors = faulty_size(mddev, 0, 0);
	mddev->private = conf;

	reconfig(mddev, mddev->layout, -1);
@@ -328,6 +339,7 @@ static struct mdk_personality faulty_personality =
	.stop		= stop,
	.status		= status,
	.reconfig	= reconfig,
	.size		= faulty_size,
};

static int __init raid_init(void)
+13 −2
Original line number Diff line number Diff line
@@ -101,6 +101,16 @@ static int linear_congested(void *data, int bits)
	return ret;
}

static sector_t linear_size(mddev_t *mddev, sector_t sectors, int raid_disks)
{
	linear_conf_t *conf = mddev_to_conf(mddev);

	WARN_ONCE(sectors || raid_disks,
		  "%s does not support generic reshape\n", __func__);

	return conf->array_sectors;
}

static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
{
	linear_conf_t *conf;
@@ -253,7 +263,7 @@ static int linear_run (mddev_t *mddev)
	if (!conf)
		return 1;
	mddev->private = conf;
	mddev->array_sectors = conf->array_sectors;
	mddev->array_sectors = linear_size(mddev, 0, 0);

	blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec);
	mddev->queue->unplug_fn = linear_unplug;
@@ -287,7 +297,7 @@ 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_sectors = newconf->array_sectors;
	mddev->array_sectors = linear_size(mddev, 0, 0);
	set_capacity(mddev->gendisk, mddev->array_sectors);
	return 0;
}
@@ -385,6 +395,7 @@ static struct mdk_personality linear_personality =
	.stop		= linear_stop,
	.status		= linear_status,
	.hot_add_disk	= linear_add,
	.size		= linear_size,
};

static int __init linear_init (void)
+1 −0
Original line number Diff line number Diff line
@@ -312,6 +312,7 @@ struct mdk_personality
	int (*spare_active) (mddev_t *mddev);
	sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster);
	int (*resize) (mddev_t *mddev, sector_t sectors);
	sector_t (*size) (mddev_t *mddev, sector_t sectors, int raid_disks);
	int (*check_reshape) (mddev_t *mddev);
	int (*start_reshape) (mddev_t *mddev);
	int (*reconfig) (mddev_t *mddev, int layout, int chunk_size);
+10 −1
Original line number Diff line number Diff line
@@ -406,6 +406,14 @@ static void multipathd (mddev_t *mddev)
	spin_unlock_irqrestore(&conf->device_lock, flags);
}

static sector_t multipath_size(mddev_t *mddev, sector_t sectors, int raid_disks)
{
	WARN_ONCE(sectors || raid_disks,
		  "%s does not support generic reshape\n", __func__);

	return mddev->dev_sectors;
}

static int multipath_run (mddev_t *mddev)
{
	multipath_conf_t *conf;
@@ -502,7 +510,7 @@ static int multipath_run (mddev_t *mddev)
	/*
	 * Ok, everything is just fine now
	 */
	mddev->array_sectors = mddev->dev_sectors;
	mddev->array_sectors = multipath_size(mddev, 0, 0);

	mddev->queue->unplug_fn = multipath_unplug;
	mddev->queue->backing_dev_info.congested_fn = multipath_congested;
@@ -547,6 +555,7 @@ static struct mdk_personality multipath_personality =
	.error_handler	= multipath_error,
	.hot_add_disk	= multipath_add_disk,
	.hot_remove_disk= multipath_remove_disk,
	.size		= multipath_size,
};

static int __init multipath_init (void)
+16 −4
Original line number Diff line number Diff line
@@ -263,12 +263,25 @@ static int raid0_mergeable_bvec(struct request_queue *q,
		return max;
}

static sector_t raid0_size(mddev_t *mddev, sector_t sectors, int raid_disks)
{
	sector_t array_sectors = 0;
	mdk_rdev_t *rdev;

	WARN_ONCE(sectors || raid_disks,
		  "%s does not support generic reshape\n", __func__);

	list_for_each_entry(rdev, &mddev->disks, same_set)
		array_sectors += rdev->sectors;

	return array_sectors;
}

static int raid0_run (mddev_t *mddev)
{
	unsigned  cur=0, i=0, nb_zone;
	s64 sectors;
	raid0_conf_t *conf;
	mdk_rdev_t *rdev;

	if (mddev->chunk_size == 0) {
		printk(KERN_ERR "md/raid0: non-zero chunk size required.\n");
@@ -293,9 +306,7 @@ static int raid0_run (mddev_t *mddev)
		goto out_free_conf;

	/* calculate array device size */
	mddev->array_sectors = 0;
	list_for_each_entry(rdev, &mddev->disks, same_set)
		mddev->array_sectors += rdev->sectors;
	mddev->array_sectors = raid0_size(mddev, 0, 0);

	printk(KERN_INFO "raid0 : md_size is %llu sectors.\n",
		(unsigned long long)mddev->array_sectors);
@@ -511,6 +522,7 @@ static struct mdk_personality raid0_personality=
	.run		= raid0_run,
	.stop		= raid0_stop,
	.status		= raid0_status,
	.size		= raid0_size,
};

static int __init raid0_init (void)
Loading