]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
raid6: improve the public interface
authorChristoph Hellwig <hch@lst.de>
Mon, 18 May 2026 05:17:50 +0000 (07:17 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 29 May 2026 04:24:54 +0000 (21:24 -0700)
Stop directly calling into function pointers from users of the RAID6 PQ
API, and provide exported functions with proper documentation and API
guarantees asserts where applicable instead.

Link: https://lore.kernel.org/20260518051804.462141-8-hch@lst.de
Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Tested-by: Ard Biesheuvel <ardb@kernel.org> # kunit only on arm64
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Alexandre Ghiti <alex@ghiti.fr>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: "Borislav Petkov (AMD)" <bp@alien8.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Chris Mason <clm@fb.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: David Sterba <dsterba@suse.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Li Nan <linan122@huawei.com>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Song Liu <song@kernel.org>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: WANG Xuerui <kernel@xen0n.name>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
15 files changed:
Documentation/crypto/async-tx-api.rst
crypto/async_tx/async_pq.c
crypto/async_tx/async_raid6_recov.c
drivers/md/raid5.c
fs/btrfs/raid56.c
include/linux/raid/pq.h
lib/raid/raid6/algos.c
lib/raid/raid6/arm/recov_neon.c
lib/raid/raid6/loongarch/recov_loongarch_simd.c
lib/raid/raid6/recov.c
lib/raid/raid6/riscv/recov_rvv.c
lib/raid/raid6/s390/recov_s390xc.c
lib/raid/raid6/x86/recov_avx2.c
lib/raid/raid6/x86/recov_avx512.c
lib/raid/raid6/x86/recov_ssse3.c

index f88a7809385e25fed7eda51a56530905c1653a5b..49fcfc66314ac4ff4d5b6f2487e486d2f0bdf1af 100644 (file)
@@ -82,9 +82,9 @@ xor_val   xor a series of source buffers and set a flag if the
 pq       generate the p+q (raid6 syndrome) from a series of source buffers
 pq_val    validate that a p and or q buffer are in sync with a given series of
          sources
-datap    (raid6_datap_recov) recover a raid6 data block and the p block
+datap    (raid6_recov_datap) recover a raid6 data block and the p block
          from the given sources
-2data    (raid6_2data_recov) recover 2 raid6 data blocks from the given
+2data    (raid6_recov_2data) recover 2 raid6 data blocks from the given
          sources
 ========  ====================================================================
 
index 0ce6f07b4e0dec9eeeeaea96f84af2a5a32330ad..f3574f80d1dfe0ac5246537599a55727398db6cf 100644 (file)
@@ -131,11 +131,11 @@ do_sync_gen_syndrome(struct page **blocks, unsigned int *offsets, int disks,
                }
        }
        if (submit->flags & ASYNC_TX_PQ_XOR_DST) {
-               BUG_ON(!raid6_call.xor_syndrome);
+               BUG_ON(!raid6_can_xor_syndrome());
                if (start >= 0)
-                       raid6_call.xor_syndrome(disks, start, stop, len, srcs);
+                       raid6_xor_syndrome(disks, start, stop, len, srcs);
        } else
-               raid6_call.gen_syndrome(disks, len, srcs);
+               raid6_gen_syndrome(disks, len, srcs);
        async_tx_sync_epilog(submit);
 }
 
index f2dc6af6e6a70f335bc23d49d72ba8cd3a07828b..305ea1421a3ee5d056dbf463129f96d1d08c054f 100644 (file)
@@ -418,7 +418,7 @@ async_raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
                        else
                                ptrs[i] = page_address(blocks[i]) + offs[i];
 
-               raid6_2data_recov(disks, bytes, faila, failb, ptrs);
+               raid6_recov_2data(disks, bytes, faila, failb, ptrs);
 
                async_tx_sync_epilog(submit);
 
