|
35 | 35 | #define encode_offload_cancel_maxsz (op_encode_hdr_maxsz + \
|
36 | 36 | XDR_QUADLEN(NFS4_STATEID_SIZE))
|
37 | 37 | #define decode_offload_cancel_maxsz (op_decode_hdr_maxsz)
|
| 38 | +#define encode_offload_status_maxsz (op_encode_hdr_maxsz + \ |
| 39 | + XDR_QUADLEN(NFS4_STATEID_SIZE)) |
| 40 | +#define decode_offload_status_maxsz (op_decode_hdr_maxsz + \ |
| 41 | + 2 /* osr_count */ + \ |
| 42 | + 2 /* osr_complete */) |
38 | 43 | #define encode_copy_notify_maxsz (op_encode_hdr_maxsz + \
|
39 | 44 | XDR_QUADLEN(NFS4_STATEID_SIZE) + \
|
40 | 45 | 1 + /* nl4_type */ \
|
|
143 | 148 | decode_sequence_maxsz + \
|
144 | 149 | decode_putfh_maxsz + \
|
145 | 150 | decode_offload_cancel_maxsz)
|
| 151 | +#define NFS4_enc_offload_status_sz (compound_encode_hdr_maxsz + \ |
| 152 | + encode_sequence_maxsz + \ |
| 153 | + encode_putfh_maxsz + \ |
| 154 | + encode_offload_status_maxsz) |
| 155 | +#define NFS4_dec_offload_status_sz (compound_decode_hdr_maxsz + \ |
| 156 | + decode_sequence_maxsz + \ |
| 157 | + decode_putfh_maxsz + \ |
| 158 | + decode_offload_status_maxsz) |
146 | 159 | #define NFS4_enc_copy_notify_sz (compound_encode_hdr_maxsz + \
|
147 | 160 | encode_sequence_maxsz + \
|
148 | 161 | encode_putfh_maxsz + \
|
@@ -345,6 +358,14 @@ static void encode_offload_cancel(struct xdr_stream *xdr,
|
345 | 358 | encode_nfs4_stateid(xdr, &args->osa_stateid);
|
346 | 359 | }
|
347 | 360 |
|
| 361 | +static void encode_offload_status(struct xdr_stream *xdr, |
| 362 | + const struct nfs42_offload_status_args *args, |
| 363 | + struct compound_hdr *hdr) |
| 364 | +{ |
| 365 | + encode_op_hdr(xdr, OP_OFFLOAD_STATUS, decode_offload_status_maxsz, hdr); |
| 366 | + encode_nfs4_stateid(xdr, &args->osa_stateid); |
| 367 | +} |
| 368 | + |
348 | 369 | static void encode_copy_notify(struct xdr_stream *xdr,
|
349 | 370 | const struct nfs42_copy_notify_args *args,
|
350 | 371 | struct compound_hdr *hdr)
|
@@ -569,6 +590,25 @@ static void nfs4_xdr_enc_offload_cancel(struct rpc_rqst *req,
|
569 | 590 | encode_nops(&hdr);
|
570 | 591 | }
|
571 | 592 |
|
| 593 | +/* |
| 594 | + * Encode OFFLOAD_STATUS request |
| 595 | + */ |
| 596 | +static void nfs4_xdr_enc_offload_status(struct rpc_rqst *req, |
| 597 | + struct xdr_stream *xdr, |
| 598 | + const void *data) |
| 599 | +{ |
| 600 | + const struct nfs42_offload_status_args *args = data; |
| 601 | + struct compound_hdr hdr = { |
| 602 | + .minorversion = nfs4_xdr_minorversion(&args->osa_seq_args), |
| 603 | + }; |
| 604 | + |
| 605 | + encode_compound_hdr(xdr, req, &hdr); |
| 606 | + encode_sequence(xdr, &args->osa_seq_args, &hdr); |
| 607 | + encode_putfh(xdr, args->osa_src_fh, &hdr); |
| 608 | + encode_offload_status(xdr, args, &hdr); |
| 609 | + encode_nops(&hdr); |
| 610 | +} |
| 611 | + |
572 | 612 | /*
|
573 | 613 | * Encode COPY_NOTIFY request
|
574 | 614 | */
|
@@ -921,6 +961,26 @@ static int decode_offload_cancel(struct xdr_stream *xdr,
|
921 | 961 | return decode_op_hdr(xdr, OP_OFFLOAD_CANCEL);
|
922 | 962 | }
|
923 | 963 |
|
| 964 | +static int decode_offload_status(struct xdr_stream *xdr, |
| 965 | + struct nfs42_offload_status_res *res) |
| 966 | +{ |
| 967 | + ssize_t result; |
| 968 | + int status; |
| 969 | + |
| 970 | + status = decode_op_hdr(xdr, OP_OFFLOAD_STATUS); |
| 971 | + if (status) |
| 972 | + return status; |
| 973 | + /* osr_count */ |
| 974 | + if (xdr_stream_decode_u64(xdr, &res->osr_count) < 0) |
| 975 | + return -EIO; |
| 976 | + /* osr_complete<1> */ |
| 977 | + result = xdr_stream_decode_uint32_array(xdr, &res->osr_complete, 1); |
| 978 | + if (result < 0) |
| 979 | + return -EIO; |
| 980 | + res->complete_count = result; |
| 981 | + return 0; |
| 982 | +} |
| 983 | + |
924 | 984 | static int decode_copy_notify(struct xdr_stream *xdr,
|
925 | 985 | struct nfs42_copy_notify_res *res)
|
926 | 986 | {
|
@@ -1370,6 +1430,32 @@ static int nfs4_xdr_dec_offload_cancel(struct rpc_rqst *rqstp,
|
1370 | 1430 | return status;
|
1371 | 1431 | }
|
1372 | 1432 |
|
| 1433 | +/* |
| 1434 | + * Decode OFFLOAD_STATUS response |
| 1435 | + */ |
| 1436 | +static int nfs4_xdr_dec_offload_status(struct rpc_rqst *rqstp, |
| 1437 | + struct xdr_stream *xdr, |
| 1438 | + void *data) |
| 1439 | +{ |
| 1440 | + struct nfs42_offload_status_res *res = data; |
| 1441 | + struct compound_hdr hdr; |
| 1442 | + int status; |
| 1443 | + |
| 1444 | + status = decode_compound_hdr(xdr, &hdr); |
| 1445 | + if (status) |
| 1446 | + goto out; |
| 1447 | + status = decode_sequence(xdr, &res->osr_seq_res, rqstp); |
| 1448 | + if (status) |
| 1449 | + goto out; |
| 1450 | + status = decode_putfh(xdr); |
| 1451 | + if (status) |
| 1452 | + goto out; |
| 1453 | + status = decode_offload_status(xdr, res); |
| 1454 | + |
| 1455 | +out: |
| 1456 | + return status; |
| 1457 | +} |
| 1458 | + |
1373 | 1459 | /*
|
1374 | 1460 | * Decode COPY_NOTIFY response
|
1375 | 1461 | */
|
|
0 commit comments