svc_fill_write_vector() was introduced in commit 8154ef2776aa
("NFSD: Clean up legacy NFS WRITE argument XDR decoders").
I'm about to add a case where page_base will sometimes not be zero
when the NFS WRITE proc functions invoke this API. Refactor the
API and function internals to handle this case properly.
Signed-off-by: Chuck Lever <redacted>
---
net/sunrpc/svc.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 34ced7f538ee..3d9f9da98aed 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -1705,6 +1705,7 @@ unsigned int svc_fill_write_vector(struct svc_rqst *rqstp,
struct kvec *vec = rqstp->rq_vec;
size_t total = payload->len;
unsigned int i;
+ size_t offset;
/* Some types of transport can present the write payload
* entirely in rq_arg.pages. In this case, @first is empty.
@@ -1717,12 +1718,14 @@ unsigned int svc_fill_write_vector(struct svc_rqst *rqstp,
++i;
}
+ offset = payload->page_base;
while (total) {
- vec[i].iov_base = page_address(*pages);
- vec[i].iov_len = min_t(size_t, total, PAGE_SIZE);
+ vec[i].iov_base = page_address(*pages) + offset;
+ vec[i].iov_len = min_t(size_t, total, PAGE_SIZE - offset);
total -= vec[i].iov_len;
++i;
++pages;
+ offset = 0;
}
WARN_ON_ONCE(i > ARRAY_SIZE(rqstp->rq_vec));