@@ -501,7 +501,7 @@ async_raid6_datap_recov(int disks, size_t bytes, int faila,
                        else
                                ptrs[i] = page_address(blocks[i]) + offs[i];
 
-               raid6_datap_recov(disks, bytes, faila, ptrs);
+               raid6_recov_datap(disks, bytes, faila, ptrs);
 
                async_tx_sync_epilog(submit);
 
index 0d76e82f4506e694ae57fff88a7d632356df762f..ebcb193176702bd0bf80a716762c3f86b07ff26a 100644 (file)
@@ -6955,7 +6955,7 @@ raid5_store_rmw_level(struct mddev  *mddev, const char *page, size_t len)
        if (kstrtoul(page, 10, &new))
                return -EINVAL;
 
-       if (new != PARITY_DISABLE_RMW && !raid6_call.xor_syndrome)
+       if (new != PARITY_DISABLE_RMW && !raid6_can_xor_syndrome())
                return -EINVAL;
 
        if (new != PARITY_DISABLE_RMW &&
@@ -7646,7 +7646,7 @@ static struct r5conf *setup_conf(struct mddev *mddev)
        conf->level = mddev->new_level;
        if (conf->level == 6) {
                conf->max_degraded = 2;
-               if (raid6_call.xor_syndrome)
+               if (raid6_can_xor_syndrome())
                        conf->rmw_level = PARITY_ENABLE_RMW;
                else
                        conf->rmw_level = PARITY_DISABLE_RMW;
index 08ee8f316d96d2f69336152956b18d434c65ef34..dabc9522e8814d1647ab3165b4ccb50602124388 100644 (file)
@@ -1410,7 +1410,7 @@ static void generate_pq_vertical_step(struct btrfs_raid_bio *rbio, unsigned int
                                rbio_qstripe_paddr(rbio, sector_nr, step_nr));
 
                assert_rbio(rbio);
-               raid6_call.gen_syndrome(rbio->real_stripes, step, pointers);
+               raid6_gen_syndrome(rbio->real_stripes, step, pointers);
        } else {
                /* raid5 */
                memcpy(pointers[rbio->nr_data], pointers[0], step);
@@ -1987,10 +1987,10 @@ static void recover_vertical_step(struct btrfs_raid_bio *rbio,
                }
 
                if (failb == rbio->real_stripes - 2) {
-                       raid6_datap_recov(rbio->real_stripes, step,
+                       raid6_recov_datap(rbio->real_stripes, step,
                                          faila, pointers);
                } else {
-                       raid6_2data_recov(rbio->real_stripes, step,
+                       raid6_recov_2data(rbio->real_stripes, step,
                                          faila, failb, pointers);
                }
        } else {
@@ -2644,7 +2644,7 @@ static bool verify_one_parity_step(struct btrfs_raid_bio *rbio,
        if (has_qstripe) {
                assert_rbio(rbio);
                /* RAID6, call the library function to fill in our P/Q. */
-               raid6_call.gen_syndrome(rbio->real_stripes, step, pointers);
+               raid6_gen_syndrome(rbio->real_stripes, step, pointers);
        } else {
                /* RAID5. */
                memcpy(pointers[nr_data], pointers[0], step);
index f27a866c287f54e85c68462c332acf6f7090b7a5..425a227591c004a2cb4ecaf13a372e44a82fd858 100644 (file)
 #include <linux/blkdev.h>
 #include <linux/mm.h>
 
+void raid6_gen_syndrome(int disks, size_t bytes, void **ptrs);
+void raid6_xor_syndrome(int disks, int start, int stop, size_t bytes,
+               void **ptrs);
+bool raid6_can_xor_syndrome(void);
+
+void raid6_recov_2data(int disks, size_t bytes, int faila, int failb,
+               void **ptrs);
+void raid6_recov_datap(int disks, size_t bytes, int faila,
+               void **ptrs);
+
 /* Routine choices */
 struct raid6_calls {
        void (*gen_syndrome)(int, size_t, void **);
@@ -20,9 +30,6 @@ struct raid6_calls {
        int priority;           /* Relative priority ranking if non-zero */
 };
 
-/* Selected algorithm */
-extern struct raid6_calls raid6_call;
-
 /* Various routine sets */
 extern const struct raid6_calls raid6_intx1;
 extern const struct raid6_calls raid6_intx2;
@@ -92,10 +99,4 @@ extern const u8 raid6_gflog[256]      __attribute__((aligned(256)));
 extern const u8 raid6_gfinv[256]      __attribute__((aligned(256)));
 extern const u8 raid6_gfexi[256]      __attribute__((aligned(256)));
 
-/* Recovery routines */
-extern void (*raid6_2data_recov)(int disks, size_t bytes, int faila, int failb,
-                      void **ptrs);
-extern void (*raid6_datap_recov)(int disks, size_t bytes, int faila,
-                       void **ptrs);
-
 #endif /* LINUX_RAID_RAID6_H */
index 985c60bb00a41a7df9ecae20666ca684248e1ad9..b0ba31f6d48e1cfbb522b3958cd686d6dd43e6ed 100644 (file)
 #include <linux/gfp.h>
 #include <kunit/visibility.h>
 
-struct raid6_calls raid6_call;
-EXPORT_SYMBOL_GPL(raid6_call);
+static const struct raid6_recov_calls *raid6_recov_algo;
+
+/* Selected algorithm */
+static struct raid6_calls raid6_call;
+
+/**
+ * raid6_gen_syndrome - generate RAID6 P/Q parity
+ * @disks:     number of "disks" to operate on including parity
+ * @bytes:     length in bytes of each vector
+ * @ptrs:      @disks size array of memory pointers
+ *
+ * Generate @bytes worth of RAID6 P and Q parity in @ptrs[@disks - 2] and
+ * @ptrs[@disks - 1] respectively from the memory pointed to by @ptrs[0] to
+ * @ptrs[@disks - 3].
+ *
+ * @disks must be at least 4, and the memory pointed to by each member of @ptrs
+ * must be at least 64-byte aligned.  @bytes must be non-zero and a multiple of
+ * 512.
+ *
+ * See https://kernel.org/pub/linux/kernel/people/hpa/raid6.pdf for underlying
+ * algorithm.
+ */
+void raid6_gen_syndrome(int disks, size_t bytes, void **ptrs)
+{
+       WARN_ON_ONCE(!in_task() || irqs_disabled() || softirq_count());
+       WARN_ON_ONCE(bytes & 511);
+
+       raid6_call.gen_syndrome(disks, bytes, ptrs);
+}
+EXPORT_SYMBOL_GPL(raid6_gen_syndrome);
+
+/**
+ * raid6_xor_syndrome - update RAID6 P/Q parity
+ * @disks:     number of "disks" to operate on including parity
+ * @start:     first index into @disk to update
+ * @stop:      last index into @disk to update
+ * @bytes:     length in bytes of each vector
+ * @ptrs:      @disks size array of memory pointers
+ *
+ * Update @bytes worth of RAID6 P and Q parity in @ptrs[@disks - 2] and
+ * @ptrs[@disks - 1] respectively for the memory pointed to by
+ * @ptrs[@start..@stop].
+ *
+ * This is used to update parity in place using the following sequence:
+ *
+ * 1) call raid6_xor_syndrome(disk, start, stop, ...) for the existing data.
+ * 2) update the the data in @ptrs[@start..@stop].
+ * 3) call raid6_xor_syndrome(disk, start, stop, ...) for the new data.
+ *
+ * Data between @start and @stop that is not changed should be filled
+ * with a pointer to the kernel zero page.
+ *
+ * @disks must be at least 4, and the memory pointed to by each member of @ptrs
+ * must be at least 64-byte aligned.  @bytes must be non-zero and a multiple of
+ * 512.  @stop must be larger or equal to @start.
+ */
+void raid6_xor_syndrome(int disks, int start, int stop, size_t bytes,
+               void **ptrs)
+{
+       WARN_ON_ONCE(!in_task() || irqs_disabled() || softirq_count());
+       WARN_ON_ONCE(bytes & 511);
+       WARN_ON_ONCE(stop < start);
+
+       raid6_call.xor_syndrome(disks, start, stop, bytes, ptrs);
+}
+EXPORT_SYMBOL_GPL(raid6_xor_syndrome);
+
+/*
+ * raid6_can_xor_syndrome - check if raid6_xor_syndrome() can be used
+ *
+ * Returns %true if raid6_can_xor_syndrome() can be used, else %false.
+ */
+bool raid6_can_xor_syndrome(void)
+{
+       return !!raid6_call.xor_syndrome;
+}
+EXPORT_SYMBOL_GPL(raid6_can_xor_syndrome);
 
 const struct raid6_calls * const raid6_algos[] = {
 #if defined(__i386__) && !defined(__arch_um__)
@@ -84,11 +159,58 @@ const struct raid6_calls * const raid6_algos[] = {
 };
 EXPORT_SYMBOL_IF_KUNIT(raid6_algos);
 
-void (*raid6_2data_recov)(int, size_t, int, int, void **);
-EXPORT_SYMBOL_GPL(raid6_2data_recov);
+/**
+ * raid6_recov_2data - recover two missing data disks
+ * @disks:     number of "disks" to operate on including parity
+ * @bytes:     length in bytes of each vector
+ * @faila:     first failed data disk index
+ * @failb:     second failed data disk index
+ * @ptrs:      @disks size array of memory pointers
+ *
+ * Rebuild @bytes of missing data in @ptrs[@faila] and @ptrs[@failb] from the
+ * data in the remaining disks and the two parities pointed to by the other
+ * indices between 0 and @disks - 1 in @ptrs.  @disks includes the data disks
+ * and the two parities.  @faila must be smaller than @failb.
+ *
+ * Memory pointed to by each pointer in @ptrs must be page aligned and is
+ * limited to %PAGE_SIZE.
+ */
+void raid6_recov_2data(int disks, size_t bytes, int faila, int failb,
+               void **ptrs)
+{
+       WARN_ON_ONCE(!in_task() || irqs_disabled() || softirq_count());
+       WARN_ON_ONCE(bytes & 511);
+       WARN_ON_ONCE(bytes > PAGE_SIZE);
+       WARN_ON_ONCE(failb <= faila);
+
+       raid6_recov_algo->data2(disks, bytes, faila, failb, ptrs);
+}
+EXPORT_SYMBOL_GPL(raid6_recov_2data);
+
+/**
+ * raid6_recov_datap - recover a missing data disk and missing P-parity
+ * @disks:     number of "disks" to operate on including parity
+ * @bytes:     length in bytes of each vector
+ * @faila:     failed data disk index
+ * @ptrs:      @disks size array of memory pointers
+ *
+ * Rebuild @bytes of missing data in @ptrs[@faila] and the missing P-parity in
+ * @ptrs[@disks - 2] from the data in the remaining disks and the Q-parity
+ * pointed to by the other indices between 0 and @disks - 1 in @ptrs.  @disks
+ * includes the data disks and the two parities.
+ *
+ * Memory pointed to by each pointer in @ptrs must be page aligned and is
+ * limited to %PAGE_SIZE.
+ */
+void raid6_recov_datap(int disks, size_t bytes, int faila, void **ptrs)
+{
+       WARN_ON_ONCE(!in_task() || irqs_disabled() || softirq_count());
+       WARN_ON_ONCE(bytes & 511);
+       WARN_ON_ONCE(bytes > PAGE_SIZE);
 
-void (*raid6_datap_recov)(int, size_t, int, void **);
-EXPORT_SYMBOL_GPL(raid6_datap_recov);
+       raid6_recov_algo->datap(disks, bytes, faila, ptrs);
+}
+EXPORT_SYMBOL_GPL(raid6_recov_datap);
 
 const struct raid6_recov_calls *const raid6_recov_algos[] = {
 #ifdef CONFIG_X86
@@ -133,8 +255,7 @@ static inline const struct raid6_recov_calls *raid6_choose_recov(void)
                                best = *algo;
 
        if (best) {
-               raid6_2data_recov = best->data2;
-               raid6_datap_recov = best->datap;
+               raid6_recov_algo = best;
 
                pr_info("raid6: using %s recovery algorithm\n", best->name);
        } else
index 9993bda5d3a6bcbc31ba9662c2fb30d08595d1b9..4eb0efb44750cbb628d6e1cd3a0c4bd960328ab1 100644 (file)
@@ -35,7 +35,7 @@ static void raid6_2data_recov_neon(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks - 1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]     = dp;
@@ -69,7 +69,7 @@ static void raid6_datap_recov_neon(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks - 1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]     = dq;
index 4d45632096471d938deaf0e67671d2f0f9fcd7cf..7d4d349322b39c1750fc171b8821f4baf376504a 100644 (file)
@@ -49,7 +49,7 @@ static void raid6_2data_recov_lsx(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks - 1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila] = dp;
@@ -201,7 +201,7 @@ static void raid6_datap_recov_lsx(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks - 1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila] = dq;
@@ -323,7 +323,7 @@ static void raid6_2data_recov_lasx(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks - 1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila] = dp;
@@ -440,7 +440,7 @@ static void raid6_datap_recov_lasx(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks - 1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila] = dq;
index 211e1df289633cc59c1fbc9986d3131e9473da82..cc7e4dc1eaa66fc2a422d6c2bc48544f68a1b35d 100644 (file)
@@ -37,7 +37,7 @@ static void raid6_2data_recov_intx1(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dp;
@@ -75,7 +75,7 @@ static void raid6_datap_recov_intx1(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dq;
index f77d9c4306875a640d79071f086555d4f0c5925e..3ff39826e33f2770cc074d27cdbdc18299cec125 100644 (file)
@@ -164,7 +164,7 @@ static void raid6_2data_recov_rvv(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks - 1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]     = dp;
@@ -199,7 +199,7 @@ static void raid6_datap_recov_rvv(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks - 1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]     = dq;
index 0f32217b71233f7287c8462e50307ec6f19b244c..2bc4c85174de7bce07d80f1cbc97354da93dd38b 100644 (file)
@@ -40,7 +40,7 @@ static void raid6_2data_recov_s390xc(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dp;
@@ -84,7 +84,7 @@ static void raid6_datap_recov_s390xc(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dq;
index 325310c81e1c33bcf174e557a5cd10f8fc1b0e4e..bef82a38d8ebdfbe6eac58beb80091360bca2d6b 100644 (file)
@@ -34,7 +34,7 @@ static void raid6_2data_recov_avx2(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dp;
@@ -199,7 +199,7 @@ static void raid6_datap_recov_avx2(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dq;
index 08de77fcb8bd7097c6f4bf2db8f60dd5ad68ba38..06c70e771eaab218403ed6ae3b6e086159a2dd9d 100644 (file)
@@ -43,7 +43,7 @@ static void raid6_2data_recov_avx512(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dp;
@@ -241,7 +241,7 @@ static void raid6_datap_recov_avx512(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dq;
index 002bef1e0847ad78c843af923341349ca98ef327..5ca7d56f23d8ef9ad8a1abd67f9340101d8b7a7d 100644 (file)
@@ -36,7 +36,7 @@ static void raid6_2data_recov_ssse3(int disks, size_t bytes, int faila,
        ptrs[failb] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dp;
@@ -206,7 +206,7 @@ static void raid6_datap_recov_ssse3(int disks, size_t bytes, int faila,
        ptrs[faila] = page_address(ZERO_PAGE(0));
        ptrs[disks-1] = dq;
 
-       raid6_call.gen_syndrome(disks, bytes, ptrs);
+       raid6_gen_syndrome(disks, bytes, ptrs);
 
        /* Restore pointer table */
        ptrs[faila]   = dq;