Commit 10081fb5 authored by Akinobu Mita's avatar Akinobu Mita Committed by Nicholas Bellinger

lib: introduce crc_t10dif_update()

This introduces crc_t10dif_update() which enables to calculate CRC
for a block which straddles multiple SG elements by calling multiple
times.  This also converts crc_t10dif() to use crc_t10dif_update() as
they are almost same.

(remove extra function call in crc_t10dif() and crc_t10dif_update -
 Tim + Herbert)
Signed-off-by: default avatarAkinobu Mita <>
Acked-by: default avatarMartin K. Petersen <>
Cc: Tim Chen <>
Cc: Herbert Xu <>
Cc: "David S. Miller" <>
Cc: Nicholas Bellinger <>
Cc: Sagi Grimberg <>
Cc: "Martin K. Petersen" <>
Cc: Christoph Hellwig <>
Cc: "James E.J. Bottomley" <>
Signed-off-by: default avatarNicholas Bellinger <>
parent 5835812f
......@@ -9,5 +9,6 @@
extern __u16 crc_t10dif_generic(__u16 crc, const unsigned char *buffer,
size_t len);
extern __u16 crc_t10dif(unsigned char const *, size_t);
extern __u16 crc_t10dif_update(__u16 crc, unsigned char const *, size_t);
......@@ -19,7 +19,7 @@
static struct crypto_shash *crct10dif_tfm;
static struct static_key crct10dif_fallback __read_mostly;
__u16 crc_t10dif(const unsigned char *buffer, size_t len)
__u16 crc_t10dif_update(__u16 crc, const unsigned char *buffer, size_t len)
struct {
struct shash_desc shash;
......@@ -28,17 +28,23 @@ __u16 crc_t10dif(const unsigned char *buffer, size_t len)
int err;
if (static_key_false(&crct10dif_fallback))
return crc_t10dif_generic(0, buffer, len);
return crc_t10dif_generic(crc, buffer, len);
desc.shash.tfm = crct10dif_tfm;
desc.shash.flags = 0;
*(__u16 *)desc.ctx = 0;
*(__u16 *)desc.ctx = crc;
err = crypto_shash_update(&desc.shash, buffer, len);
return *(__u16 *)desc.ctx;
__u16 crc_t10dif(const unsigned char *buffer, size_t len)
return crc_t10dif_update(0, buffer, len);
static int __init crc_t10dif_mod_init(void)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment