diff options
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 845f25251d81..f2710cfc0bc5 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -2084,27 +2084,20 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_read | |||
2084 | WRITE32(eof); | 2084 | WRITE32(eof); |
2085 | WRITE32(maxcount); | 2085 | WRITE32(maxcount); |
2086 | ADJUST_ARGS(); | 2086 | ADJUST_ARGS(); |
2087 | resp->xbuf->head[0].iov_len = ((char*)resp->p) - (char*)resp->xbuf->head[0].iov_base; | 2087 | resp->xbuf->head[0].iov_len = (char*)p |
2088 | 2088 | - (char*)resp->xbuf->head[0].iov_base; | |
2089 | resp->xbuf->page_len = maxcount; | 2089 | resp->xbuf->page_len = maxcount; |
2090 | 2090 | ||
2091 | /* read zero bytes -> don't set up tail */ | 2091 | /* Use rest of head for padding and remaining ops: */ |
2092 | if(!maxcount) | 2092 | resp->rqstp->rq_restailpage = 0; |
2093 | return 0; | 2093 | resp->xbuf->tail[0].iov_base = p; |
2094 | |||
2095 | /* set up page for remaining responses */ | ||
2096 | svc_take_page(resp->rqstp); | ||
2097 | resp->xbuf->tail[0].iov_base = | ||
2098 | page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused-1]); | ||
2099 | resp->rqstp->rq_restailpage = resp->rqstp->rq_resused-1; | ||
2100 | resp->xbuf->tail[0].iov_len = 0; | 2094 | resp->xbuf->tail[0].iov_len = 0; |
2101 | resp->p = resp->xbuf->tail[0].iov_base; | ||
2102 | resp->end = resp->p + PAGE_SIZE/4; | ||
2103 | |||
2104 | if (maxcount&3) { | 2095 | if (maxcount&3) { |
2105 | *(resp->p)++ = 0; | 2096 | RESERVE_SPACE(4); |
2097 | WRITE32(0); | ||
2106 | resp->xbuf->tail[0].iov_base += maxcount&3; | 2098 | resp->xbuf->tail[0].iov_base += maxcount&3; |
2107 | resp->xbuf->tail[0].iov_len = 4 - (maxcount&3); | 2099 | resp->xbuf->tail[0].iov_len = 4 - (maxcount&3); |
2100 | ADJUST_ARGS(); | ||
2108 | } | 2101 | } |
2109 | return 0; | 2102 | return 0; |
2110 | } | 2103 | } |
@@ -2141,21 +2134,20 @@ nfsd4_encode_readlink(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_r | |||
2141 | 2134 | ||
2142 | WRITE32(maxcount); | 2135 | WRITE32(maxcount); |
2143 | ADJUST_ARGS(); | 2136 | ADJUST_ARGS(); |
2144 | resp->xbuf->head[0].iov_len = ((char*)resp->p) - (char*)resp->xbuf->head[0].iov_base; | 2137 | resp->xbuf->head[0].iov_len = (char*)p |
2138 | - (char*)resp->xbuf->head[0].iov_base; | ||
2139 | resp->xbuf->page_len = maxcount; | ||
2145 | 2140 | ||
2146 | svc_take_page(resp->rqstp); | 2141 | /* Use rest of head for padding and remaining ops: */ |
2147 | resp->xbuf->tail[0].iov_base = | 2142 | resp->rqstp->rq_restailpage = 0; |
2148 | page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused-1]); | 2143 | resp->xbuf->tail[0].iov_base = p; |
2149 | resp->rqstp->rq_restailpage = resp->rqstp->rq_resused-1; | ||
2150 | resp->xbuf->tail[0].iov_len = 0; | 2144 | resp->xbuf->tail[0].iov_len = 0; |
2151 | resp->p = resp->xbuf->tail[0].iov_base; | ||
2152 | resp->end = resp->p + PAGE_SIZE/4; | ||
2153 | |||
2154 | resp->xbuf->page_len = maxcount; | ||
2155 | if (maxcount&3) { | 2145 | if (maxcount&3) { |
2156 | *(resp->p)++ = 0; | 2146 | RESERVE_SPACE(4); |
2147 | WRITE32(0); | ||
2157 | resp->xbuf->tail[0].iov_base += maxcount&3; | 2148 | resp->xbuf->tail[0].iov_base += maxcount&3; |
2158 | resp->xbuf->tail[0].iov_len = 4 - (maxcount&3); | 2149 | resp->xbuf->tail[0].iov_len = 4 - (maxcount&3); |
2150 | ADJUST_ARGS(); | ||
2159 | } | 2151 | } |
2160 | return 0; | 2152 | return 0; |
2161 | } | 2153 | } |