فهرست منبع

SUNRPC: Don't truncate tail data unnecessarily in xdr_shrink_pagelen

If we have unused buffer space, then we should make use of that rather
than unnecessarily truncating the message.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Trond Myklebust 14 سال پیش
والد
کامیت
cf187c2d7e
1فایلهای تغییر یافته به همراه10 افزوده شده و 1 حذف شده
  1. 10 1
      net/sunrpc/xdr.c

+ 10 - 1
net/sunrpc/xdr.c

@@ -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;