Commit 3b34380a authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds
Browse files

[PATCH] md: allow chunk_size to be settable through sysfs



... only before array is started of course.

Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Acked-by: default avatarGreg KH <greg@kroah.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 03c902e1
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -166,6 +166,14 @@ All md devices contain:
     will be empty.  If an array is being resized (not currently
     possible) this will contain the larger of the old and new sizes.

  chunk_size
     This is the size if bytes for 'chunks' and is only relevant to
     raid levels that involve striping (1,4,5,6,10). The address space
     of the array is conceptually divided into chunks and consecutive
     chunks are striped onto neighbouring devices.
     The size should be atleast PAGE_SIZE (4k) and should be a power
     of 2.  This can only be set while assembling an array

As component devices are added to an md array, they appear in the 'md'
directory as new directories named
      dev-XXX
+26 −0
Original line number Diff line number Diff line
@@ -1794,6 +1794,31 @@ raid_disks_show(mddev_t *mddev, char *page)

static struct md_sysfs_entry md_raid_disks = __ATTR_RO(raid_disks);

static ssize_t
chunk_size_show(mddev_t *mddev, char *page)
{
	return sprintf(page, "%d\n", mddev->chunk_size);
}

static ssize_t
chunk_size_store(mddev_t *mddev, const char *buf, size_t len)
{
	/* can only set chunk_size if array is not yet active */
	char *e;
	unsigned long n = simple_strtoul(buf, &e, 10);

	if (mddev->pers)
		return -EBUSY;
	if (!*buf || (*e && *e != '\n'))
		return -EINVAL;

	mddev->chunk_size = n;
	return len;
}
static struct md_sysfs_entry md_chunk_size =
__ATTR(chunk_size, 0644, chunk_size_show, chunk_size_store);


static ssize_t
action_show(mddev_t *mddev, char *page)
{
@@ -1861,6 +1886,7 @@ md_mismatches = __ATTR_RO(mismatch_cnt);
static struct attribute *md_default_attrs[] = {
	&md_level.attr,
	&md_raid_disks.attr,
	&md_chunk_size.attr,
	NULL,
};