md/raid6: let async recovery function support different page offset
[sfrench/cifs-2.6.git] / crypto / async_tx / raid6test.c
index 14e73dcd74759d915da1b6f0fe6f89dd5ceaf79e..66db82e5a3b13675f95b0f3283e8b0a415980ca3 100644 (file)
@@ -18,6 +18,7 @@
 #define NDISKS 64 /* Including P and Q */
 
 static struct page *dataptrs[NDISKS];
+unsigned int dataoffs[NDISKS];
 static addr_conv_t addr_conv[NDISKS];
 static struct page *data[NDISKS+3];
 static struct page *spare;
@@ -38,6 +39,7 @@ static void makedata(int disks)
        for (i = 0; i < disks; i++) {
                prandom_bytes(page_address(data[i]), PAGE_SIZE);
                dataptrs[i] = data[i];
+               dataoffs[i] = 0;
        }
 }
 
@@ -52,7 +54,8 @@ static char disk_type(int d, int disks)
 }
 
 /* Recover two failed blocks. */
-static void raid6_dual_recov(int disks, size_t bytes, int faila, int failb, struct page **ptrs)
+static void raid6_dual_recov(int disks, size_t bytes, int faila, int failb,
+               struct page **ptrs, unsigned int *offs)
 {
        struct async_submit_ctl submit;
        struct completion cmp;
@@ -66,7 +69,8 @@ static void raid6_dual_recov(int disks, size_t bytes, int faila, int failb, stru
                if (faila == disks-2) {
                        /* P+Q failure.  Just rebuild the syndrome. */
                        init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv);
-                       tx = async_gen_syndrome(ptrs, 0, disks, bytes, &submit);
+                       tx = async_gen_syndrome(ptrs, offs,
+                                       disks, bytes, &submit);
                } else {
                        struct page *blocks[NDISKS];
                        struct page *dest;
@@ -89,22 +93,26 @@ static void raid6_dual_recov(int disks, size_t bytes, int faila, int failb, stru
                        tx = async_xor(dest, blocks, 0, count, bytes, &submit);
 
                        init_async_submit(&submit, 0, tx, NULL, NULL, addr_conv);
-                       tx = async_gen_syndrome(ptrs, 0, disks, bytes, &submit);
+                       tx = async_gen_syndrome(ptrs, offs,
+                                       disks, bytes, &submit);
                }
        } else {
                if (failb == disks-2) {
                        /* data+P failure. */
                        init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv);
-                       tx = async_raid6_datap_recov(disks, bytes, faila, ptrs, &submit);
+                       tx = async_raid6_datap_recov(disks, bytes,
+                                       faila, ptrs, offs, &submit);
                } else {
                        /* data+data failure. */
                        init_async_submit(&submit, 0, NULL, NULL, NULL, addr_conv);
-                       tx = async_raid6_2data_recov(disks, bytes, faila, failb, ptrs, &submit);
+                       tx = async_raid6_2data_recov(disks, bytes,
+                                       faila, failb, ptrs, offs, &submit);
                }
        }
        init_completion(&cmp);
        init_async_submit(&submit, ASYNC_TX_ACK, tx, callback, &cmp, addr_conv);
-       tx = async_syndrome_val(ptrs, 0, disks, bytes, &result, spare, &submit);
+       tx = async_syndrome_val(ptrs, offs,
+                       disks, bytes, &result, spare, 0, &submit);
        async_tx_issue_pending(tx);
 
        if (wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)) == 0)
@@ -126,7 +134,7 @@ static int test_disks(int i, int j, int disks)
        dataptrs[i] = recovi;
        dataptrs[j] = recovj;
 
-       raid6_dual_recov(disks, PAGE_SIZE, i, j, dataptrs);
+       raid6_dual_recov(disks, PAGE_SIZE, i, j, dataptrs, dataoffs);
 
        erra = memcmp(page_address(data[i]), page_address(recovi), PAGE_SIZE);
        errb = memcmp(page_address(data[j]), page_address(recovj), PAGE_SIZE);
@@ -162,7 +170,7 @@ static int test(int disks, int *tests)
        /* Generate assumed good syndrome */
        init_completion(&cmp);
        init_async_submit(&submit, ASYNC_TX_ACK, NULL, callback, &cmp, addr_conv);
-       tx = async_gen_syndrome(dataptrs, 0, disks, PAGE_SIZE, &submit);
+       tx = async_gen_syndrome(dataptrs, dataoffs, disks, PAGE_SIZE, &submit);
        async_tx_issue_pending(tx);
 
        if (wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)) == 0) {