aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2005-11-09 00:39:45 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-09 10:56:40 -0500
commitbb636547b02411ca5eef87b1d030ea3fc090a717 (patch)
treef6abbad4e7283d5d327646859ad0af1f9ee43aa8
parent7eec314d7512d5281742263cff3853b43df431db (diff)
[PATCH] md: document sysfs usage of md, and make a couple of small refinements
Document in Documentation/md.txt the files that now appear in sysfs, and make a couple of small refinements to exactly when 'level' and 'raid_disks' are empty, to make it match the documentation. Signed-off-by: Neil Brown <neilb@suse.de> Acked-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--Documentation/md.txt119
-rw-r--r--drivers/md/md.c4
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
117Once started with RUN_ARRAY, uninitialized spares can be added with 117Once started with RUN_ARRAY, uninitialized spares can be added with
118HOT_ADD_DISK. 118HOT_ADD_DISK.
119
120
121
122MD devices in sysfs
123-------------------
124md devices appear in sysfs (/sys) as regular block devices,
125e.g.
126 /sys/block/md0
127
128Each 'md' device will contain a subdirectory called 'md' which
129contains further md-specific information about the device.
130
131All 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
145As component devices are added to an md array, they appear in the 'md'
146directory as new directories named
147 dev-XXX
148where XXX is a name that the kernel knows for the device, e.g. hdb1.
149Each 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
171An active md device will also contain and entry for each active device
172in the array. These are named
173
174 rdNN
175
176where 'NN' is the possition in the array, starting from 0.
177So for a 3 drive array there will be rd0, rd1, rd2.
178These are symbolic links to the appropriate 'dev-XXX' entry.
179Thus, for example,
180 cat /sys/block/md*/md/rd*/state
181will show 'in_sync' on every line.
182
183
184
185Active md devices for levels that support data redundancy (1,4,5,6)
186also 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
226Each active md device may also have attributes specific to the
227personality module that manages it.
228These are specific to the implementation of the module and could
229change substantially if the implementation changes.
230
231These 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
1727level_show(mddev_t *mddev, char *page) 1727level_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);
1740static ssize_t 1740static ssize_t
1741raid_disks_show(mddev_t *mddev, char *page) 1741raid_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