diff options
| -rw-r--r-- | Documentation/md.txt | 5 | ||||
| -rw-r--r-- | drivers/md/md.c | 27 |
2 files changed, 32 insertions, 0 deletions
diff --git a/Documentation/md.txt b/Documentation/md.txt index 4cf5972821a9..80f158745ca5 100644 --- a/Documentation/md.txt +++ b/Documentation/md.txt | |||
| @@ -200,6 +200,11 @@ All md devices contain: | |||
| 200 | This can be written only while the array is being assembled, not | 200 | This can be written only while the array is being assembled, not |
| 201 | after it is started. | 201 | after it is started. |
| 202 | 202 | ||
| 203 | layout | ||
| 204 | The "layout" for the array for the particular level. This is | ||
| 205 | simply a number that is interpretted differently by different | ||
| 206 | levels. It can be written while assembling an array. | ||
| 207 | |||
| 203 | new_dev | 208 | new_dev |
| 204 | This file can be written but not read. The value written should | 209 | This file can be written but not read. The value written should |
| 205 | be a block device number as major:minor. e.g. 8:0 | 210 | 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 4b74c77213c3..e3261c438a65 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) | |||
| 2155 | static struct md_sysfs_entry md_level = | 2155 | static struct md_sysfs_entry md_level = |
| 2156 | __ATTR(level, 0644, level_show, level_store); | 2156 | __ATTR(level, 0644, level_show, level_store); |
| 2157 | 2157 | ||
| 2158 | |||
| 2159 | static ssize_t | ||
| 2160 | layout_show(mddev_t *mddev, char *page) | ||
| 2161 | { | ||
| 2162 | /* just a number, not meaningful for all levels */ | ||
| 2163 | return sprintf(page, "%d\n", mddev->layout); | ||
| 2164 | } | ||
| 2165 | |||
| 2166 | static ssize_t | ||
| 2167 | layout_store(mddev_t *mddev, const char *buf, size_t len) | ||
| 2168 | { | ||
| 2169 | char *e; | ||
| 2170 | unsigned long n = simple_strtoul(buf, &e, 10); | ||
| 2171 | if (mddev->pers) | ||
| 2172 | return -EBUSY; | ||
| 2173 | |||
| 2174 | if (!*buf || (*e && *e != '\n')) | ||
| 2175 | return -EINVAL; | ||
| 2176 | |||
| 2177 | mddev->layout = n; | ||
| 2178 | return len; | ||
| 2179 | } | ||
| 2180 | static struct md_sysfs_entry md_layout = | ||
| 2181 | __ATTR(layout, 0655, layout_show, layout_store); | ||
| 2182 | |||
| 2183 | |||
| 2158 | static ssize_t | 2184 | static ssize_t |
| 2159 | raid_disks_show(mddev_t *mddev, char *page) | 2185 | raid_disks_show(mddev_t *mddev, char *page) |
| 2160 | { | 2186 | { |
| @@ -2741,6 +2767,7 @@ __ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store); | |||
| 2741 | 2767 | ||
| 2742 | static struct attribute *md_default_attrs[] = { | 2768 | static struct attribute *md_default_attrs[] = { |
| 2743 | &md_level.attr, | 2769 | &md_level.attr, |
| 2770 | &md_layout.attr, | ||
| 2744 | &md_raid_disks.attr, | 2771 | &md_raid_disks.attr, |
| 2745 | &md_chunk_size.attr, | 2772 | &md_chunk_size.attr, |
| 2746 | &md_size.attr, | 2773 | &md_size.attr, |
