summaryrefslogtreecommitdiff
path: root/include/crypto
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2025-04-23 12:22:28 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2025-04-28 14:40:54 +0300
commit19da081a28c95fe9b03ce952a2bf4a6f6bf5112c (patch)
tree224f4fc987087caa04437c1c10b26256cb7b245d /include/crypto
parentaf9ce62783dd6acd595491badec08f1235c84739 (diff)
downloadlinux-19da081a28c95fe9b03ce952a2bf4a6f6bf5112c.tar.xz
crypto: api - Add crypto_request_clone and fb
Add a helper to clone crypto requests and eliminate code duplication. Use kmemdup in the helper. Also add an fb field to crypto_tfm. This also happens to fix the existing implementations which were buggy. Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202504230118.1CxUaUoX-lkp@intel.com/ Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202504230004.c7mrY0C6-lkp@intel.com/ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'include/crypto')
-rw-r--r--include/crypto/acompress.h9
-rw-r--r--include/crypto/hash.h9
-rw-r--r--include/crypto/internal/acompress.h7
-rw-r--r--include/crypto/internal/hash.h7
4 files changed, 24 insertions, 8 deletions
diff --git a/include/crypto/acompress.h b/include/crypto/acompress.h
index 1b30290d6380..933c48a4855b 100644
--- a/include/crypto/acompress.h
+++ b/include/crypto/acompress.h
@@ -114,7 +114,6 @@ struct crypto_acomp {
int (*compress)(struct acomp_req *req);
int (*decompress)(struct acomp_req *req);
unsigned int reqsize;
- struct crypto_acomp *fb;
struct crypto_tfm base;
};
@@ -553,7 +552,11 @@ static inline struct acomp_req *acomp_request_on_stack_init(
return req;
}
-struct acomp_req *acomp_request_clone(struct acomp_req *req,
- size_t total, gfp_t gfp);
+static inline struct acomp_req *acomp_request_clone(struct acomp_req *req,
+ size_t total, gfp_t gfp)
+{
+ return container_of(crypto_request_clone(&req->base, total, gfp),
+ struct acomp_req, base);
+}
#endif
diff --git a/include/crypto/hash.h b/include/crypto/hash.h
index 5f87d1040a7c..68813a83443b 100644
--- a/include/crypto/hash.h
+++ b/include/crypto/hash.h
@@ -246,7 +246,6 @@ struct crypto_ahash {
bool using_shash; /* Underlying algorithm is shash, not ahash */
unsigned int statesize;
unsigned int reqsize;
- struct crypto_ahash *fb;
struct crypto_tfm base;
};
@@ -1035,7 +1034,11 @@ static inline struct ahash_request *ahash_request_on_stack_init(
return req;
}
-struct ahash_request *ahash_request_clone(struct ahash_request *req,
- size_t total, gfp_t gfp);
+static inline struct ahash_request *ahash_request_clone(
+ struct ahash_request *req, size_t total, gfp_t gfp)
+{
+ return container_of(crypto_request_clone(&req->base, total, gfp),
+ struct ahash_request, base);
+}
#endif /* _CRYPTO_HASH_H */
diff --git a/include/crypto/internal/acompress.h b/include/crypto/internal/acompress.h
index 7eda32619024..6550dad18e0f 100644
--- a/include/crypto/internal/acompress.h
+++ b/include/crypto/internal/acompress.h
@@ -220,13 +220,18 @@ static inline u32 acomp_request_flags(struct acomp_req *req)
return crypto_request_flags(&req->base) & ~CRYPTO_ACOMP_REQ_PRIVATE;
}
+static inline struct crypto_acomp *crypto_acomp_fb(struct crypto_acomp *tfm)
+{
+ return __crypto_acomp_tfm(crypto_acomp_tfm(tfm)->fb);
+}
+
static inline struct acomp_req *acomp_fbreq_on_stack_init(
char *buf, struct acomp_req *old)
{
struct crypto_acomp *tfm = crypto_acomp_reqtfm(old);
struct acomp_req *req = (void *)buf;
- acomp_request_set_tfm(req, tfm->fb);
+ acomp_request_set_tfm(req, crypto_acomp_fb(tfm));
req->base.flags = CRYPTO_TFM_REQ_ON_STACK;
acomp_request_set_callback(req, acomp_request_flags(old), NULL, NULL);
req->base.flags &= ~CRYPTO_ACOMP_REQ_PRIVATE;
diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h
index 1e80dd084a23..0bc0fefc9b3c 100644
--- a/include/crypto/internal/hash.h
+++ b/include/crypto/internal/hash.h
@@ -272,13 +272,18 @@ static inline bool crypto_ahash_req_chain(struct crypto_ahash *tfm)
return crypto_tfm_req_chain(&tfm->base);
}
+static inline struct crypto_ahash *crypto_ahash_fb(struct crypto_ahash *tfm)
+{
+ return __crypto_ahash_cast(crypto_ahash_tfm(tfm)->fb);
+}
+
static inline struct ahash_request *ahash_fbreq_on_stack_init(
char *buf, struct ahash_request *old)
{
struct crypto_ahash *tfm = crypto_ahash_reqtfm(old);
struct ahash_request *req = (void *)buf;
- ahash_request_set_tfm(req, tfm->fb);
+ ahash_request_set_tfm(req, crypto_ahash_fb(tfm));
req->base.flags = CRYPTO_TFM_REQ_ON_STACK;
ahash_request_set_callback(req, ahash_request_flags(old), NULL, NULL);
req->base.flags &= ~CRYPTO_AHASH_REQ_PRIVATE;