Messages in this thread Patch in this message | | | Date | Sat, 26 Mar 2005 15:44:22 +1100 | Subject | Re: [RFC] CryptoAPI & Compression | From | Herbert Xu <> |
| |
Hi Artem:
On Fri, Mar 25, 2005 at 04:08:20PM +0000, Artem B. Bityuckiy wrote: > > I'm working on cleaning-up the JFFS3 compression stuff. JFFS3 contains a > number of compressors which actually shouldn't be there as they are > platform-independent and generic. So we want to move them to the generic > part of the Linux kernel instead of storing them in fs/jffs2/. And we > were going to use CryptoAPI to access the compressors.
Sounds good. > In JFFS2 we need something more flexible. Te following is what we want: > > int crypto_compress_ext(struct crypto_tfm *tfm, > const u8 *src, unsigned int *slen, > u8 *dst, unsigned int *dlen);
Compressing part of the input could be significantly different from compressing all of the input depending on the algorithm. In particular it could be most costly to do so and/or result in worse compression.
So while I'm happy to add such an interface I think we should keep crypto_comp_compress as well for full compression.
I've whipped up something quick and called it crypto_comp_pcompress. How does this interface look to you?
Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ===== crypto/compress.c 1.7 vs edited ===== --- 1.7/crypto/compress.c 2003-03-29 22:16:58 +11:00 +++ edited/crypto/compress.c 2005-03-26 15:33:19 +11:00 @@ -18,6 +18,17 @@ #include <linux/string.h> #include "internal.h" +static int crypto_pcompress(struct crypto_tfm *tfm, + const u8 *src, unsigned int *slen, + u8 *dst, unsigned int *dlen) +{ + if (!tfm->__crt_alg->cra_compress.coa_pcompress) + return -ENOSYS; + return tfm->__crt_alg->cra_compress.coa_pcompress(crypto_tfm_ctx(tfm), + src, slen, dst, + dlen); +} + static int crypto_compress(struct crypto_tfm *tfm, const u8 *src, unsigned int slen, u8 *dst, unsigned int *dlen) @@ -50,6 +61,7 @@ if (ret) goto out; + ops->cot_pcompress = crypto_pcompress; ops->cot_compress = crypto_compress; ops->cot_decompress = crypto_decompress; ===== include/linux/crypto.h 1.32 vs edited ===== --- 1.32/include/linux/crypto.h 2005-01-26 16:53:19 +11:00 +++ edited/include/linux/crypto.h 2005-03-26 15:25:39 +11:00 @@ -87,6 +87,8 @@ struct compress_alg { int (*coa_init)(void *ctx); void (*coa_exit)(void *ctx); + int (*coa_pcompress)(void *ctx, const u8 *src, unsigned int *slen, + u8 *dst, unsigned int *dlen); int (*coa_compress)(void *ctx, const u8 *src, unsigned int slen, u8 *dst, unsigned int *dlen); int (*coa_decompress)(void *ctx, const u8 *src, unsigned int slen, @@ -178,6 +180,9 @@ }; struct compress_tfm { + int (*cot_pcompress)(struct crypto_tfm *tfm, + const u8 *src, unsigned int *slen, + u8 *dst, unsigned int *dlen); int (*cot_compress)(struct crypto_tfm *tfm, const u8 *src, unsigned int slen, u8 *dst, unsigned int *dlen); @@ -363,6 +368,14 @@ { BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); memcpy(dst, tfm->crt_cipher.cit_iv, len); +} + +static inline int crypto_comp_pcompress(struct crypto_tfm *tfm, + const u8 *src, unsigned int *slen, + u8 *dst, unsigned int *dlen) +{ + BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS); + return tfm->crt_compress.cot_pcompress(tfm, src, slen, dst, dlen); } static inline int crypto_comp_compress(struct crypto_tfm *tfm, | |