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

Commit c41d4ac4 authored by NeilBrown's avatar NeilBrown
Browse files

md/raid5: factor out code for changing size of stripe cache.



Separate the actual 'change' code from the sysfs interface
so that it can eventually be called internally.

Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 00bcb4ac
Loading
Loading
Loading
Loading
+26 −13
Original line number Diff line number Diff line
@@ -4566,23 +4566,15 @@ raid5_show_stripe_cache_size(mddev_t *mddev, char *page)
		return 0;
}

static ssize_t
raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
int
raid5_set_cache_size(mddev_t *mddev, int size)
{
	raid5_conf_t *conf = mddev->private;
	unsigned long new;
	int err;

	if (len >= PAGE_SIZE)
	if (size <= 16 || size > 32768)
		return -EINVAL;
	if (!conf)
		return -ENODEV;

	if (strict_strtoul(page, 10, &new))
		return -EINVAL;
	if (new <= 16 || new > 32768)
		return -EINVAL;
	while (new < conf->max_nr_stripes) {
	while (size < conf->max_nr_stripes) {
		if (drop_one_stripe(conf))
			conf->max_nr_stripes--;
		else
@@ -4591,11 +4583,32 @@ raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
	err = md_allow_write(mddev);
	if (err)
		return err;
	while (new > conf->max_nr_stripes) {
	while (size > conf->max_nr_stripes) {
		if (grow_one_stripe(conf))
			conf->max_nr_stripes++;
		else break;
	}
	return 0;
}
EXPORT_SYMBOL(raid5_set_cache_size);

static ssize_t
raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
{
	raid5_conf_t *conf = mddev->private;
	unsigned long new;
	int err;

	if (len >= PAGE_SIZE)
		return -EINVAL;
	if (!conf)
		return -ENODEV;

	if (strict_strtoul(page, 10, &new))
		return -EINVAL;
	err = raid5_set_cache_size(mddev, new);
	if (err)
		return err;
	return len;
}

+1 −0
Original line number Diff line number Diff line
@@ -497,4 +497,5 @@ static inline int algorithm_is_DDF(int layout)
{
	return layout >= 8 && layout <= 10;
}
extern int raid5_set_cache_size(mddev_t *mddev, int size);
#endif