aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid5.h
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2009-07-14 16:40:19 -0400
committerDan Williams <dan.j.williams@intel.com>2009-08-29 22:13:12 -0400
commitac6b53b6e6acab27e4f3e2383f9ac1f0d7c6200b (patch)
treee9c67502fd32a9eea4902ea382e51eecb09f2a54 /drivers/md/raid5.h
parent4e7d2c0aefb77f7b24942e5af042a083be4d60bb (diff)
md/raid6: asynchronous raid6 operations
[ Based on an original patch by Yuri Tikhonov ] The raid_run_ops routine uses the asynchronous offload api and the stripe_operations member of a stripe_head to carry out xor+pq+copy operations asynchronously, outside the lock. The operations performed by RAID-6 are the same as in the RAID-5 case except for no support of STRIPE_OP_PREXOR operations. All the others are supported: STRIPE_OP_BIOFILL - copy data into request buffers to satisfy a read request STRIPE_OP_COMPUTE_BLK - generate missing blocks (1 or 2) in the cache from the other blocks STRIPE_OP_BIODRAIN - copy data out of request buffers to satisfy a write request STRIPE_OP_RECONSTRUCT - recalculate parity for new data that has entered the cache STRIPE_OP_CHECK - verify that the parity is correct The flow is the same as in the RAID-5 case, and reuses some routines, namely: 1/ ops_complete_postxor (renamed to ops_complete_reconstruct) 2/ ops_complete_compute (updated to set up to 2 targets uptodate) 3/ ops_run_check (renamed to ops_run_check_p for xor parity checks) [neilb@suse.de: fixes to get it to pass mdadm regression suite] Reviewed-by: Andre Noll <maan@systemlinux.org> Signed-off-by: Yuri Tikhonov <yur@emcraft.com> Signed-off-by: Ilya Yanok <yanok@emcraft.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/md/raid5.h')
-rw-r--r--drivers/md/raid5.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h
index 75f2c6c4cf90..116d0b44b2a9 100644
--- a/drivers/md/raid5.h
+++ b/drivers/md/raid5.h
@@ -176,7 +176,9 @@
176 */ 176 */
177enum check_states { 177enum check_states {
178 check_state_idle = 0, 178 check_state_idle = 0,
179 check_state_run, /* parity check */ 179 check_state_run, /* xor parity check */
180 check_state_run_q, /* q-parity check */
181 check_state_run_pq, /* pq dual parity check */
180 check_state_check_result, 182 check_state_check_result,
181 check_state_compute_run, /* parity repair */ 183 check_state_compute_run, /* parity repair */
182 check_state_compute_result, 184 check_state_compute_result,
@@ -216,7 +218,7 @@ struct stripe_head {
216 * @target - STRIPE_OP_COMPUTE_BLK target 218 * @target - STRIPE_OP_COMPUTE_BLK target
217 */ 219 */
218 struct stripe_operations { 220 struct stripe_operations {
219 int target; 221 int target, target2;
220 enum sum_check_flags zero_sum_result; 222 enum sum_check_flags zero_sum_result;
221 } ops; 223 } ops;
222 struct r5dev { 224 struct r5dev {
@@ -299,7 +301,7 @@ struct r6_state {
299#define STRIPE_OP_COMPUTE_BLK 1 301#define STRIPE_OP_COMPUTE_BLK 1
300#define STRIPE_OP_PREXOR 2 302#define STRIPE_OP_PREXOR 2
301#define STRIPE_OP_BIODRAIN 3 303#define STRIPE_OP_BIODRAIN 3
302#define STRIPE_OP_POSTXOR 4 304#define STRIPE_OP_RECONSTRUCT 4
303#define STRIPE_OP_CHECK 5 305#define STRIPE_OP_CHECK 5
304 306
305/* 307/*