浏览代码

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

... only before array is started of course.

Signed-off-by: Neil Brown <neilb@suse.de>
Acked-by: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
NeilBrown 19 年之前
父节点
当前提交
3b34380ae8
共有 2 个文件被更改,包括 34 次插入0 次删除
  1. 8 0
      Documentation/md.txt
  2. 26 0
      drivers/md/md.c

+ 8 - 0
Documentation/md.txt

@@ -166,6 +166,14 @@ All md devices contain:
      will be empty.  If an array is being resized (not currently
      will be empty.  If an array is being resized (not currently
      possible) this will contain the larger of the old and new sizes.
      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'
 As component devices are added to an md array, they appear in the 'md'
 directory as new directories named
 directory as new directories named
       dev-XXX
       dev-XXX

+ 26 - 0
drivers/md/md.c

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