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
|
@ -6503,6 +6503,77 @@ raid5_rmw_level = __ATTR(rmw_level, S_IRUGO | S_IWUSR,
|
|||
raid5_show_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
|
||||
raid5_show_preread_threshold(struct mddev *mddev, char *page)
|
||||
|
@ -6691,6 +6762,7 @@ static struct attribute *raid5_attrs[] = {
|
|||
&raid5_group_thread_cnt.attr,
|
||||
&raid5_skip_copy.attr,
|
||||
&raid5_rmw_level.attr,
|
||||
&raid5_stripe_size.attr,
|
||||
&r5c_journal_mode.attr,
|
||||
&ppl_write_hint.attr,
|
||||
NULL,
|
||||
|
|
Loading…
Reference in New Issue