diff options
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r-- | drivers/md/raid5.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 0a5f03d93aef..1898eda60722 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -810,7 +810,7 @@ ops_run_compute6_2(struct stripe_head *sh, struct raid5_percpu *percpu) | |||
810 | BUG_ON(!test_bit(R5_Wantcompute, &tgt->flags)); | 810 | BUG_ON(!test_bit(R5_Wantcompute, &tgt->flags)); |
811 | BUG_ON(!test_bit(R5_Wantcompute, &tgt2->flags)); | 811 | BUG_ON(!test_bit(R5_Wantcompute, &tgt2->flags)); |
812 | 812 | ||
813 | /* we need to open-code set_syndrome_sources to handle to the | 813 | /* we need to open-code set_syndrome_sources to handle the |
814 | * slot number conversion for 'faila' and 'failb' | 814 | * slot number conversion for 'faila' and 'failb' |
815 | */ | 815 | */ |
816 | for (i = 0; i < disks ; i++) | 816 | for (i = 0; i < disks ; i++) |
@@ -879,18 +879,21 @@ ops_run_compute6_2(struct stripe_head *sh, struct raid5_percpu *percpu) | |||
879 | return async_gen_syndrome(blocks, 0, count+2, | 879 | return async_gen_syndrome(blocks, 0, count+2, |
880 | STRIPE_SIZE, &submit); | 880 | STRIPE_SIZE, &submit); |
881 | } | 881 | } |
882 | } | ||
883 | |||
884 | init_async_submit(&submit, ASYNC_TX_FENCE, NULL, ops_complete_compute, | ||
885 | sh, to_addr_conv(sh, percpu)); | ||
886 | if (failb == syndrome_disks) { | ||
887 | /* We're missing D+P. */ | ||
888 | return async_raid6_datap_recov(syndrome_disks+2, STRIPE_SIZE, | ||
889 | faila, blocks, &submit); | ||
890 | } else { | 882 | } else { |
891 | /* We're missing D+D. */ | 883 | init_async_submit(&submit, ASYNC_TX_FENCE, NULL, |
892 | return async_raid6_2data_recov(syndrome_disks+2, STRIPE_SIZE, | 884 | ops_complete_compute, sh, |
893 | faila, failb, blocks, &submit); | 885 | to_addr_conv(sh, percpu)); |
886 | if (failb == syndrome_disks) { | ||
887 | /* We're missing D+P. */ | ||
888 | return async_raid6_datap_recov(syndrome_disks+2, | ||
889 | STRIPE_SIZE, faila, | ||
890 | blocks, &submit); | ||
891 | } else { | ||
892 | /* We're missing D+D. */ | ||
893 | return async_raid6_2data_recov(syndrome_disks+2, | ||
894 | STRIPE_SIZE, faila, failb, | ||
895 | blocks, &submit); | ||
896 | } | ||
894 | } | 897 | } |
895 | } | 898 | } |
896 | 899 | ||