diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-04-12 16:54:43 -0400 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-04-12 16:54:43 -0400 |
| commit | a890b15c0990cc8d686edcc85f5fccde71ad5ce9 (patch) | |
| tree | 73162355b58283a2531f13fbbf663809f95c1483 /fs/nfsd/nfs4xdr.c | |
| parent | 79fa1b677be3a985cc66b9218a4dd09818f1051b (diff) | |
| parent | 26ec634c31a11a003040e10b4d650495158632fd (diff) | |
Merge branch 'upstream'
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
| -rw-r--r-- | fs/nfsd/nfs4xdr.c | 62 |
1 files changed, 26 insertions, 36 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 03857fd81126..de3998f15f10 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
| @@ -299,11 +299,10 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, struct iattr *ia | |||
| 299 | buf, dummy32, &ace.who); | 299 | buf, dummy32, &ace.who); |
| 300 | if (status) | 300 | if (status) |
| 301 | goto out_nfserr; | 301 | goto out_nfserr; |
| 302 | if (nfs4_acl_add_ace(*acl, ace.type, ace.flag, | 302 | status = nfs4_acl_add_ace(*acl, ace.type, ace.flag, |
| 303 | ace.access_mask, ace.whotype, ace.who) != 0) { | 303 | ace.access_mask, ace.whotype, ace.who); |
| 304 | status = -ENOMEM; | 304 | if (status) |
| 305 | goto out_nfserr; | 305 | goto out_nfserr; |
| 306 | } | ||
| 307 | } | 306 | } |
| 308 | } else | 307 | } else |
| 309 | *acl = NULL; | 308 | *acl = NULL; |
| @@ -2085,27 +2084,20 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_read | |||
| 2085 | WRITE32(eof); | 2084 | WRITE32(eof); |
| 2086 | WRITE32(maxcount); | 2085 | WRITE32(maxcount); |
| 2087 | ADJUST_ARGS(); | 2086 | ADJUST_ARGS(); |
| 2088 | 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 |
| 2089 | 2088 | - (char*)resp->xbuf->head[0].iov_base; | |
| 2090 | resp->xbuf->page_len = maxcount; | 2089 | resp->xbuf->page_len = maxcount; |
| 2091 | 2090 | ||
| 2092 | /* read zero bytes -> don't set up tail */ | 2091 | /* Use rest of head for padding and remaining ops: */ |
| 2093 | if(!maxcount) | 2092 | resp->rqstp->rq_restailpage = 0; |
| 2094 | return 0; | 2093 | resp->xbuf->tail[0].iov_base = p; |
| 2095 | |||
| 2096 | /* set up page for remaining responses */ | ||
| 2097 | svc_take_page(resp->rqstp); | ||
| 2098 | resp->xbuf->tail[0].iov_base = | ||
| 2099 | page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused-1]); | ||
| 2100 | resp->rqstp->rq_restailpage = resp->rqstp->rq_resused-1; | ||
| 2101 | resp->xbuf->tail[0].iov_len = 0; | 2094 | resp->xbuf->tail[0].iov_len = 0; |
| 2102 | resp->p = resp->xbuf->tail[0].iov_base; | ||
| 2103 | resp->end = resp->p + PAGE_SIZE/4; | ||
| 2104 | |||
| 2105 | if (maxcount&3) { | 2095 | if (maxcount&3) { |
| 2106 | *(resp->p)++ = 0; | 2096 | RESERVE_SPACE(4); |
| 2097 | WRITE32(0); | ||
| 2107 | resp->xbuf->tail[0].iov_base += maxcount&3; | 2098 | resp->xbuf->tail[0].iov_base += maxcount&3; |
| 2108 | resp->xbuf->tail[0].iov_len = 4 - (maxcount&3); | 2099 | resp->xbuf->tail[0].iov_len = 4 - (maxcount&3); |
| 2100 | ADJUST_ARGS(); | ||
| 2109 | } | 2101 | } |
| 2110 | return 0; | 2102 | return 0; |
| 2111 | } | 2103 | } |
| @@ -2142,21 +2134,20 @@ nfsd4_encode_readlink(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_r | |||
| 2142 | 2134 | ||
| 2143 | WRITE32(maxcount); | 2135 | WRITE32(maxcount); |
| 2144 | ADJUST_ARGS(); | 2136 | ADJUST_ARGS(); |
| 2145 | 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; | ||
| 2146 | 2140 | ||
| 2147 | svc_take_page(resp->rqstp); | 2141 | /* Use rest of head for padding and remaining ops: */ |
| 2148 | resp->xbuf->tail[0].iov_base = | 2142 | resp->rqstp->rq_restailpage = 0; |
| 2149 | page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused-1]); | 2143 | resp->xbuf->tail[0].iov_base = p; |
| 2150 | resp->rqstp->rq_restailpage = resp->rqstp->rq_resused-1; | ||
| 2151 | resp->xbuf->tail[0].iov_len = 0; | 2144 | resp->xbuf->tail[0].iov_len = 0; |
| 2152 | resp->p = resp->xbuf->tail[0].iov_base; | ||
| 2153 | resp->end = resp->p + PAGE_SIZE/4; | ||
| 2154 | |||
| 2155 | resp->xbuf->page_len = maxcount; | ||
| 2156 | if (maxcount&3) { | 2145 | if (maxcount&3) { |
| 2157 | *(resp->p)++ = 0; | 2146 | RESERVE_SPACE(4); |
| 2147 | WRITE32(0); | ||
| 2158 | resp->xbuf->tail[0].iov_base += maxcount&3; | 2148 | resp->xbuf->tail[0].iov_base += maxcount&3; |
| 2159 | resp->xbuf->tail[0].iov_len = 4 - (maxcount&3); | 2149 | resp->xbuf->tail[0].iov_len = 4 - (maxcount&3); |
| 2150 | ADJUST_ARGS(); | ||
| 2160 | } | 2151 | } |
| 2161 | return 0; | 2152 | return 0; |
| 2162 | } | 2153 | } |
| @@ -2166,7 +2157,7 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_re | |||
| 2166 | { | 2157 | { |
| 2167 | int maxcount; | 2158 | int maxcount; |
| 2168 | loff_t offset; | 2159 | loff_t offset; |
| 2169 | u32 *page, *savep; | 2160 | u32 *page, *savep, *tailbase; |
| 2170 | ENCODE_HEAD; | 2161 | ENCODE_HEAD; |
| 2171 | 2162 | ||
| 2172 | if (nfserr) | 2163 | if (nfserr) |
| @@ -2182,6 +2173,7 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_re | |||
| 2182 | WRITE32(0); | 2173 | WRITE32(0); |
| 2183 | ADJUST_ARGS(); | 2174 | ADJUST_ARGS(); |
| 2184 | resp->xbuf->head[0].iov_len = ((char*)resp->p) - (char*)resp->xbuf->head[0].iov_base; | 2175 | resp->xbuf->head[0].iov_len = ((char*)resp->p) - (char*)resp->xbuf->head[0].iov_base; |
| 2176 | tailbase = p; | ||
| 2185 | 2177 | ||
| 2186 | maxcount = PAGE_SIZE; | 2178 | maxcount = PAGE_SIZE; |
| 2187 | if (maxcount > readdir->rd_maxcount) | 2179 | if (maxcount > readdir->rd_maxcount) |
| @@ -2226,14 +2218,12 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_re | |||
| 2226 | *p++ = htonl(readdir->common.err == nfserr_eof); | 2218 | *p++ = htonl(readdir->common.err == nfserr_eof); |
| 2227 | resp->xbuf->page_len = ((char*)p) - (char*)page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused-1]); | 2219 | resp->xbuf->page_len = ((char*)p) - (char*)page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused-1]); |
| 2228 | 2220 | ||
| 2229 | /* allocate a page for the tail */ | 2221 | /* Use rest of head for padding and remaining ops: */ |
| 2230 | svc_take_page(resp->rqstp); | 2222 | resp->rqstp->rq_restailpage = 0; |
| 2231 | resp->xbuf->tail[0].iov_base = | 2223 | resp->xbuf->tail[0].iov_base = tailbase; |
| 2232 | page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused-1]); | ||
| 2233 | resp->rqstp->rq_restailpage = resp->rqstp->rq_resused-1; | ||
| 2234 | resp->xbuf->tail[0].iov_len = 0; | 2224 | resp->xbuf->tail[0].iov_len = 0; |
| 2235 | resp->p = resp->xbuf->tail[0].iov_base; | 2225 | resp->p = resp->xbuf->tail[0].iov_base; |
| 2236 | resp->end = resp->p + PAGE_SIZE/4; | 2226 | resp->end = resp->p + (PAGE_SIZE - resp->xbuf->head[0].iov_len)/4; |
| 2237 | 2227 | ||
| 2238 | return 0; | 2228 | return 0; |
| 2239 | err_no_verf: | 2229 | err_no_verf: |
