diff options
author | Dan Williams <dan.j.williams@intel.com> | 2009-07-14 16:40:19 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2009-08-29 22:13:12 -0400 |
commit | ac6b53b6e6acab27e4f3e2383f9ac1f0d7c6200b (patch) | |
tree | e9c67502fd32a9eea4902ea382e51eecb09f2a54 /drivers/md/raid5.h | |
parent | 4e7d2c0aefb77f7b24942e5af042a083be4d60bb (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.h | 8 |
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 | */ |
177 | enum check_states { | 177 | enum 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 | /* |