aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4callback.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/nfs4callback.c')
-rw-r--r--fs/nfsd/nfs4callback.c24
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
147static struct { 148static struct {
@@ -201,7 +202,7 @@ nfs_cb_stat_to_errno(int stat)
201 * XDR encode 202 * XDR encode
202 */ 203 */
203 204
204static int 205static void
205encode_cb_compound_hdr(struct xdr_stream *xdr, struct nfs4_cb_compound_hdr *hdr) 206encode_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
217static int 218static void encode_cb_nops(struct nfs4_cb_compound_hdr *hdr)
218encode_cb_recall(struct xdr_stream *xdr, struct nfs4_delegation *dp) 219{
220 *hdr->nops_p = htonl(hdr->nops);
221}
222
223static void
224encode_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
233static int 240static 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