diff options
Diffstat (limited to 'net/sunrpc/xdr.c')
-rw-r--r-- | net/sunrpc/xdr.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 995c3fdc16c2..79a55d56cc98 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c | |||
@@ -244,7 +244,7 @@ _copy_to_pages(struct page **pages, size_t pgbase, const char *p, size_t len) | |||
244 | pgto = pages + (pgbase >> PAGE_CACHE_SHIFT); | 244 | pgto = pages + (pgbase >> PAGE_CACHE_SHIFT); |
245 | pgbase &= ~PAGE_CACHE_MASK; | 245 | pgbase &= ~PAGE_CACHE_MASK; |
246 | 246 | ||
247 | do { | 247 | for (;;) { |
248 | copy = PAGE_CACHE_SIZE - pgbase; | 248 | copy = PAGE_CACHE_SIZE - pgbase; |
249 | if (copy > len) | 249 | if (copy > len) |
250 | copy = len; | 250 | copy = len; |
@@ -253,6 +253,10 @@ _copy_to_pages(struct page **pages, size_t pgbase, const char *p, size_t len) | |||
253 | memcpy(vto + pgbase, p, copy); | 253 | memcpy(vto + pgbase, p, copy); |
254 | kunmap_atomic(vto, KM_USER0); | 254 | kunmap_atomic(vto, KM_USER0); |
255 | 255 | ||
256 | len -= copy; | ||
257 | if (len == 0) | ||
258 | break; | ||
259 | |||
256 | pgbase += copy; | 260 | pgbase += copy; |
257 | if (pgbase == PAGE_CACHE_SIZE) { | 261 | if (pgbase == PAGE_CACHE_SIZE) { |
258 | flush_dcache_page(*pgto); | 262 | flush_dcache_page(*pgto); |
@@ -260,8 +264,7 @@ _copy_to_pages(struct page **pages, size_t pgbase, const char *p, size_t len) | |||
260 | pgto++; | 264 | pgto++; |
261 | } | 265 | } |
262 | p += copy; | 266 | p += copy; |
263 | 267 | } | |
264 | } while ((len -= copy) != 0); | ||
265 | flush_dcache_page(*pgto); | 268 | flush_dcache_page(*pgto); |
266 | } | 269 | } |
267 | 270 | ||