blob: 8b2605882a2016e603f7405304bb91c85b344fc5 [file] [log] [blame]
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -04001/*
2 * Copyright (c) 2014 Anna Schumaker <Anna.Schumaker@Netapp.com>
3 */
4#ifndef __LINUX_FS_NFS_NFS4_2XDR_H
5#define __LINUX_FS_NFS_NFS4_2XDR_H
6
Trond Myklebustbe3a5d22015-06-23 19:51:55 +08007#include "nfs42.h"
8
Anna Schumakerf4ac1672014-11-25 13:18:15 -05009#define encode_fallocate_maxsz (encode_stateid_maxsz + \
10 2 /* offset */ + \
11 2 /* length */)
Anna Schumaker2e724482013-05-21 16:53:03 -040012#define NFS42_WRITE_RES_SIZE (1 /* wr_callback_id size */ +\
13 XDR_QUADLEN(NFS4_STATEID_SIZE) + \
14 2 /* wr_count */ + \
15 1 /* wr_committed */ + \
16 XDR_QUADLEN(NFS4_VERIFIER_SIZE))
Anna Schumakerf4ac1672014-11-25 13:18:15 -050017#define encode_allocate_maxsz (op_encode_hdr_maxsz + \
18 encode_fallocate_maxsz)
19#define decode_allocate_maxsz (op_decode_hdr_maxsz)
Anna Schumaker2e724482013-05-21 16:53:03 -040020#define encode_copy_maxsz (op_encode_hdr_maxsz + \
21 XDR_QUADLEN(NFS4_STATEID_SIZE) + \
22 XDR_QUADLEN(NFS4_STATEID_SIZE) + \
23 2 + 2 + 2 + 1 + 1 + 1)
24#define decode_copy_maxsz (op_decode_hdr_maxsz + \
25 NFS42_WRITE_RES_SIZE + \
26 1 /* cr_consecutive */ + \
27 1 /* cr_synchronous */)
Anna Schumaker624bd5b2014-11-25 13:18:16 -050028#define encode_deallocate_maxsz (op_encode_hdr_maxsz + \
29 encode_fallocate_maxsz)
30#define decode_deallocate_maxsz (op_decode_hdr_maxsz)
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -040031#define encode_seek_maxsz (op_encode_hdr_maxsz + \
32 encode_stateid_maxsz + \
33 2 /* offset */ + \
34 1 /* whence */)
35#define decode_seek_maxsz (op_decode_hdr_maxsz + \
36 1 /* eof */ + \
37 1 /* whence */ + \
38 2 /* offset */ + \
39 2 /* length */)
Trond Myklebustbe3a5d22015-06-23 19:51:55 +080040#define encode_io_info_maxsz 4
41#define encode_layoutstats_maxsz (op_decode_hdr_maxsz + \
42 2 /* offset */ + \
43 2 /* length */ + \
44 encode_stateid_maxsz + \
45 encode_io_info_maxsz + \
46 encode_io_info_maxsz + \
47 1 /* opaque devaddr4 length */ + \
48 XDR_QUADLEN(PNFS_LAYOUTSTATS_MAXSIZE))
49#define decode_layoutstats_maxsz (op_decode_hdr_maxsz)
Peng Tao36022772015-09-26 02:24:34 +080050#define encode_clone_maxsz (encode_stateid_maxsz + \
51 encode_stateid_maxsz + \
52 2 /* src offset */ + \
53 2 /* dst offset */ + \
54 2 /* count */)
55#define decode_clone_maxsz (op_decode_hdr_maxsz)
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -040056
Anna Schumakerf4ac1672014-11-25 13:18:15 -050057#define NFS4_enc_allocate_sz (compound_encode_hdr_maxsz + \
58 encode_putfh_maxsz + \
Anna Schumaker9a519402015-03-16 14:06:23 -040059 encode_allocate_maxsz + \
60 encode_getattr_maxsz)
Anna Schumakerf4ac1672014-11-25 13:18:15 -050061#define NFS4_dec_allocate_sz (compound_decode_hdr_maxsz + \
62 decode_putfh_maxsz + \
Anna Schumaker9a519402015-03-16 14:06:23 -040063 decode_allocate_maxsz + \
64 decode_getattr_maxsz)
Anna Schumaker2e724482013-05-21 16:53:03 -040065#define NFS4_enc_copy_sz (compound_encode_hdr_maxsz + \
66 encode_putfh_maxsz + \
67 encode_savefh_maxsz + \
68 encode_putfh_maxsz + \
69 encode_copy_maxsz)
70#define NFS4_dec_copy_sz (compound_decode_hdr_maxsz + \
71 decode_putfh_maxsz + \
72 decode_savefh_maxsz + \
73 decode_putfh_maxsz + \
74 decode_copy_maxsz)
Anna Schumaker624bd5b2014-11-25 13:18:16 -050075#define NFS4_enc_deallocate_sz (compound_encode_hdr_maxsz + \
76 encode_putfh_maxsz + \
Anna Schumaker9a519402015-03-16 14:06:23 -040077 encode_deallocate_maxsz + \
78 encode_getattr_maxsz)
Anna Schumaker624bd5b2014-11-25 13:18:16 -050079#define NFS4_dec_deallocate_sz (compound_decode_hdr_maxsz + \
80 decode_putfh_maxsz + \
Anna Schumaker9a519402015-03-16 14:06:23 -040081 decode_deallocate_maxsz + \
82 decode_getattr_maxsz)
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -040083#define NFS4_enc_seek_sz (compound_encode_hdr_maxsz + \
84 encode_putfh_maxsz + \
85 encode_seek_maxsz)
86#define NFS4_dec_seek_sz (compound_decode_hdr_maxsz + \
87 decode_putfh_maxsz + \
88 decode_seek_maxsz)
Trond Myklebustbe3a5d22015-06-23 19:51:55 +080089#define NFS4_enc_layoutstats_sz (compound_encode_hdr_maxsz + \
90 encode_sequence_maxsz + \
91 encode_putfh_maxsz + \
92 PNFS_LAYOUTSTATS_MAXDEV * encode_layoutstats_maxsz)
93#define NFS4_dec_layoutstats_sz (compound_decode_hdr_maxsz + \
94 decode_sequence_maxsz + \
95 decode_putfh_maxsz + \
96 PNFS_LAYOUTSTATS_MAXDEV * decode_layoutstats_maxsz)
Peng Tao36022772015-09-26 02:24:34 +080097#define NFS4_enc_clone_sz (compound_encode_hdr_maxsz + \
98 encode_sequence_maxsz + \
99 encode_putfh_maxsz + \
100 encode_savefh_maxsz + \
101 encode_putfh_maxsz + \
102 encode_clone_maxsz + \
103 encode_getattr_maxsz)
104#define NFS4_dec_clone_sz (compound_decode_hdr_maxsz + \
105 decode_sequence_maxsz + \
106 decode_putfh_maxsz + \
107 decode_savefh_maxsz + \
108 decode_putfh_maxsz + \
109 decode_clone_maxsz + \
110 decode_getattr_maxsz)
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -0400111
Anna Schumakerf4ac1672014-11-25 13:18:15 -0500112static void encode_fallocate(struct xdr_stream *xdr,
113 struct nfs42_falloc_args *args)
114{
115 encode_nfs4_stateid(xdr, &args->falloc_stateid);
116 encode_uint64(xdr, args->falloc_offset);
117 encode_uint64(xdr, args->falloc_length);
118}
119
120static void encode_allocate(struct xdr_stream *xdr,
121 struct nfs42_falloc_args *args,
122 struct compound_hdr *hdr)
123{
124 encode_op_hdr(xdr, OP_ALLOCATE, decode_allocate_maxsz, hdr);
125 encode_fallocate(xdr, args);
126}
127
Anna Schumaker2e724482013-05-21 16:53:03 -0400128static void encode_copy(struct xdr_stream *xdr,
129 struct nfs42_copy_args *args,
130 struct compound_hdr *hdr)
131{
132 encode_op_hdr(xdr, OP_COPY, decode_copy_maxsz, hdr);
133 encode_nfs4_stateid(xdr, &args->src_stateid);
134 encode_nfs4_stateid(xdr, &args->dst_stateid);
135
136 encode_uint64(xdr, args->src_pos);
137 encode_uint64(xdr, args->dst_pos);
138 encode_uint64(xdr, args->count);
139
140 encode_uint32(xdr, 1); /* consecutive = true */
141 encode_uint32(xdr, 1); /* synchronous = true */
142 encode_uint32(xdr, 0); /* src server list */
143}
144
Anna Schumaker624bd5b2014-11-25 13:18:16 -0500145static void encode_deallocate(struct xdr_stream *xdr,
146 struct nfs42_falloc_args *args,
147 struct compound_hdr *hdr)
148{
149 encode_op_hdr(xdr, OP_DEALLOCATE, decode_deallocate_maxsz, hdr);
150 encode_fallocate(xdr, args);
151}
152
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -0400153static void encode_seek(struct xdr_stream *xdr,
154 struct nfs42_seek_args *args,
155 struct compound_hdr *hdr)
156{
157 encode_op_hdr(xdr, OP_SEEK, decode_seek_maxsz, hdr);
158 encode_nfs4_stateid(xdr, &args->sa_stateid);
159 encode_uint64(xdr, args->sa_offset);
160 encode_uint32(xdr, args->sa_what);
161}
162
Trond Myklebustbe3a5d22015-06-23 19:51:55 +0800163static void encode_layoutstats(struct xdr_stream *xdr,
164 struct nfs42_layoutstat_args *args,
165 struct nfs42_layoutstat_devinfo *devinfo,
166 struct compound_hdr *hdr)
167{
168 __be32 *p;
169
170 encode_op_hdr(xdr, OP_LAYOUTSTATS, decode_layoutstats_maxsz, hdr);
171 p = reserve_space(xdr, 8 + 8);
172 p = xdr_encode_hyper(p, devinfo->offset);
173 p = xdr_encode_hyper(p, devinfo->length);
174 encode_nfs4_stateid(xdr, &args->stateid);
175 p = reserve_space(xdr, 4*8 + NFS4_DEVICEID4_SIZE + 4);
176 p = xdr_encode_hyper(p, devinfo->read_count);
177 p = xdr_encode_hyper(p, devinfo->read_bytes);
178 p = xdr_encode_hyper(p, devinfo->write_count);
179 p = xdr_encode_hyper(p, devinfo->write_bytes);
180 p = xdr_encode_opaque_fixed(p, devinfo->dev_id.data,
181 NFS4_DEVICEID4_SIZE);
182 /* Encode layoutupdate4 */
183 *p++ = cpu_to_be32(devinfo->layout_type);
184 if (devinfo->layoutstats_encode != NULL)
185 devinfo->layoutstats_encode(xdr, args, devinfo);
186 else
187 encode_uint32(xdr, 0);
188}
189
Peng Tao36022772015-09-26 02:24:34 +0800190static void encode_clone(struct xdr_stream *xdr,
191 struct nfs42_clone_args *args,
192 struct compound_hdr *hdr)
193{
194 __be32 *p;
195
196 encode_op_hdr(xdr, OP_CLONE, decode_clone_maxsz, hdr);
197 encode_nfs4_stateid(xdr, &args->src_stateid);
198 encode_nfs4_stateid(xdr, &args->dst_stateid);
199 p = reserve_space(xdr, 3*8);
200 p = xdr_encode_hyper(p, args->src_offset);
201 p = xdr_encode_hyper(p, args->dst_offset);
202 xdr_encode_hyper(p, args->count);
203}
204
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -0400205/*
Anna Schumakerf4ac1672014-11-25 13:18:15 -0500206 * Encode ALLOCATE request
207 */
208static void nfs4_xdr_enc_allocate(struct rpc_rqst *req,
209 struct xdr_stream *xdr,
210 struct nfs42_falloc_args *args)
211{
212 struct compound_hdr hdr = {
213 .minorversion = nfs4_xdr_minorversion(&args->seq_args),
214 };
215
216 encode_compound_hdr(xdr, req, &hdr);
217 encode_sequence(xdr, &args->seq_args, &hdr);
218 encode_putfh(xdr, args->falloc_fh, &hdr);
219 encode_allocate(xdr, args, &hdr);
Anna Schumaker9a519402015-03-16 14:06:23 -0400220 encode_getfattr(xdr, args->falloc_bitmask, &hdr);
Anna Schumakerf4ac1672014-11-25 13:18:15 -0500221 encode_nops(&hdr);
222}
223
224/*
Anna Schumaker2e724482013-05-21 16:53:03 -0400225 * Encode COPY request
226 */
227static void nfs4_xdr_enc_copy(struct rpc_rqst *req,
228 struct xdr_stream *xdr,
229 struct nfs42_copy_args *args)
230{
231 struct compound_hdr hdr = {
232 .minorversion = nfs4_xdr_minorversion(&args->seq_args),
233 };
234
235 encode_compound_hdr(xdr, req, &hdr);
236 encode_sequence(xdr, &args->seq_args, &hdr);
237 encode_putfh(xdr, args->src_fh, &hdr);
238 encode_savefh(xdr, &hdr);
239 encode_putfh(xdr, args->dst_fh, &hdr);
240 encode_copy(xdr, args, &hdr);
241 encode_nops(&hdr);
242}
243
244/*
Anna Schumaker624bd5b2014-11-25 13:18:16 -0500245 * Encode DEALLOCATE request
246 */
247static void nfs4_xdr_enc_deallocate(struct rpc_rqst *req,
248 struct xdr_stream *xdr,
249 struct nfs42_falloc_args *args)
250{
251 struct compound_hdr hdr = {
252 .minorversion = nfs4_xdr_minorversion(&args->seq_args),
253 };
254
255 encode_compound_hdr(xdr, req, &hdr);
256 encode_sequence(xdr, &args->seq_args, &hdr);
257 encode_putfh(xdr, args->falloc_fh, &hdr);
258 encode_deallocate(xdr, args, &hdr);
Anna Schumaker9a519402015-03-16 14:06:23 -0400259 encode_getfattr(xdr, args->falloc_bitmask, &hdr);
Anna Schumaker624bd5b2014-11-25 13:18:16 -0500260 encode_nops(&hdr);
261}
262
263/*
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -0400264 * Encode SEEK request
265 */
266static void nfs4_xdr_enc_seek(struct rpc_rqst *req,
267 struct xdr_stream *xdr,
268 struct nfs42_seek_args *args)
269{
270 struct compound_hdr hdr = {
271 .minorversion = nfs4_xdr_minorversion(&args->seq_args),
272 };
273
274 encode_compound_hdr(xdr, req, &hdr);
275 encode_sequence(xdr, &args->seq_args, &hdr);
276 encode_putfh(xdr, args->sa_fh, &hdr);
277 encode_seek(xdr, args, &hdr);
278 encode_nops(&hdr);
279}
280
Trond Myklebustbe3a5d22015-06-23 19:51:55 +0800281/*
282 * Encode LAYOUTSTATS request
283 */
284static void nfs4_xdr_enc_layoutstats(struct rpc_rqst *req,
285 struct xdr_stream *xdr,
286 struct nfs42_layoutstat_args *args)
287{
288 int i;
289
290 struct compound_hdr hdr = {
291 .minorversion = nfs4_xdr_minorversion(&args->seq_args),
292 };
293
294 encode_compound_hdr(xdr, req, &hdr);
295 encode_sequence(xdr, &args->seq_args, &hdr);
296 encode_putfh(xdr, args->fh, &hdr);
297 WARN_ON(args->num_dev > PNFS_LAYOUTSTATS_MAXDEV);
298 for (i = 0; i < args->num_dev; i++)
299 encode_layoutstats(xdr, args, &args->devinfo[i], &hdr);
300 encode_nops(&hdr);
301}
302
Peng Tao36022772015-09-26 02:24:34 +0800303/*
304 * Encode CLONE request
305 */
306static void nfs4_xdr_enc_clone(struct rpc_rqst *req,
307 struct xdr_stream *xdr,
308 struct nfs42_clone_args *args)
309{
310 struct compound_hdr hdr = {
311 .minorversion = nfs4_xdr_minorversion(&args->seq_args),
312 };
313
314 encode_compound_hdr(xdr, req, &hdr);
315 encode_sequence(xdr, &args->seq_args, &hdr);
316 encode_putfh(xdr, args->src_fh, &hdr);
317 encode_savefh(xdr, &hdr);
318 encode_putfh(xdr, args->dst_fh, &hdr);
319 encode_clone(xdr, args, &hdr);
320 encode_getfattr(xdr, args->dst_bitmask, &hdr);
321 encode_nops(&hdr);
322}
323
Anna Schumakerf4ac1672014-11-25 13:18:15 -0500324static int decode_allocate(struct xdr_stream *xdr, struct nfs42_falloc_res *res)
325{
326 return decode_op_hdr(xdr, OP_ALLOCATE);
327}
328
Anna Schumaker2e724482013-05-21 16:53:03 -0400329static int decode_write_response(struct xdr_stream *xdr,
330 struct nfs42_write_res *res)
331{
332 __be32 *p;
Anna Schumaker2e724482013-05-21 16:53:03 -0400333
334 p = xdr_inline_decode(xdr, 4 + 8 + 4);
335 if (unlikely(!p))
336 goto out_overflow;
337
Trond Myklebust6fdf3392016-07-24 17:17:16 -0400338 /*
339 * We never use asynchronous mode, so warn if a server returns
340 * a stateid.
341 */
342 if (unlikely(*p != 0)) {
343 pr_err_once("%s: server has set unrequested "
344 "asynchronous mode\n", __func__);
345 return -EREMOTEIO;
346 }
347 p++;
Anna Schumaker2e724482013-05-21 16:53:03 -0400348 p = xdr_decode_hyper(p, &res->count);
349 res->verifier.committed = be32_to_cpup(p);
350 return decode_verifier(xdr, &res->verifier.verifier);
351
352out_overflow:
353 print_overflow_msg(__func__, xdr);
354 return -EIO;
355}
356
357static int decode_copy_requirements(struct xdr_stream *xdr,
358 struct nfs42_copy_res *res) {
359 __be32 *p;
360
361 p = xdr_inline_decode(xdr, 4 + 4);
362 if (unlikely(!p))
363 goto out_overflow;
364
365 res->consecutive = be32_to_cpup(p++);
366 res->synchronous = be32_to_cpup(p++);
367 return 0;
368out_overflow:
369 print_overflow_msg(__func__, xdr);
370 return -EIO;
371}
372
373static int decode_copy(struct xdr_stream *xdr, struct nfs42_copy_res *res)
374{
375 int status;
376
377 status = decode_op_hdr(xdr, OP_COPY);
378 if (status == NFS4ERR_OFFLOAD_NO_REQS) {
379 status = decode_copy_requirements(xdr, res);
380 if (status)
381 return status;
382 return NFS4ERR_OFFLOAD_NO_REQS;
383 } else if (status)
384 return status;
385
386 status = decode_write_response(xdr, &res->write_res);
387 if (status)
388 return status;
389
390 return decode_copy_requirements(xdr, res);
391}
392
Anna Schumaker624bd5b2014-11-25 13:18:16 -0500393static int decode_deallocate(struct xdr_stream *xdr, struct nfs42_falloc_res *res)
394{
395 return decode_op_hdr(xdr, OP_DEALLOCATE);
396}
397
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -0400398static int decode_seek(struct xdr_stream *xdr, struct nfs42_seek_res *res)
399{
400 int status;
401 __be32 *p;
402
403 status = decode_op_hdr(xdr, OP_SEEK);
404 if (status)
405 return status;
406
407 p = xdr_inline_decode(xdr, 4 + 8);
408 if (unlikely(!p))
409 goto out_overflow;
410
411 res->sr_eof = be32_to_cpup(p++);
412 p = xdr_decode_hyper(p, &res->sr_offset);
413 return 0;
414
415out_overflow:
416 print_overflow_msg(__func__, xdr);
417 return -EIO;
418}
419
Peng Tao19cf6332015-08-26 00:13:15 +0800420static int decode_layoutstats(struct xdr_stream *xdr)
Trond Myklebustbe3a5d22015-06-23 19:51:55 +0800421{
Trond Myklebustda2e8122015-06-27 11:30:57 -0400422 return decode_op_hdr(xdr, OP_LAYOUTSTATS);
Trond Myklebustbe3a5d22015-06-23 19:51:55 +0800423}
424
Peng Tao36022772015-09-26 02:24:34 +0800425static int decode_clone(struct xdr_stream *xdr)
426{
427 return decode_op_hdr(xdr, OP_CLONE);
428}
429
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -0400430/*
Anna Schumakerf4ac1672014-11-25 13:18:15 -0500431 * Decode ALLOCATE request
432 */
433static int nfs4_xdr_dec_allocate(struct rpc_rqst *rqstp,
434 struct xdr_stream *xdr,
435 struct nfs42_falloc_res *res)
436{
437 struct compound_hdr hdr;
438 int status;
439
440 status = decode_compound_hdr(xdr, &hdr);
441 if (status)
442 goto out;
443 status = decode_sequence(xdr, &res->seq_res, rqstp);
444 if (status)
445 goto out;
446 status = decode_putfh(xdr);
447 if (status)
448 goto out;
449 status = decode_allocate(xdr, res);
Anna Schumaker9a519402015-03-16 14:06:23 -0400450 if (status)
451 goto out;
452 decode_getfattr(xdr, res->falloc_fattr, res->falloc_server);
Anna Schumakerf4ac1672014-11-25 13:18:15 -0500453out:
454 return status;
455}
456
457/*
Anna Schumaker2e724482013-05-21 16:53:03 -0400458 * Decode COPY response
459 */
460static int nfs4_xdr_dec_copy(struct rpc_rqst *rqstp,
461 struct xdr_stream *xdr,
462 struct nfs42_copy_res *res)
463{
464 struct compound_hdr hdr;
465 int status;
466
467 status = decode_compound_hdr(xdr, &hdr);
468 if (status)
469 goto out;
470 status = decode_sequence(xdr, &res->seq_res, rqstp);
471 if (status)
472 goto out;
473 status = decode_putfh(xdr);
474 if (status)
475 goto out;
476 status = decode_savefh(xdr);
477 if (status)
478 goto out;
479 status = decode_putfh(xdr);
480 if (status)
481 goto out;
482 status = decode_copy(xdr, res);
483out:
484 return status;
485}
486
487/*
Anna Schumaker624bd5b2014-11-25 13:18:16 -0500488 * Decode DEALLOCATE request
489 */
490static int nfs4_xdr_dec_deallocate(struct rpc_rqst *rqstp,
491 struct xdr_stream *xdr,
492 struct nfs42_falloc_res *res)
493{
494 struct compound_hdr hdr;
495 int status;
496
497 status = decode_compound_hdr(xdr, &hdr);
498 if (status)
499 goto out;
500 status = decode_sequence(xdr, &res->seq_res, rqstp);
501 if (status)
502 goto out;
503 status = decode_putfh(xdr);
504 if (status)
505 goto out;
506 status = decode_deallocate(xdr, res);
Anna Schumaker9a519402015-03-16 14:06:23 -0400507 if (status)
508 goto out;
509 decode_getfattr(xdr, res->falloc_fattr, res->falloc_server);
Anna Schumaker624bd5b2014-11-25 13:18:16 -0500510out:
511 return status;
512}
513
514/*
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -0400515 * Decode SEEK request
516 */
517static int nfs4_xdr_dec_seek(struct rpc_rqst *rqstp,
518 struct xdr_stream *xdr,
519 struct nfs42_seek_res *res)
520{
521 struct compound_hdr hdr;
522 int status;
523
524 status = decode_compound_hdr(xdr, &hdr);
525 if (status)
526 goto out;
527 status = decode_sequence(xdr, &res->seq_res, rqstp);
528 if (status)
529 goto out;
530 status = decode_putfh(xdr);
531 if (status)
532 goto out;
533 status = decode_seek(xdr, res);
534out:
535 return status;
536}
Trond Myklebustbe3a5d22015-06-23 19:51:55 +0800537
538/*
539 * Decode LAYOUTSTATS request
540 */
541static int nfs4_xdr_dec_layoutstats(struct rpc_rqst *rqstp,
542 struct xdr_stream *xdr,
543 struct nfs42_layoutstat_res *res)
544{
545 struct compound_hdr hdr;
546 int status, i;
547
548 status = decode_compound_hdr(xdr, &hdr);
549 if (status)
550 goto out;
551 status = decode_sequence(xdr, &res->seq_res, rqstp);
552 if (status)
553 goto out;
554 status = decode_putfh(xdr);
555 if (status)
556 goto out;
557 WARN_ON(res->num_dev > PNFS_LAYOUTSTATS_MAXDEV);
558 for (i = 0; i < res->num_dev; i++) {
Peng Tao19cf6332015-08-26 00:13:15 +0800559 status = decode_layoutstats(xdr);
Trond Myklebustbe3a5d22015-06-23 19:51:55 +0800560 if (status)
561 goto out;
562 }
563out:
564 res->rpc_status = status;
565 return status;
566}
567
Peng Tao36022772015-09-26 02:24:34 +0800568/*
569 * Decode CLONE request
570 */
571static int nfs4_xdr_dec_clone(struct rpc_rqst *rqstp,
572 struct xdr_stream *xdr,
573 struct nfs42_clone_res *res)
574{
575 struct compound_hdr hdr;
576 int status;
577
578 status = decode_compound_hdr(xdr, &hdr);
579 if (status)
580 goto out;
581 status = decode_sequence(xdr, &res->seq_res, rqstp);
582 if (status)
583 goto out;
584 status = decode_putfh(xdr);
585 if (status)
586 goto out;
587 status = decode_savefh(xdr);
588 if (status)
589 goto out;
590 status = decode_putfh(xdr);
591 if (status)
592 goto out;
593 status = decode_clone(xdr);
594 if (status)
595 goto out;
596 status = decode_getfattr(xdr, res->dst_fattr, res->server);
597
598out:
599 res->rpc_status = status;
600 return status;
601}
602
Anna Schumaker1c6dcbe2014-09-26 13:58:48 -0400603#endif /* __LINUX_FS_NFS_NFS4_2XDR_H */