|
@@ -396,12 +396,21 @@ xdr_shrink_pagelen(struct xdr_buf *buf, size_t len)
|
|
struct kvec *tail;
|
|
struct kvec *tail;
|
|
size_t copy;
|
|
size_t copy;
|
|
unsigned int pglen = buf->page_len;
|
|
unsigned int pglen = buf->page_len;
|
|
|
|
+ unsigned int tailbuf_len;
|
|
|
|
|
|
tail = buf->tail;
|
|
tail = buf->tail;
|
|
BUG_ON (len > pglen);
|
|
BUG_ON (len > pglen);
|
|
|
|
|
|
|
|
+ tailbuf_len = buf->buflen - buf->head->iov_len - buf->page_len;
|
|
|
|
+
|
|
/* Shift the tail first */
|
|
/* Shift the tail first */
|
|
- if (tail->iov_len != 0) {
|
|
|
|
|
|
+ if (tailbuf_len != 0) {
|
|
|
|
+ unsigned int free_space = tailbuf_len - tail->iov_len;
|
|
|
|
+
|
|
|
|
+ if (len < free_space)
|
|
|
|
+ free_space = len;
|
|
|
|
+ tail->iov_len += free_space;
|
|
|
|
+
|
|
copy = len;
|
|
copy = len;
|
|
if (tail->iov_len > len) {
|
|
if (tail->iov_len > len) {
|
|
char *p = (char *)tail->iov_base + len;
|
|
char *p = (char *)tail->iov_base + len;
|