xref: /dragonfly/sys/dev/raid/vinum/vinumstate.h (revision 73e0051e)
1 /*-
2  * Copyright (c) 1997, 1998
3  *	Nan Yang Computer Services Limited.  All rights reserved.
4  *
5  *  This software is distributed under the so-called ``Berkeley
6  *  License'':
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *	This product includes software developed by Nan Yang Computer
19  *      Services Limited.
20  * 4. Neither the name of the Company nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * This software is provided ``as is'', and any express or implied
25  * warranties, including, but not limited to, the implied warranties of
26  * merchantability and fitness for a particular purpose are disclaimed.
27  * In no event shall the company or contributors be liable for any
28  * direct, indirect, incidental, special, exemplary, or consequential
29  * damages (including, but not limited to, procurement of substitute
30  * goods or services; loss of use, data, or profits; or business
31  * interruption) however caused and on any theory of liability, whether
32  * in contract, strict liability, or tort (including negligence or
33  * otherwise) arising in any way out of the use of this software, even if
34  * advised of the possibility of such damage.
35  */
36 
37 /*
38  * This file gets read by makestatetext to create text files
39  * with the names of the states, so don't change the file
40  * format
41  */
42 enum volumestate {
43 	/* present but unused.  Must be 0 */
44 	volume_unallocated,
45 
46 	/* mentioned elsewhere but not known to the configuration */
47 	volume_uninit,
48 	volume_down,
49 
50 	/*
51 	 * The volume is up and functional, but not all
52 	 * plexes may be available
53 	 */
54 	volume_up,
55 
56 	/* last value, for table dimensions */
57 	volume_laststate = volume_up
58 };
59 
60 enum plexstate {
61 	/* An empty entry, not a plex at all.   */
62 	plex_unallocated,
63 
64 	/* The plex has been referenced by a volume */
65 	plex_referenced,
66 
67 	/*
68 	 * The plex has been allocated, but there configuration
69 	 * is not complete
70 	 */
71 	plex_init,
72 
73 	/*
74 	 * A plex which has gone completely down because of
75 	 * I/O errors.
76 	 */
77 	plex_faulty,
78 
79 	/*
80 	 * A plex which has been taken down by the
81 	 * administrator.
82 	 */
83 	plex_down,
84 
85 	/* A plex which is being initialized */
86 	plex_initializing,
87 
88 	/*
89 	 * *** The remaining states represent plexes which are
90 	 * at least partially up.  Keep these separate so that
91 	 * they can be checked more easily.
92 	 */
93 
94 	/*
95 	 * A plex entry which is at least partially up.  Not
96 	 * all subdisks are available, and an inconsistency
97 	 * has occurred.  If no other plex is uncorrupted,
98 	 * the volume is no longer consistent.
99 	 */
100 	plex_corrupt,
101 
102 	/* first "up" state */
103 	plex_firstup = plex_corrupt,
104 
105 	/*
106 	 * A RAID-5 plex entry which is accessible, but one
107 	 * subdisk is down, requiring recovery for many
108 	 * I/O requests.
109 	 */
110 	plex_degraded,
111 
112 	/*
113 	 * A plex which is really up, but which has a reborn
114 	 * subdisk which we don't completely trust, and
115 	 * which we don't want to read if we can avoid it
116 	 */
117 	plex_flaky,
118 
119 	/*
120 	 * A plex entry which is completely up.  All subdisks
121 	 * are up.
122 	 */
123 	plex_up,
124 
125 	/* last value, for table dimensions */
126 	plex_laststate = plex_up
127 };
128 
129 /*
130  * subdisk states
131  */
132 enum sdstate {
133 	/* An empty entry, not a subdisk at all. */
134 	sd_unallocated,
135 
136 	/*
137 	 * A subdisk entry which has not been created
138 	 * completely.  Some fields may be empty.
139 	 */
140 	sd_uninit,
141 
142 	/* The subdisk has been referenced by a plex */
143 	sd_referenced,
144 
145 	/*
146 	 * A subdisk entry which has been created completely.
147 	 * All fields are correct, but the disk hasn't
148 	 * been updated.
149 	 */
150 	sd_init,
151 
152 	/*
153 	 * A subdisk entry which has been created completely.
154 	 * All fields are correct, and the disk has been
155 	 * updated, but there is no data on the disk.
156 	 */
157 	sd_empty,
158 
159 	/*
160 	 * A subdisk entry which has been created completely and
161 	 * which is currently being initialized
162 	 */
163 	sd_initializing,
164 
165 	/*
166 	 * A subdisk entry which has been initialized,
167 	 * but which can't come up because it would
168 	 * cause inconsistencies.
169 	 */
170 	sd_initialized,
171 
172 	/* *** The following states represent invalid data */
173 	/*
174 	 * A subdisk entry which has been created completely.
175 	 * All fields are correct, the config on disk has been
176 	 * updated, and the data was valid, but since then the
177 	 * drive has been taken down, and as a result updates
178 	 * have been missed.
179 	 */
180 	sd_obsolete,
181 
182 	/*
183 	 * A subdisk entry which has been created completely.
184 	 * All fields are correct, the disk has been updated,
185 	 * and the data was valid, but since then the drive
186 	 * has been crashed and updates have been lost.
187 	 */
188 	sd_stale,
189 
190 	/* *** The following states represent valid, inaccessible data */
191 
192 	/*
193 	 * A subdisk entry which has been created completely.
194 	 * All fields are correct, the disk has been updated,
195 	 * and the data was valid, but since then the drive
196 	 * has gone down.   No attempt has been made to write
197 	 * to the subdisk since the crash, so the data is valid.
198 	 */
199 	sd_crashed,
200 
201 	/*
202 	 * A subdisk entry which was up, which contained
203 	 * valid data, and which was taken down by the
204 	 * administrator.  The data is valid.
205 	 */
206 	sd_down,
207 
208 	/*
209 	 * *** This is invalid data (the subdisk previously had
210 	 * a numerically lower state), but it is currently in the
211 	 * process of being revived.  We can write but not read.
212 	 */
213 	sd_reviving,
214 
215 	/*
216 	 * *** The following states represent accessible subdisks
217 	 * with valid data
218 	 */
219 
220 	/*
221 	 * A subdisk entry which has been created completely.
222 	 * All fields are correct, the disk has been updated,
223 	 * and the data was valid, but since then the drive
224 	 * has gone down and up again.  No updates were lost,
225 	 * but it is possible that the subdisk has been
226 	 * damaged.  We won't read from this subdisk if we
227 	 * have a choice.  If this is the only subdisk which
228 	 * covers this address space in the plex, we set its
229 	 * state to sd_up under these circumstances, so this
230 	 * status implies that there is another subdisk to
231 	 * fulfil the request.
232 	 */
233 	sd_reborn,
234 
235 	/*
236 	 * A subdisk entry which has been created completely.
237 	 * All fields are correct, the disk has been updated,
238 	 * and the data is valid.
239 	 */
240 	sd_up,
241 
242 	/* last value, for table dimensions */
243 	sd_laststate = sd_up
244 };
245 
246 enum drivestate {
247 	/* present but unused.  Must be 0 */
248 	drive_unallocated,
249 
250 	/* just mentioned in some other config entry */
251 	drive_referenced,
252 
253 	/* not accessible */
254 	drive_down,
255 
256 	/* up and running */
257 	drive_up,
258 
259 	/* last value, for table dimensions */
260 	drive_laststate = drive_up
261 };
262 
263