Commit b2ab4a57 authored by Herbert Xu's avatar Herbert Xu

[CRYPTO] scatterwalk: Restore custom sg chaining for now

Unfortunately the generic chaining hasn't been ported to all architectures
yet, and notably not s390.  So this patch restores the chainging that we've
been using previously which does work everywhere.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 42c271c6
...@@ -75,7 +75,7 @@ static int update2(struct hash_desc *desc, ...@@ -75,7 +75,7 @@ static int update2(struct hash_desc *desc,
if (!nbytes) if (!nbytes)
break; break;
sg = sg_next(sg); sg = scatterwalk_sg_next(sg);
} }
return 0; return 0;
......
...@@ -100,7 +100,7 @@ static void crypto_gcm_ghash_update_sg(struct crypto_gcm_ghash_ctx *ctx, ...@@ -100,7 +100,7 @@ static void crypto_gcm_ghash_update_sg(struct crypto_gcm_ghash_ctx *ctx,
n = scatterwalk_clamp(&walk, len); n = scatterwalk_clamp(&walk, len);
if (!n) { if (!n) {
scatterwalk_start(&walk, sg_next(walk.sg)); scatterwalk_start(&walk, scatterwalk_sg_next(walk.sg));
n = scatterwalk_clamp(&walk, len); n = scatterwalk_clamp(&walk, len);
} }
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
*/ */
#include <crypto/algapi.h> #include <crypto/algapi.h>
#include <crypto/scatterwalk.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -160,7 +161,7 @@ static int hmac_digest(struct hash_desc *pdesc, struct scatterlist *sg, ...@@ -160,7 +161,7 @@ static int hmac_digest(struct hash_desc *pdesc, struct scatterlist *sg,
sg_init_table(sg1, 2); sg_init_table(sg1, 2);
sg_set_buf(sg1, ipad, bs); sg_set_buf(sg1, ipad, bs);
sg_chain(sg1, 2, sg); scatterwalk_sg_chain(sg1, 2, sg);
sg_init_table(sg2, 1); sg_init_table(sg2, 1);
sg_set_buf(sg2, opad, bs + ds); sg_set_buf(sg2, opad, bs + ds);
......
...@@ -61,7 +61,7 @@ static void scatterwalk_pagedone(struct scatter_walk *walk, int out, ...@@ -61,7 +61,7 @@ static void scatterwalk_pagedone(struct scatter_walk *walk, int out,
walk->offset += PAGE_SIZE - 1; walk->offset += PAGE_SIZE - 1;
walk->offset &= PAGE_MASK; walk->offset &= PAGE_MASK;
if (walk->offset >= walk->sg->offset + walk->sg->length) if (walk->offset >= walk->sg->offset + walk->sg->length)
scatterwalk_start(walk, sg_next(walk->sg)); scatterwalk_start(walk, scatterwalk_sg_next(walk->sg));
} }
} }
...@@ -112,7 +112,7 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg, ...@@ -112,7 +112,7 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg,
break; break;
offset += sg->length; offset += sg->length;
sg = sg_next(sg); sg = scatterwalk_sg_next(sg);
} }
scatterwalk_advance(&walk, start - offset); scatterwalk_advance(&walk, start - offset);
......
...@@ -52,6 +52,17 @@ static inline void crypto_yield(u32 flags) ...@@ -52,6 +52,17 @@ static inline void crypto_yield(u32 flags)
cond_resched(); cond_resched();
} }
static inline void scatterwalk_sg_chain(struct scatterlist *sg1, int num,
struct scatterlist *sg2)
{
sg_set_page(&sg1[num - 1], (void *)sg2, 0, 0);
}
static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg)
{
return (++sg)->length ? sg : (void *)sg_page(sg);
}
static inline unsigned long scatterwalk_samebuf(struct scatter_walk *walk_in, static inline unsigned long scatterwalk_samebuf(struct scatter_walk *walk_in,
struct scatter_walk *walk_out) struct scatter_walk *walk_out)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment