diff options
Diffstat (limited to 'fs/nfsd/nfs4callback.c')
-rw-r--r-- | fs/nfsd/nfs4callback.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index f4fab69a8c30..353eb4a0b847 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
@@ -140,8 +140,9 @@ struct nfs4_cb_compound_hdr { | |||
140 | int status; | 140 | int status; |
141 | u32 ident; | 141 | u32 ident; |
142 | u32 nops; | 142 | u32 nops; |
143 | __be32 *nops_p; | ||
143 | u32 taglen; | 144 | u32 taglen; |
144 | char * tag; | 145 | char *tag; |
145 | }; | 146 | }; |
146 | 147 | ||
147 | static struct { | 148 | static struct { |
@@ -201,7 +202,7 @@ nfs_cb_stat_to_errno(int stat) | |||
201 | * XDR encode | 202 | * XDR encode |
202 | */ | 203 | */ |
203 | 204 | ||
204 | static int | 205 | static void |
205 | encode_cb_compound_hdr(struct xdr_stream *xdr, struct nfs4_cb_compound_hdr *hdr) | 206 | encode_cb_compound_hdr(struct xdr_stream *xdr, struct nfs4_cb_compound_hdr *hdr) |
206 | { | 207 | { |
207 | __be32 * p; | 208 | __be32 * p; |
@@ -210,12 +211,18 @@ encode_cb_compound_hdr(struct xdr_stream *xdr, struct nfs4_cb_compound_hdr *hdr) | |||
210 | WRITE32(0); /* tag length is always 0 */ | 211 | WRITE32(0); /* tag length is always 0 */ |
211 | WRITE32(NFS4_MINOR_VERSION); | 212 | WRITE32(NFS4_MINOR_VERSION); |
212 | WRITE32(hdr->ident); | 213 | WRITE32(hdr->ident); |
214 | hdr->nops_p = p; | ||
213 | WRITE32(hdr->nops); | 215 | WRITE32(hdr->nops); |
214 | return 0; | ||
215 | } | 216 | } |
216 | 217 | ||
217 | static int | 218 | static void encode_cb_nops(struct nfs4_cb_compound_hdr *hdr) |
218 | encode_cb_recall(struct xdr_stream *xdr, struct nfs4_delegation *dp) | 219 | { |
220 | *hdr->nops_p = htonl(hdr->nops); | ||
221 | } | ||
222 | |||
223 | static void | ||
224 | encode_cb_recall(struct xdr_stream *xdr, struct nfs4_delegation *dp, | ||
225 | struct nfs4_cb_compound_hdr *hdr) | ||
219 | { | 226 | { |
220 | __be32 *p; | 227 | __be32 *p; |
221 | int len = dp->dl_fh.fh_size; | 228 | int len = dp->dl_fh.fh_size; |
@@ -227,7 +234,7 @@ encode_cb_recall(struct xdr_stream *xdr, struct nfs4_delegation *dp) | |||
227 | WRITE32(0); /* truncate optimization not implemented */ | 234 | WRITE32(0); /* truncate optimization not implemented */ |
228 | WRITE32(len); | 235 | WRITE32(len); |
229 | WRITEMEM(&dp->dl_fh.fh_base, len); | 236 | WRITEMEM(&dp->dl_fh.fh_base, len); |
230 | return 0; | 237 | hdr->nops++; |
231 | } | 238 | } |
232 | 239 | ||
233 | static int | 240 | static int |
@@ -246,12 +253,13 @@ nfs4_xdr_enc_cb_recall(struct rpc_rqst *req, __be32 *p, struct nfs4_delegation * | |||
246 | struct xdr_stream xdr; | 253 | struct xdr_stream xdr; |
247 | struct nfs4_cb_compound_hdr hdr = { | 254 | struct nfs4_cb_compound_hdr hdr = { |
248 | .ident = args->dl_ident, | 255 | .ident = args->dl_ident, |
249 | .nops = 1, | ||
250 | }; | 256 | }; |
251 | 257 | ||
252 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 258 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
253 | encode_cb_compound_hdr(&xdr, &hdr); | 259 | encode_cb_compound_hdr(&xdr, &hdr); |
254 | return (encode_cb_recall(&xdr, args)); | 260 | encode_cb_recall(&xdr, args, &hdr); |
261 | encode_cb_nops(&hdr); | ||
262 | return 0; | ||
255 | } | 263 | } |
256 | 264 | ||
257 | 265 | ||