diff options
-rw-r--r-- | Documentation/md.txt | 119 | ||||
-rw-r--r-- | drivers/md/md.c | 4 |
2 files changed, 122 insertions, 1 deletions
diff --git a/Documentation/md.txt b/Documentation/md.txt index e2b536992a27..23e6cce40f9c 100644 --- a/Documentation/md.txt +++ b/Documentation/md.txt | |||
@@ -116,3 +116,122 @@ and it's role in the array. | |||
116 | 116 | ||
117 | Once started with RUN_ARRAY, uninitialized spares can be added with | 117 | Once started with RUN_ARRAY, uninitialized spares can be added with |
118 | HOT_ADD_DISK. | 118 | HOT_ADD_DISK. |
119 | |||
120 | |||
121 | |||
122 | MD devices in sysfs | ||
123 | ------------------- | ||
124 | md devices appear in sysfs (/sys) as regular block devices, | ||
125 | e.g. | ||
126 | /sys/block/md0 | ||
127 | |||
128 | Each 'md' device will contain a subdirectory called 'md' which | ||
129 | contains further md-specific information about the device. | ||
130 | |||
131 | All md devices contain: | ||
132 | level | ||
133 | a text file indicating the 'raid level'. This may be a standard | ||
134 | numerical level prefixed by "RAID-" - e.g. "RAID-5", or some | ||
135 | other name such as "linear" or "multipath". | ||
136 | If no raid level has been set yet (array is still being | ||
137 | assembled), this file will be empty. | ||
138 | |||
139 | raid_disks | ||
140 | a text file with a simple number indicating the number of devices | ||
141 | in a fully functional array. If this is not yet known, the file | ||
142 | will be empty. If an array is being resized (not currently | ||
143 | possible) this will contain the larger of the old and new sizes. | ||
144 | |||
145 | As component devices are added to an md array, they appear in the 'md' | ||
146 | directory as new directories named | ||
147 | dev-XXX | ||
148 | where XXX is a name that the kernel knows for the device, e.g. hdb1. | ||
149 | Each directory contains: | ||
150 | |||
151 | block | ||
152 | a symlink to the block device in /sys/block, e.g. | ||
153 | /sys/block/md0/md/dev-hdb1/block -> ../../../../block/hdb/hdb1 | ||
154 | |||
155 | super | ||
156 | A file containing an image of the superblock read from, or | ||
157 | written to, that device. | ||
158 | |||
159 | state | ||
160 | A file recording the current state of the device in the array | ||
161 | which can be a comma separated list of | ||
162 | faulty - device has been kicked from active use due to | ||
163 | a detected fault | ||
164 | in_sync - device is a fully in-sync member of the array | ||
165 | spare - device is working, but not a full member. | ||
166 | This includes spares that are in the process | ||
167 | of being recoverred to | ||
168 | This list make grow in future. | ||
169 | |||
170 | |||
171 | An active md device will also contain and entry for each active device | ||
172 | in the array. These are named | ||
173 | |||
174 | rdNN | ||
175 | |||
176 | where 'NN' is the possition in the array, starting from 0. | ||
177 | So for a 3 drive array there will be rd0, rd1, rd2. | ||
178 | These are symbolic links to the appropriate 'dev-XXX' entry. | ||
179 | Thus, for example, | ||
180 | cat /sys/block/md*/md/rd*/state | ||
181 | will show 'in_sync' on every line. | ||
182 | |||
183 | |||
184 | |||
185 | Active md devices for levels that support data redundancy (1,4,5,6) | ||
186 | also have | ||
187 | |||
188 | sync_action | ||
189 | a text file that can be used to monitor and control the rebuild | ||
190 | process. It contains one word which can be one of: | ||
191 | resync - redundancy is being recalculated after unclean | ||
192 | shutdown or creation | ||
193 | recover - a hot spare is being built to replace a | ||
194 | failed/missing device | ||
195 | idle - nothing is happening | ||
196 | check - A full check of redundancy was requested and is | ||
197 | happening. This reads all block and checks | ||
198 | them. A repair may also happen for some raid | ||
199 | levels. | ||
200 | repair - A full check and repair is happening. This is | ||
201 | similar to 'resync', but was requested by the | ||
202 | user, and the write-intent bitmap is NOT used to | ||
203 | optimise the process. | ||
204 | |||
205 | This file is writable, and each of the strings that could be | ||
206 | read are meaningful for writing. | ||
207 | |||
208 | 'idle' will stop an active resync/recovery etc. There is no | ||
209 | guarantee that another resync/recovery may not be automatically | ||
210 | started again, though some event will be needed to trigger | ||
211 | this. | ||
212 | 'resync' or 'recovery' can be used to restart the | ||
213 | corresponding operation if it was stopped with 'idle'. | ||
214 | 'check' and 'repair' will start the appropriate process | ||
215 | providing the current state is 'idle'. | ||
216 | |||
217 | mismatch_count | ||
218 | When performing 'check' and 'repair', and possibly when | ||
219 | performing 'resync', md will count the number of errors that are | ||
220 | found. The count in 'mismatch_cnt' is the number of sectors | ||
221 | that were re-written, or (for 'check') would have been | ||
222 | re-written. As most raid levels work in units of pages rather | ||
223 | than sectors, this my be larger than the number of actual errors | ||
224 | by a factor of the number of sectors in a page. | ||
225 | |||
226 | Each active md device may also have attributes specific to the | ||
227 | personality module that manages it. | ||
228 | These are specific to the implementation of the module and could | ||
229 | change substantially if the implementation changes. | ||
230 | |||
231 | These currently include | ||
232 | |||
233 | stripe_cache_size (currently raid5 only) | ||
234 | number of entries in the stripe cache. This is writable, but | ||
235 | there are upper and lower limits (32768, 16). Default is 128. | ||
236 | strip_cache_active (currently raid5 only) | ||
237 | number of active entries in the stripe cache | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index 023aecd0295e..adf960d8a7c9 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -1727,7 +1727,7 @@ static ssize_t | |||
1727 | level_show(mddev_t *mddev, char *page) | 1727 | level_show(mddev_t *mddev, char *page) |
1728 | { | 1728 | { |
1729 | mdk_personality_t *p = mddev->pers; | 1729 | mdk_personality_t *p = mddev->pers; |
1730 | if (p == NULL) | 1730 | if (p == NULL && mddev->raid_disks == 0) |
1731 | return 0; | 1731 | return 0; |
1732 | if (mddev->level >= 0) | 1732 | if (mddev->level >= 0) |
1733 | return sprintf(page, "RAID-%d\n", mddev->level); | 1733 | return sprintf(page, "RAID-%d\n", mddev->level); |
@@ -1740,6 +1740,8 @@ static struct md_sysfs_entry md_level = __ATTR_RO(level); | |||
1740 | static ssize_t | 1740 | static ssize_t |
1741 | raid_disks_show(mddev_t *mddev, char *page) | 1741 | raid_disks_show(mddev_t *mddev, char *page) |
1742 | { | 1742 | { |
1743 | if (mddev->raid_disks == 0) | ||
1744 | return 0; | ||
1743 | return sprintf(page, "%d\n", mddev->raid_disks); | 1745 | return sprintf(page, "%d\n", mddev->raid_disks); |
1744 | } | 1746 | } |
1745 | 1747 | ||