#include <crypto/scatterwalk.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/scatterlist.h>
static inline void memcpy_dir(void *buf, void *sgdata, size_t nbytes, int out)
void *src = out ? buf : sgdata;
void *dst = out ? sgdata : buf;
memcpy(dst, src, nbytes);
void scatterwalk_copychunks(void *buf, struct scatter_walk *walk,
unsigned int len_this_page = scatterwalk_pagelen(walk);
if (len_this_page > nbytes)
vaddr = scatterwalk_map(walk);
memcpy_dir(buf, vaddr, len_this_page, out);
scatterwalk_unmap(vaddr);
scatterwalk_advance(walk, len_this_page);
if (nbytes == len_this_page)
scatterwalk_pagedone(walk, out & 1, 1);
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;