X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=crypto%2Fscatterwalk.c;h=3de89a424401c1918818145a3d27df627c99f7ef;hb=9919c7619c52d01e89103bca405cc3d4a2b1ac31;hp=e93a8f6f35d48b32f76815c0a9b6676ccbd65775;hpb=5fa0fea27461f5ff7fad07687618db08272e9502;p=safe%2Fjmp%2Flinux-2.6 diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c index e93a8f6..3de89a4 100644 --- a/crypto/scatterwalk.c +++ b/crypto/scatterwalk.c @@ -13,6 +13,8 @@ * any later version. * */ + +#include #include #include #include @@ -20,17 +22,6 @@ #include #include -#include "internal.h" -#include "scatterwalk.h" - -enum km_type crypto_km_types[] = { - KM_USER0, - KM_USER1, - KM_SOFTIRQ0, - KM_SOFTIRQ1, -}; -EXPORT_SYMBOL_GPL(crypto_km_types); - static inline void memcpy_dir(void *buf, void *sgdata, size_t nbytes, int out) { void *src = out ? buf : sgdata; @@ -62,15 +53,16 @@ static void scatterwalk_pagedone(struct scatter_walk *walk, int out, if (out) { struct page *page; - page = walk->sg->page + ((walk->offset - 1) >> PAGE_SHIFT); - flush_dcache_page(page); + page = sg_page(walk->sg) + ((walk->offset - 1) >> PAGE_SHIFT); + if (!PageSlab(page)) + flush_dcache_page(page); } if (more) { walk->offset += PAGE_SIZE - 1; walk->offset &= PAGE_MASK; if (walk->offset >= walk->sg->offset + walk->sg->length) - scatterwalk_start(walk, sg_next(walk->sg)); + scatterwalk_start(walk, scatterwalk_sg_next(walk->sg)); } } @@ -114,6 +106,9 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg, struct scatter_walk walk; unsigned int offset = 0; + if (!nbytes) + return; + for (;;) { scatterwalk_start(&walk, sg); @@ -121,7 +116,7 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg, break; offset += sg->length; - sg = sg_next(sg); + sg = scatterwalk_sg_next(sg); } scatterwalk_advance(&walk, start - offset);