Commit ac6b53b6 authored by Dan Williams's avatar Dan Williams

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: default avatarAndre Noll <maan@systemlinux.org>
Signed-off-by: default avatarYuri Tikhonov <yur@emcraft.com>
Signed-off-by: default avatarIlya Yanok <yanok@emcraft.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>


parent 4e7d2c0a
...@@ -124,6 +124,8 @@ config MD_RAID456 ...@@ -124,6 +124,8 @@ config MD_RAID456
select MD_RAID6_PQ select MD_RAID6_PQ
select ASYNC_MEMCPY select ASYNC_MEMCPY
select ASYNC_XOR select ASYNC_XOR
select ASYNC_PQ
select ASYNC_RAID6_RECOV
---help--- ---help---
A RAID-5 set of N drives with a capacity of C MB per drive provides A RAID-5 set of N drives with a capacity of C MB per drive provides
the capacity of C * (N - 1) MB, and protects against a failure the capacity of C * (N - 1) MB, and protects against a failure
......
This diff is collapsed.
...@@ -176,7 +176,9 @@ ...@@ -176,7 +176,9 @@
*/ */
enum check_states { enum check_states {
check_state_idle = 0, check_state_idle = 0,
check_state_run, /* parity check */ check_state_run, /* xor parity check */
check_state_run_q, /* q-parity check */
check_state_run_pq, /* pq dual parity check */
check_state_check_result, check_state_check_result,
check_state_compute_run, /* parity repair */ check_state_compute_run, /* parity repair */
check_state_compute_result, check_state_compute_result,
...@@ -216,7 +218,7 @@ struct stripe_head { ...@@ -216,7 +218,7 @@ struct stripe_head {
* @target - STRIPE_OP_COMPUTE_BLK target * @target - STRIPE_OP_COMPUTE_BLK target
*/ */
struct stripe_operations { struct stripe_operations {
int target; int target, target2;
enum sum_check_flags zero_sum_result; enum sum_check_flags zero_sum_result;
} ops; } ops;
struct r5dev { struct r5dev {
...@@ -299,7 +301,7 @@ struct r6_state { ...@@ -299,7 +301,7 @@ struct r6_state {
#define STRIPE_OP_COMPUTE_BLK 1 #define STRIPE_OP_COMPUTE_BLK 1
#define STRIPE_OP_PREXOR 2 #define STRIPE_OP_PREXOR 2
#define STRIPE_OP_BIODRAIN 3 #define STRIPE_OP_BIODRAIN 3
#define STRIPE_OP_POSTXOR 4 #define STRIPE_OP_RECONSTRUCT 4
#define STRIPE_OP_CHECK 5 #define STRIPE_OP_CHECK 5
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment