diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-02-08 15:25:18 -0800 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-02-08 15:25:18 -0800 |
commit | 9783e1df7a6bd1e4dc5e2cafcdc29b65a47473d6 (patch) | |
tree | 9216a285bfe23aa799ca6efa01a3f4063d798e64 /crypto/digest.c | |
parent | 4387ff75f29412a234d394b0276c2b239d3d3844 (diff) | |
parent | dc2e2f33bbf07344995357314fd8887f6564dba7 (diff) | |
download | linux-9783e1df7a6bd1e4dc5e2cafcdc29b65a47473d6.tar.bz2 |
Merge branch 'HEAD' of master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6
Conflicts:
crypto/Kconfig
Diffstat (limited to 'crypto/digest.c')
-rw-r--r-- | crypto/digest.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/crypto/digest.c b/crypto/digest.c index 8f4593268ce0..1bf7414aeb9e 100644 --- a/crypto/digest.c +++ b/crypto/digest.c @@ -14,7 +14,9 @@ #include <linux/mm.h> #include <linux/errno.h> +#include <linux/hardirq.h> #include <linux/highmem.h> +#include <linux/kernel.h> #include <linux/module.h> #include <linux/scatterlist.h> @@ -29,8 +31,8 @@ static int init(struct hash_desc *desc) return 0; } -static int update(struct hash_desc *desc, - struct scatterlist *sg, unsigned int nbytes) +static int update2(struct hash_desc *desc, + struct scatterlist *sg, unsigned int nbytes) { struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); unsigned int alignmask = crypto_tfm_alg_alignmask(tfm); @@ -81,6 +83,14 @@ static int update(struct hash_desc *desc, return 0; } +static int update(struct hash_desc *desc, + struct scatterlist *sg, unsigned int nbytes) +{ + if (WARN_ON_ONCE(in_irq())) + return -EDEADLK; + return update2(desc, sg, nbytes); +} + static int final(struct hash_desc *desc, u8 *out) { struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); @@ -118,16 +128,14 @@ static int setkey(struct crypto_hash *hash, const u8 *key, unsigned int keylen) static int digest(struct hash_desc *desc, struct scatterlist *sg, unsigned int nbytes, u8 *out) { + if (WARN_ON_ONCE(in_irq())) + return -EDEADLK; + init(desc); - update(desc, sg, nbytes); + update2(desc, sg, nbytes); return final(desc, out); } -int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags) -{ - return flags ? -EINVAL : 0; -} - int crypto_init_digest_ops(struct crypto_tfm *tfm) { struct hash_tfm *ops = &tfm->crt_hash; |