diff options
Diffstat (limited to 'drivers/md/raid5.h')
-rw-r--r-- | drivers/md/raid5.h | 99 |
1 files changed, 51 insertions, 48 deletions
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index 3ca77a2613b..11b9566184b 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h | |||
@@ -6,11 +6,11 @@ | |||
6 | 6 | ||
7 | /* | 7 | /* |
8 | * | 8 | * |
9 | * Each stripe contains one buffer per disc. Each buffer can be in | 9 | * Each stripe contains one buffer per device. Each buffer can be in |
10 | * one of a number of states stored in "flags". Changes between | 10 | * one of a number of states stored in "flags". Changes between |
11 | * these states happen *almost* exclusively under a per-stripe | 11 | * these states happen *almost* exclusively under the protection of the |
12 | * spinlock. Some very specific changes can happen in bi_end_io, and | 12 | * STRIPE_ACTIVE flag. Some very specific changes can happen in bi_end_io, and |
13 | * these are not protected by the spin lock. | 13 | * these are not protected by STRIPE_ACTIVE. |
14 | * | 14 | * |
15 | * The flag bits that are used to represent these states are: | 15 | * The flag bits that are used to represent these states are: |
16 | * R5_UPTODATE and R5_LOCKED | 16 | * R5_UPTODATE and R5_LOCKED |
@@ -76,12 +76,10 @@ | |||
76 | * block and the cached buffer are successfully written, any buffer on | 76 | * block and the cached buffer are successfully written, any buffer on |
77 | * a written list can be returned with b_end_io. | 77 | * a written list can be returned with b_end_io. |
78 | * | 78 | * |
79 | * The write list and read list both act as fifos. The read list is | 79 | * The write list and read list both act as fifos. The read list, |
80 | * protected by the device_lock. The write and written lists are | 80 | * write list and written list are protected by the device_lock. |
81 | * protected by the stripe lock. The device_lock, which can be | 81 | * The device_lock is only for list manipulations and will only be |
82 | * claimed while the stipe lock is held, is only for list | 82 | * held for a very short time. It can be claimed from interrupts. |
83 | * manipulations and will only be held for a very short time. It can | ||
84 | * be claimed from interrupts. | ||
85 | * | 83 | * |
86 | * | 84 | * |
87 | * Stripes in the stripe cache can be on one of two lists (or on | 85 | * Stripes in the stripe cache can be on one of two lists (or on |
@@ -96,7 +94,6 @@ | |||
96 | * | 94 | * |
97 | * The inactive_list, handle_list and hash bucket lists are all protected by the | 95 | * The inactive_list, handle_list and hash bucket lists are all protected by the |
98 | * device_lock. | 96 | * device_lock. |
99 | * - stripes on the inactive_list never have their stripe_lock held. | ||
100 | * - stripes have a reference counter. If count==0, they are on a list. | 97 | * - stripes have a reference counter. If count==0, they are on a list. |
101 | * - If a stripe might need handling, STRIPE_HANDLE is set. | 98 | * - If a stripe might need handling, STRIPE_HANDLE is set. |
102 | * - When refcount reaches zero, then if STRIPE_HANDLE it is put on | 99 | * - When refcount reaches zero, then if STRIPE_HANDLE it is put on |
@@ -116,10 +113,10 @@ | |||
116 | * attach a request to an active stripe (add_stripe_bh()) | 113 | * attach a request to an active stripe (add_stripe_bh()) |
117 | * lockdev attach-buffer unlockdev | 114 | * lockdev attach-buffer unlockdev |
118 | * handle a stripe (handle_stripe()) | 115 | * handle a stripe (handle_stripe()) |
119 | * lockstripe clrSTRIPE_HANDLE ... | 116 | * setSTRIPE_ACTIVE, clrSTRIPE_HANDLE ... |
120 | * (lockdev check-buffers unlockdev) .. | 117 | * (lockdev check-buffers unlockdev) .. |
121 | * change-state .. | 118 | * change-state .. |
122 | * record io/ops needed unlockstripe schedule io/ops | 119 | * record io/ops needed clearSTRIPE_ACTIVE schedule io/ops |
123 | * release an active stripe (release_stripe()) | 120 | * release an active stripe (release_stripe()) |
124 | * lockdev if (!--cnt) { if STRIPE_HANDLE, add to handle_list else add to inactive-list } unlockdev | 121 | * lockdev if (!--cnt) { if STRIPE_HANDLE, add to handle_list else add to inactive-list } unlockdev |
125 | * | 122 | * |
@@ -128,8 +125,7 @@ | |||
128 | * on a cached buffer, and plus one if the stripe is undergoing stripe | 125 | * on a cached buffer, and plus one if the stripe is undergoing stripe |
129 | * operations. | 126 | * operations. |
130 | * | 127 | * |
131 | * Stripe operations are performed outside the stripe lock, | 128 | * The stripe operations are: |
132 | * the stripe operations are: | ||
133 | * -copying data between the stripe cache and user application buffers | 129 | * -copying data between the stripe cache and user application buffers |
134 | * -computing blocks to save a disk access, or to recover a missing block | 130 | * -computing blocks to save a disk access, or to recover a missing block |
135 | * -updating the parity on a write operation (reconstruct write and | 131 | * -updating the parity on a write operation (reconstruct write and |
@@ -159,7 +155,8 @@ | |||
159 | */ | 155 | */ |
160 | 156 | ||
161 | /* | 157 | /* |
162 | * Operations state - intermediate states that are visible outside of sh->lock | 158 | * Operations state - intermediate states that are visible outside of |
159 | * STRIPE_ACTIVE. | ||
163 | * In general _idle indicates nothing is running, _run indicates a data | 160 | * In general _idle indicates nothing is running, _run indicates a data |
164 | * processing operation is active, and _result means the data processing result | 161 | * processing operation is active, and _result means the data processing result |
165 | * is stable and can be acted upon. For simple operations like biofill and | 162 | * is stable and can be acted upon. For simple operations like biofill and |
@@ -209,7 +206,6 @@ struct stripe_head { | |||
209 | short ddf_layout;/* use DDF ordering to calculate Q */ | 206 | short ddf_layout;/* use DDF ordering to calculate Q */ |
210 | unsigned long state; /* state flags */ | 207 | unsigned long state; /* state flags */ |
211 | atomic_t count; /* nr of active thread/requests */ | 208 | atomic_t count; /* nr of active thread/requests */ |
212 | spinlock_t lock; | ||
213 | int bm_seq; /* sequence number for bitmap flushes */ | 209 | int bm_seq; /* sequence number for bitmap flushes */ |
214 | int disks; /* disks in stripe */ | 210 | int disks; /* disks in stripe */ |
215 | enum check_states check_state; | 211 | enum check_states check_state; |
@@ -240,19 +236,20 @@ struct stripe_head { | |||
240 | }; | 236 | }; |
241 | 237 | ||
242 | /* stripe_head_state - collects and tracks the dynamic state of a stripe_head | 238 | /* stripe_head_state - collects and tracks the dynamic state of a stripe_head |
243 | * for handle_stripe. It is only valid under spin_lock(sh->lock); | 239 | * for handle_stripe. |
244 | */ | 240 | */ |
245 | struct stripe_head_state { | 241 | struct stripe_head_state { |
246 | int syncing, expanding, expanded; | 242 | int syncing, expanding, expanded; |
247 | int locked, uptodate, to_read, to_write, failed, written; | 243 | int locked, uptodate, to_read, to_write, failed, written; |
248 | int to_fill, compute, req_compute, non_overwrite; | 244 | int to_fill, compute, req_compute, non_overwrite; |
249 | int failed_num; | 245 | int failed_num[2]; |
246 | int p_failed, q_failed; | ||
247 | int dec_preread_active; | ||
250 | unsigned long ops_request; | 248 | unsigned long ops_request; |
251 | }; | ||
252 | 249 | ||
253 | /* r6_state - extra state data only relevant to r6 */ | 250 | struct bio *return_bi; |
254 | struct r6_state { | 251 | mdk_rdev_t *blocked_rdev; |
255 | int p_failed, q_failed, failed_num[2]; | 252 | int handle_bad_blocks; |
256 | }; | 253 | }; |
257 | 254 | ||
258 | /* Flags */ | 255 | /* Flags */ |
@@ -268,14 +265,16 @@ struct r6_state { | |||
268 | #define R5_ReWrite 9 /* have tried to over-write the readerror */ | 265 | #define R5_ReWrite 9 /* have tried to over-write the readerror */ |
269 | 266 | ||
270 | #define R5_Expanded 10 /* This block now has post-expand data */ | 267 | #define R5_Expanded 10 /* This block now has post-expand data */ |
271 | #define R5_Wantcompute 11 /* compute_block in progress treat as | 268 | #define R5_Wantcompute 11 /* compute_block in progress treat as |
272 | * uptodate | 269 | * uptodate |
273 | */ | 270 | */ |
274 | #define R5_Wantfill 12 /* dev->toread contains a bio that needs | 271 | #define R5_Wantfill 12 /* dev->toread contains a bio that needs |
275 | * filling | 272 | * filling |
276 | */ | 273 | */ |
277 | #define R5_Wantdrain 13 /* dev->towrite needs to be drained */ | 274 | #define R5_Wantdrain 13 /* dev->towrite needs to be drained */ |
278 | #define R5_WantFUA 14 /* Write should be FUA */ | 275 | #define R5_WantFUA 14 /* Write should be FUA */ |
276 | #define R5_WriteError 15 /* got a write error - need to record it */ | ||
277 | #define R5_MadeGood 16 /* A bad block has been fixed by writing to it*/ | ||
279 | /* | 278 | /* |
280 | * Write method | 279 | * Write method |
281 | */ | 280 | */ |
@@ -289,21 +288,25 @@ struct r6_state { | |||
289 | /* | 288 | /* |
290 | * Stripe state | 289 | * Stripe state |
291 | */ | 290 | */ |
292 | #define STRIPE_HANDLE 2 | 291 | enum { |
293 | #define STRIPE_SYNCING 3 | 292 | STRIPE_ACTIVE, |
294 | #define STRIPE_INSYNC 4 | 293 | STRIPE_HANDLE, |
295 | #define STRIPE_PREREAD_ACTIVE 5 | 294 | STRIPE_SYNC_REQUESTED, |
296 | #define STRIPE_DELAYED 6 | 295 | STRIPE_SYNCING, |
297 | #define STRIPE_DEGRADED 7 | 296 | STRIPE_INSYNC, |
298 | #define STRIPE_BIT_DELAY 8 | 297 | STRIPE_PREREAD_ACTIVE, |
299 | #define STRIPE_EXPANDING 9 | 298 | STRIPE_DELAYED, |
300 | #define STRIPE_EXPAND_SOURCE 10 | 299 | STRIPE_DEGRADED, |
301 | #define STRIPE_EXPAND_READY 11 | 300 | STRIPE_BIT_DELAY, |
302 | #define STRIPE_IO_STARTED 12 /* do not count towards 'bypass_count' */ | 301 | STRIPE_EXPANDING, |
303 | #define STRIPE_FULL_WRITE 13 /* all blocks are set to be overwritten */ | 302 | STRIPE_EXPAND_SOURCE, |
304 | #define STRIPE_BIOFILL_RUN 14 | 303 | STRIPE_EXPAND_READY, |
305 | #define STRIPE_COMPUTE_RUN 15 | 304 | STRIPE_IO_STARTED, /* do not count towards 'bypass_count' */ |
306 | #define STRIPE_OPS_REQ_PENDING 16 | 305 | STRIPE_FULL_WRITE, /* all blocks are set to be overwritten */ |
306 | STRIPE_BIOFILL_RUN, | ||
307 | STRIPE_COMPUTE_RUN, | ||
308 | STRIPE_OPS_REQ_PENDING, | ||
309 | }; | ||
307 | 310 | ||
308 | /* | 311 | /* |
309 | * Operation request flags | 312 | * Operation request flags |
@@ -336,7 +339,7 @@ struct r6_state { | |||
336 | * PREREAD_ACTIVE. | 339 | * PREREAD_ACTIVE. |
337 | * In stripe_handle, if we find pre-reading is necessary, we do it if | 340 | * In stripe_handle, if we find pre-reading is necessary, we do it if |
338 | * PREREAD_ACTIVE is set, else we set DELAYED which will send it to the delayed queue. | 341 | * PREREAD_ACTIVE is set, else we set DELAYED which will send it to the delayed queue. |
339 | * HANDLE gets cleared if stripe_handle leave nothing locked. | 342 | * HANDLE gets cleared if stripe_handle leaves nothing locked. |
340 | */ | 343 | */ |
341 | 344 | ||
342 | 345 | ||
@@ -399,7 +402,7 @@ struct raid5_private_data { | |||
399 | * (fresh device added). | 402 | * (fresh device added). |
400 | * Cleared when a sync completes. | 403 | * Cleared when a sync completes. |
401 | */ | 404 | */ |
402 | 405 | int recovery_disabled; | |
403 | /* per cpu variables */ | 406 | /* per cpu variables */ |
404 | struct raid5_percpu { | 407 | struct raid5_percpu { |
405 | struct page *spare_page; /* Used when checking P/Q in raid6 */ | 408 | struct page *spare_page; /* Used when checking P/Q in raid6 */ |