diff options
| -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 | } |
