From 2aa3560294ae0d86236064afee8515c2fe5ae2e4 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Wed, 29 Aug 2007 16:31:34 +0800 Subject: [PATCH] --- yaml --- r: 67023 b: refs/heads/master c: 5fa0fea27461f5ff7fad07687618db08272e9502 h: refs/heads/master i: 67021: 010f6cd444a7c5f74199a8af255a4df5bb164d4f 67019: 6a133b5c86310a4d9b493840fbacbdbcc88422d5 67015: 3db42c6f1ba91d45e416303b671d23a4537c57b3 67007: 69f88417c94ec7c849f02d266bf3b5aa3bd2f145 v: v3 --- [refs] | 2 +- trunk/crypto/scatterwalk.c | 22 ++++++++++++++++++++++ trunk/crypto/scatterwalk.h | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 8ec94fd5f9cb..74a20e6a839a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e962a653f3146330d99aefa5adadeaed60bc9bb5 +refs/heads/master: 5fa0fea27461f5ff7fad07687618db08272e9502 diff --git a/trunk/crypto/scatterwalk.c b/trunk/crypto/scatterwalk.c index 81afd1790a1d..e93a8f6f35d4 100644 --- a/trunk/crypto/scatterwalk.c +++ b/trunk/crypto/scatterwalk.c @@ -107,3 +107,25 @@ void scatterwalk_copychunks(void *buf, struct scatter_walk *walk, } } EXPORT_SYMBOL_GPL(scatterwalk_copychunks); + +void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg, + unsigned int start, unsigned int nbytes, int out) +{ + struct scatter_walk walk; + unsigned int offset = 0; + + for (;;) { + scatterwalk_start(&walk, sg); + + if (start < offset + sg->length) + break; + + offset += sg->length; + sg = sg_next(sg); + } + + scatterwalk_advance(&walk, start - offset); + scatterwalk_copychunks(buf, &walk, nbytes, out); + scatterwalk_done(&walk, out, 0); +} +EXPORT_SYMBOL_GPL(scatterwalk_map_and_copy); diff --git a/trunk/crypto/scatterwalk.h b/trunk/crypto/scatterwalk.h index f1592cc2d0f4..500a220ad908 100644 --- a/trunk/crypto/scatterwalk.h +++ b/trunk/crypto/scatterwalk.h @@ -74,4 +74,7 @@ void scatterwalk_copychunks(void *buf, struct scatter_walk *walk, void *scatterwalk_map(struct scatter_walk *walk, int out); void scatterwalk_done(struct scatter_walk *walk, int out, int more); +void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg, + unsigned int start, unsigned int nbytes, int out); + #endif /* _CRYPTO_SCATTERWALK_H */