aboutsummaryrefslogtreecommitdiffstats
path: root/lib/crc-t10dif.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2013-09-12 01:31:34 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2013-09-12 01:31:34 -0400
commit26052f9b9bb8de4f6a57165b0a803de9c26138bd (patch)
tree4a22e3a8ae9dde1f1cc14eaad48eae8ad542f86a /lib/crc-t10dif.c
parent77dbd7a95e4a4f15264c333a9e9ab97ee27dc2aa (diff)
crypto: crct10dif - Add fallback for broken initrds
Unfortunately, even with a softdep some distros fail to include the necessary modules in the initrd. Therefore this patch adds a fallback path to restore existing behaviour where we cannot load the new crypto crct10dif algorithm. In order to do this, the underlying crct10dif has been split out from the crypto implementation so that it can be used on the fallback path. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'lib/crc-t10dif.c')
-rw-r--r--lib/crc-t10dif.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/crc-t10dif.c b/lib/crc-t10dif.c
index 43bc5b071f96..dfe6ec17c0a5 100644
--- a/lib/crc-t10dif.c
+++ b/lib/crc-t10dif.c
@@ -14,8 +14,10 @@
14#include <linux/err.h> 14#include <linux/err.h>
15#include <linux/init.h> 15#include <linux/init.h>
16#include <crypto/hash.h> 16#include <crypto/hash.h>
17#include <linux/static_key.h>
17 18
18static struct crypto_shash *crct10dif_tfm; 19static struct crypto_shash *crct10dif_tfm;
20static struct static_key crct10dif_fallback __read_mostly;
19 21
20__u16 crc_t10dif(const unsigned char *buffer, size_t len) 22__u16 crc_t10dif(const unsigned char *buffer, size_t len)
21{ 23{
@@ -25,6 +27,9 @@ __u16 crc_t10dif(const unsigned char *buffer, size_t len)
25 } desc; 27 } desc;
26 int err; 28 int err;
27 29
30 if (static_key_false(&crct10dif_fallback))
31 return crc_t10dif_generic(0, buffer, len);
32
28 desc.shash.tfm = crct10dif_tfm; 33 desc.shash.tfm = crct10dif_tfm;
29 desc.shash.flags = 0; 34 desc.shash.flags = 0;
30 *(__u16 *)desc.ctx = 0; 35 *(__u16 *)desc.ctx = 0;
@@ -39,7 +44,11 @@ EXPORT_SYMBOL(crc_t10dif);
39static int __init crc_t10dif_mod_init(void) 44static int __init crc_t10dif_mod_init(void)
40{ 45{
41 crct10dif_tfm = crypto_alloc_shash("crct10dif", 0, 0); 46 crct10dif_tfm = crypto_alloc_shash("crct10dif", 0, 0);
42 return PTR_RET(crct10dif_tfm); 47 if (IS_ERR(crct10dif_tfm)) {
48 static_key_slow_inc(&crct10dif_fallback);
49 crct10dif_tfm = NULL;
50 }
51 return 0;
43} 52}
44 53
45static void __exit crc_t10dif_mod_fini(void) 54static void __exit crc_t10dif_mod_fini(void)