md/raid5: support config stripe_size by sysfs entry
Adding a new 'stripe_size' sysfs entry to set and show stripe_size. stripe_size should not be bigger than PAGE_SIZE, and it requires to be multiple of 4096. We can adjust stripe_size by writing value into sysfs entry, likely, set stripe_size as 16KB: echo 16384 > /sys/block/md1/md/stripe_size Show current stripe_size value: cat /sys/block/md1/md/stripe_size For PAGE_SIZE is equal to 4096, 'stripe_size' can just be read. Signed-off-by: Yufen Yu <yuyufen@huawei.com> Signed-off-by: Song Liu <songliubraving@fb.com>
This commit is contained in:
parent
e236858243
commit
3b5408b98e
1 changed files with 72 additions and 0 deletions
|
@ -6503,6 +6503,77 @@ raid5_rmw_level = __ATTR(rmw_level, S_IRUGO | S_IWUSR,
|
||||||
raid5_show_rmw_level,
|
raid5_show_rmw_level,
|
||||||
raid5_store_rmw_level);
|
raid5_store_rmw_level);
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
raid5_show_stripe_size(struct mddev *mddev, char *page)
|
||||||
|
{
|
||||||
|
struct r5conf *conf;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
spin_lock(&mddev->lock);
|
||||||
|
conf = mddev->private;
|
||||||
|
if (conf)
|
||||||
|
ret = sprintf(page, "%lu\n", RAID5_STRIPE_SIZE(conf));
|
||||||
|
spin_unlock(&mddev->lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if PAGE_SIZE != DEFAULT_STRIPE_SIZE
|
||||||
|
static ssize_t
|
||||||
|
raid5_store_stripe_size(struct mddev *mddev, const char *page, size_t len)
|
||||||
|
{
|
||||||
|
struct r5conf *conf;
|
||||||
|
unsigned long new;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (len >= PAGE_SIZE)
|
||||||
|
return -EINVAL;
|
||||||
|
if (kstrtoul(page, 10, &new))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The value should not be bigger than PAGE_SIZE. It requires to
|
||||||
|
* be multiple of DEFAULT_STRIPE_SIZE.
|
||||||
|
*/
|
||||||
|
if (new % DEFAULT_STRIPE_SIZE != 0 || new > PAGE_SIZE || new == 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
err = mddev_lock(mddev);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
conf = mddev->private;
|
||||||
|
if (!conf) {
|
||||||
|
err = -ENODEV;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new == conf->stripe_size)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
|
pr_debug("md/raid: change stripe_size from %lu to %lu\n",
|
||||||
|
conf->stripe_size, new);
|
||||||
|
|
||||||
|
mddev_suspend(mddev);
|
||||||
|
conf->stripe_size = new;
|
||||||
|
conf->stripe_shift = ilog2(new) - 9;
|
||||||
|
conf->stripe_sectors = new >> 9;
|
||||||
|
mddev_resume(mddev);
|
||||||
|
|
||||||
|
out_unlock:
|
||||||
|
mddev_unlock(mddev);
|
||||||
|
return err ?: len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct md_sysfs_entry
|
||||||
|
raid5_stripe_size = __ATTR(stripe_size, 0644,
|
||||||
|
raid5_show_stripe_size,
|
||||||
|
raid5_store_stripe_size);
|
||||||
|
#else
|
||||||
|
static struct md_sysfs_entry
|
||||||
|
raid5_stripe_size = __ATTR(stripe_size, 0444,
|
||||||
|
raid5_show_stripe_size,
|
||||||
|
NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
raid5_show_preread_threshold(struct mddev *mddev, char *page)
|
raid5_show_preread_threshold(struct mddev *mddev, char *page)
|
||||||
|
@ -6691,6 +6762,7 @@ static struct attribute *raid5_attrs[] = {
|
||||||
&raid5_group_thread_cnt.attr,
|
&raid5_group_thread_cnt.attr,
|
||||||
&raid5_skip_copy.attr,
|
&raid5_skip_copy.attr,
|
||||||
&raid5_rmw_level.attr,
|
&raid5_rmw_level.attr,
|
||||||
|
&raid5_stripe_size.attr,
|
||||||
&r5c_journal_mode.attr,
|
&r5c_journal_mode.attr,
|
||||||
&ppl_write_hint.attr,
|
&ppl_write_hint.attr,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
Loading…
Add table
Reference in a new issue