aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2006-06-26 00:27:59 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-26 09:58:39 -0700
commitd4dbd0250ea1d24bb3d2d13559432fa069d795e2 (patch)
tree060ec90679ea9d7a535146a35b0e9a8c9d940252
parent45dc2de1e53a29f898b81326b8a16e6192d52e4e (diff)
downloadmrst-s0i3-test-d4dbd0250ea1d24bb3d2d13559432fa069d795e2.tar.gz
mrst-s0i3-test-d4dbd0250ea1d24bb3d2d13559432fa069d795e2.tar.xz
mrst-s0i3-test-d4dbd0250ea1d24bb3d2d13559432fa069d795e2.zip
[PATCH] md: Allow raid 'layout' to be read and set via sysfs
Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--Documentation/md.txt5
-rw-r--r--drivers/md/md.c27
2 files changed, 32 insertions, 0 deletions
diff --git a/Documentation/md.txt b/Documentation/md.txt
index 4cf5972821a..80f158745ca 100644
--- a/Documentation/md.txt
+++ b/Documentation/md.txt
@@ -200,6 +200,11 @@ All md devices contain:
This can be written only while the array is being assembled, not
after it is started.
+ layout
+ The "layout" for the array for the particular level. This is
+ simply a number that is interpretted differently by different
+ levels. It can be written while assembling an array.
+
new_dev
This file can be written but not read. The value written should
be a block device number as major:minor. e.g. 8:0
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 4b74c77213c..e3261c438a6 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2155,6 +2155,32 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
static struct md_sysfs_entry md_level =
__ATTR(level, 0644, level_show, level_store);
+
+static ssize_t
+layout_show(mddev_t *mddev, char *page)
+{
+ /* just a number, not meaningful for all levels */
+ return sprintf(page, "%d\n", mddev->layout);
+}
+
+static ssize_t
+layout_store(mddev_t *mddev, const char *buf, size_t len)
+{
+ char *e;
+ unsigned long n = simple_strtoul(buf, &e, 10);
+ if (mddev->pers)
+ return -EBUSY;
+
+ if (!*buf || (*e && *e != '\n'))
+ return -EINVAL;
+
+ mddev->layout = n;
+ return len;
+}
+static struct md_sysfs_entry md_layout =
+__ATTR(layout, 0655, layout_show, layout_store);
+
+
static ssize_t
raid_disks_show(mddev_t *mddev, char *page)
{
@@ -2741,6 +2767,7 @@ __ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store);
static struct attribute *md_default_attrs[] = {
&md_level.attr,
+ &md_layout.attr,
&md_raid_disks.attr,
&md_chunk_size.attr,
&md_size.attr,