page_base &= ~PAGE_MASK;
 
        if (copy_len && rqst->rq_rcv_buf.page_len) {
-               npages = PAGE_ALIGN(page_base +
-                       rqst->rq_rcv_buf.page_len) >> PAGE_SHIFT;
+               int pagelist_len;
+
+               pagelist_len = rqst->rq_rcv_buf.page_len;
+               if (pagelist_len > copy_len)
+                       pagelist_len = copy_len;
+               npages = PAGE_ALIGN(page_base + pagelist_len) >> PAGE_SHIFT;
                for (; i < npages; i++) {
                        curlen = PAGE_SIZE - page_base;
-                       if (curlen > copy_len)
-                               curlen = copy_len;
+                       if (curlen > pagelist_len)
+                               curlen = pagelist_len;
+
                        dprintk("RPC:       %s: page %d"
                                " srcp 0x%p len %d curlen %d\n",
                                __func__, i, srcp, copy_len, curlen);
                        kunmap_atomic(destp);
                        srcp += curlen;
                        copy_len -= curlen;
-                       if (copy_len == 0)
+                       pagelist_len -= curlen;
+                       if (!pagelist_len)
                                break;
                        page_base = 0;
                }