mirror of
https://github.com/torvalds/linux.git
synced 2025-04-12 06:49:52 +00:00
crypto: scatterwalk - add new functions for skipping data
Add scatterwalk_skip() to skip the given number of bytes in a scatter_walk. Previously support for skipping was provided through scatterwalk_copychunks(..., 2) followed by scatterwalk_done(), which was confusing and less efficient. Also add scatterwalk_start_at_pos() which starts a scatter_walk at the given position, equivalent to scatterwalk_start() + scatterwalk_skip(). This addresses another common need in a more streamlined way. Later patches will convert various users to use these functions. Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
3bd4b2c603
commit
e21d01a2a3
@ -15,6 +15,21 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/scatterlist.h>
|
||||
|
||||
void scatterwalk_skip(struct scatter_walk *walk, unsigned int nbytes)
|
||||
{
|
||||
struct scatterlist *sg = walk->sg;
|
||||
|
||||
nbytes += walk->offset - sg->offset;
|
||||
|
||||
while (nbytes > sg->length) {
|
||||
nbytes -= sg->length;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
walk->sg = sg;
|
||||
walk->offset = sg->offset + nbytes;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(scatterwalk_skip);
|
||||
|
||||
static inline void memcpy_dir(void *buf, void *sgdata, size_t nbytes, int out)
|
||||
{
|
||||
void *src = out ? buf : sgdata;
|
||||
|
@ -33,6 +33,22 @@ static inline void scatterwalk_start(struct scatter_walk *walk,
|
||||
walk->offset = sg->offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is equivalent to scatterwalk_start(walk, sg) followed by
|
||||
* scatterwalk_skip(walk, pos).
|
||||
*/
|
||||
static inline void scatterwalk_start_at_pos(struct scatter_walk *walk,
|
||||
struct scatterlist *sg,
|
||||
unsigned int pos)
|
||||
{
|
||||
while (pos > sg->length) {
|
||||
pos -= sg->length;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
walk->sg = sg;
|
||||
walk->offset = sg->offset + pos;
|
||||
}
|
||||
|
||||
static inline unsigned int scatterwalk_pagelen(struct scatter_walk *walk)
|
||||
{
|
||||
unsigned int len = walk->sg->offset + walk->sg->length - walk->offset;
|
||||
@ -92,6 +108,8 @@ static inline void scatterwalk_done(struct scatter_walk *walk, int out,
|
||||
scatterwalk_pagedone(walk, out, more);
|
||||
}
|
||||
|
||||
void scatterwalk_skip(struct scatter_walk *walk, unsigned int nbytes);
|
||||
|
||||
void scatterwalk_copychunks(void *buf, struct scatter_walk *walk,
|
||||
size_t nbytes, int out);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user