X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=crypto%2Fscatterwalk.c;h=3de89a424401c1918818145a3d27df627c99f7ef;hb=99d27e1c59e34869605de625b033c52163f5bfa7;hp=206c39a97e57d3f3d50d0bf8e72eeb4b929d98c6;hpb=468577abe37ff7b453a9ac613e0ea155349203ae;p=safe%2Fjmp%2Flinux-2.6 diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c index 206c39a..3de89a4 100644 --- a/crypto/scatterwalk.c +++ b/crypto/scatterwalk.c @@ -13,6 +13,8 @@ * any later version. * */ + +#include #include #include #include @@ -20,9 +22,6 @@ #include #include -#include "internal.h" -#include "scatterwalk.h" - static inline void memcpy_dir(void *buf, void *sgdata, size_t nbytes, int out) { void *src = out ? buf : sgdata; @@ -55,14 +54,15 @@ static void scatterwalk_pagedone(struct scatter_walk *walk, int out, struct page *page; page = sg_page(walk->sg) + ((walk->offset - 1) >> PAGE_SHIFT); - flush_dcache_page(page); + 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)); } } @@ -106,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); @@ -113,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);