• Coly Li's avatar
    lib: add crc64 calculation routines · feba04fd
    Coly Li authored
    Patch series "add crc64 calculation as kernel library", v5.
    
    This patchset adds basic implementation of crc64 calculation as a Linux
    kernel library.  Since bcache already does crc64 by itself, this patchset
    also modifies bcache code to use the new crc64 library routine.
    
    Currently bcache is the only user of crc64 calculation, another potential
    user is bcachefs which is on the way to be in mainline kernel.  Therefore
    it makes sense to make crc64 calculation to be a public library.
    
    bcache uses crc64 as storage checksum, if a change of crc lib routines
    results an inconsistent result, the unmatched checksum may make bcache
    'think' the on-disk is corrupted, such a change should be avoided or
    detected as early as possible.  Therefore a patch is being prepared which
    adds a crc test framework, to check consistency of different calculations.
    
    This patch (of 2):
    
    Add the re-write crc64 calculation routines for Linux kernel.  The CRC64
    polynomical arithmetic follows ECMA-182 specification, inspired by CRC
    paper of Dr.  Ross N.  Williams (see
    http://www.ross.net/crc/download/crc_v3.txt) and other public domain
    implementations.
    
    All the changes work in this way,
    - When Linux kernel is built, host program lib/gen_crc64table.c will be
      compiled to lib/gen_crc64table and executed.
    - The output of gen_crc64table execution is an array called as lookup
      table (a.k.a POLY 0x42f0e1eba9ea369) which contain 256 64-bit long
      numbers, this table is dumped into header file lib/crc64table.h.
    - Then the header file is included by lib/crc64.c for normal 64bit crc
      calculation.
    - Function declaration of the crc64 calculation routines is placed in
      include/linux/crc64.h
    
    Currently bcache is the only user of crc64_be(), another potential user is
    bcachefs which is on the way to be in mainline kernel.  Therefore it makes
    sense to move crc64 calculation into lib/crc64.c as public code.
    
    [colyli@suse.de: fix review comments from v4]
      Link: http://lkml.kernel.org/r/20180726053352.2781-2-colyli@suse.de
    Link: http://lkml.kernel.org/r/20180718165545.1622-2-colyli@suse.deSigned-off-by: default avatarColy Li <colyli@suse.de>
    Co-developed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Michael Lyle <mlyle@lyle.org>
    Cc: Kent Overstreet <kent.overstreet@gmail.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Kate Stewart <kstewart@linuxfoundation.org>
    Cc: Eric Biggers <ebiggers3@gmail.com>
    Cc: Randy Dunlap <rdunlap@infradead.org>
    Cc: Noah Massey <noah.massey@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    feba04fd
gen_crc64table.c 1.45 KB