Commit 131bdcec authored by Herbert Xu's avatar Herbert Xu
Browse files

crypto: scatterwalk - Add memcpy_sglist



Add memcpy_sglist which copies one SG list to another.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 65775cf3
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -86,6 +86,33 @@ void memcpy_to_sglist(struct scatterlist *sg, unsigned int start,
}
EXPORT_SYMBOL_GPL(memcpy_to_sglist);

void memcpy_sglist(struct scatterlist *dst, struct scatterlist *src,
		   unsigned int nbytes)
{
	struct scatter_walk swalk;
	struct scatter_walk dwalk;

	if (unlikely(nbytes == 0)) /* in case sg == NULL */
		return;

	scatterwalk_start(&swalk, src);
	scatterwalk_start(&dwalk, dst);

	do {
		unsigned int slen, dlen;
		unsigned int len;

		slen = scatterwalk_next(&swalk, nbytes);
		dlen = scatterwalk_next(&dwalk, nbytes);
		len = min(slen, dlen);
		memcpy(dwalk.addr, swalk.addr, len);
		scatterwalk_done_dst(&dwalk, len);
		scatterwalk_done_src(&swalk, len);
		nbytes -= len;
	} while (nbytes);
}
EXPORT_SYMBOL_GPL(memcpy_sglist);

struct scatterlist *scatterwalk_ffwd(struct scatterlist dst[2],
				     struct scatterlist *src,
				     unsigned int len)
+3 −0
Original line number Diff line number Diff line
@@ -210,6 +210,9 @@ void memcpy_from_sglist(void *buf, struct scatterlist *sg,
void memcpy_to_sglist(struct scatterlist *sg, unsigned int start,
		      const void *buf, unsigned int nbytes);

void memcpy_sglist(struct scatterlist *dst, struct scatterlist *src,
		   unsigned int nbytes);

/* In new code, please use memcpy_{from,to}_sglist() directly instead. */
static inline void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg,
					    unsigned int start,