aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2010-09-21 16:55:48 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2010-09-21 16:55:48 -0400
commitb4687da7fc5f741af7fee9b0248a2cf2ad9c4478 (patch)
tree1df8cb2cc72a88b4646bf380ff68345415d0222f /fs/nfs
parent38359352fcb0d776b562a9e0ed4f0d355d5a332e (diff)
SUNRPC: Refactor logic to NUL-terminate strings in pages
Clean up: Introduce a helper to '\0'-terminate XDR strings that are placed in a page in the page cache. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs2xdr.c6
-rw-r--r--fs/nfs/nfs3xdr.c6
-rw-r--r--fs/nfs/nfs4xdr.c5
3 files changed, 3 insertions, 14 deletions
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
index e15bc0306d0c..79c74387a2fe 100644
--- a/fs/nfs/nfs2xdr.c
+++ b/fs/nfs/nfs2xdr.c
@@ -596,7 +596,6 @@ nfs_xdr_readlinkres(struct rpc_rqst *req, __be32 *p, void *dummy)
596 struct kvec *iov = rcvbuf->head; 596 struct kvec *iov = rcvbuf->head;
597 size_t hdrlen; 597 size_t hdrlen;
598 u32 len, recvd; 598 u32 len, recvd;
599 char *kaddr;
600 int status; 599 int status;
601 600
602 if ((status = ntohl(*p++))) 601 if ((status = ntohl(*p++)))
@@ -623,10 +622,7 @@ nfs_xdr_readlinkres(struct rpc_rqst *req, __be32 *p, void *dummy)
623 return -EIO; 622 return -EIO;
624 } 623 }
625 624
626 /* NULL terminate the string we got */ 625 xdr_terminate_string(rcvbuf, len);
627 kaddr = (char *)kmap_atomic(rcvbuf->pages[0], KM_USER0);
628 kaddr[len+rcvbuf->page_base] = '\0';
629 kunmap_atomic(kaddr, KM_USER0);
630 return 0; 626 return 0;
631} 627}
632 628
diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
index 89c40f8ec6e6..52b2fda66e63 100644
--- a/fs/nfs/nfs3xdr.c
+++ b/fs/nfs/nfs3xdr.c
@@ -824,7 +824,6 @@ nfs3_xdr_readlinkres(struct rpc_rqst *req, __be32 *p, struct nfs_fattr *fattr)
824 struct kvec *iov = rcvbuf->head; 824 struct kvec *iov = rcvbuf->head;
825 size_t hdrlen; 825 size_t hdrlen;
826 u32 len, recvd; 826 u32 len, recvd;
827 char *kaddr;
828 int status; 827 int status;
829 828
830 status = ntohl(*p++); 829 status = ntohl(*p++);
@@ -857,10 +856,7 @@ nfs3_xdr_readlinkres(struct rpc_rqst *req, __be32 *p, struct nfs_fattr *fattr)
857 return -EIO; 856 return -EIO;
858 } 857 }
859 858
860 /* NULL terminate the string we got */ 859 xdr_terminate_string(rcvbuf, len);
861 kaddr = (char*)kmap_atomic(rcvbuf->pages[0], KM_USER0);
862 kaddr[len+rcvbuf->page_base] = '\0';
863 kunmap_atomic(kaddr, KM_USER0);
864 return 0; 860 return 0;
865} 861}
866 862
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index b0bd7efe8100..86ab69eb149c 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -4299,7 +4299,6 @@ static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
4299 size_t hdrlen; 4299 size_t hdrlen;
4300 u32 len, recvd; 4300 u32 len, recvd;
4301 __be32 *p; 4301 __be32 *p;
4302 char *kaddr;
4303 int status; 4302 int status;
4304 4303
4305 status = decode_op_hdr(xdr, OP_READLINK); 4304 status = decode_op_hdr(xdr, OP_READLINK);
@@ -4330,9 +4329,7 @@ static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
4330 * and and null-terminate the text (the VFS expects 4329 * and and null-terminate the text (the VFS expects
4331 * null-termination). 4330 * null-termination).
4332 */ 4331 */
4333 kaddr = (char *)kmap_atomic(rcvbuf->pages[0], KM_USER0); 4332 xdr_terminate_string(rcvbuf, len);
4334 kaddr[len+rcvbuf->page_base] = '\0';
4335 kunmap_atomic(kaddr, KM_USER0);
4336 return 0; 4333 return 0;
4337out_overflow: 4334out_overflow:
4338 print_overflow_msg(__func__, xdr); 4335 print_overflow_msg(__func__, xdr);