diff options
author | Olga Kornievskaia <kolga@netapp.com> | 2018-07-09 15:13:29 -0400 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2018-08-09 12:56:38 -0400 |
commit | cb95deea0b4aa5c7c7423f4e075a3ddcd59e710b (patch) | |
tree | 67ad6bd3f1fe9cc92d51d93fed22ab05a087cd61 | |
parent | 5178a125f6d5fb0720315ea4f7cca642fb936031 (diff) |
NFS OFFLOAD_CANCEL xdr
Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
-rw-r--r-- | fs/nfs/nfs42xdr.c | 68 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 1 | ||||
-rw-r--r-- | fs/nfs/nfs4xdr.c | 1 | ||||
-rw-r--r-- | include/linux/nfs4.h | 1 | ||||
-rw-r--r-- | include/linux/nfs_fs_sb.h | 1 | ||||
-rw-r--r-- | include/linux/nfs_xdr.h | 12 |
6 files changed, 84 insertions, 0 deletions
diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 5966e1e7b1f5..09a540d035b8 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c | |||
@@ -26,6 +26,9 @@ | |||
26 | NFS42_WRITE_RES_SIZE + \ | 26 | NFS42_WRITE_RES_SIZE + \ |
27 | 1 /* cr_consecutive */ + \ | 27 | 1 /* cr_consecutive */ + \ |
28 | 1 /* cr_synchronous */) | 28 | 1 /* cr_synchronous */) |
29 | #define encode_offload_cancel_maxsz (op_encode_hdr_maxsz + \ | ||
30 | XDR_QUADLEN(NFS4_STATEID_SIZE)) | ||
31 | #define decode_offload_cancel_maxsz (op_decode_hdr_maxsz) | ||
29 | #define encode_deallocate_maxsz (op_encode_hdr_maxsz + \ | 32 | #define encode_deallocate_maxsz (op_encode_hdr_maxsz + \ |
30 | encode_fallocate_maxsz) | 33 | encode_fallocate_maxsz) |
31 | #define decode_deallocate_maxsz (op_decode_hdr_maxsz) | 34 | #define decode_deallocate_maxsz (op_decode_hdr_maxsz) |
@@ -75,6 +78,12 @@ | |||
75 | decode_putfh_maxsz + \ | 78 | decode_putfh_maxsz + \ |
76 | decode_copy_maxsz + \ | 79 | decode_copy_maxsz + \ |
77 | decode_commit_maxsz) | 80 | decode_commit_maxsz) |
81 | #define NFS4_enc_offload_cancel_sz (compound_encode_hdr_maxsz + \ | ||
82 | encode_putfh_maxsz + \ | ||
83 | encode_offload_cancel_maxsz) | ||
84 | #define NFS4_dec_offload_cancel_sz (compound_decode_hdr_maxsz + \ | ||
85 | decode_putfh_maxsz + \ | ||
86 | decode_offload_cancel_maxsz) | ||
78 | #define NFS4_enc_deallocate_sz (compound_encode_hdr_maxsz + \ | 87 | #define NFS4_enc_deallocate_sz (compound_encode_hdr_maxsz + \ |
79 | encode_putfh_maxsz + \ | 88 | encode_putfh_maxsz + \ |
80 | encode_deallocate_maxsz + \ | 89 | encode_deallocate_maxsz + \ |
@@ -145,6 +154,14 @@ static void encode_copy(struct xdr_stream *xdr, | |||
145 | encode_uint32(xdr, 0); /* src server list */ | 154 | encode_uint32(xdr, 0); /* src server list */ |
146 | } | 155 | } |
147 | 156 | ||
157 | static void encode_offload_cancel(struct xdr_stream *xdr, | ||
158 | const struct nfs42_offload_status_args *args, | ||
159 | struct compound_hdr *hdr) | ||
160 | { | ||
161 | encode_op_hdr(xdr, OP_OFFLOAD_CANCEL, decode_offload_cancel_maxsz, hdr); | ||
162 | encode_nfs4_stateid(xdr, &args->osa_stateid); | ||
163 | } | ||
164 | |||
148 | static void encode_deallocate(struct xdr_stream *xdr, | 165 | static void encode_deallocate(struct xdr_stream *xdr, |
149 | const struct nfs42_falloc_args *args, | 166 | const struct nfs42_falloc_args *args, |
150 | struct compound_hdr *hdr) | 167 | struct compound_hdr *hdr) |
@@ -261,6 +278,25 @@ static void nfs4_xdr_enc_copy(struct rpc_rqst *req, | |||
261 | } | 278 | } |
262 | 279 | ||
263 | /* | 280 | /* |
281 | * Encode OFFLOAD_CANEL request | ||
282 | */ | ||
283 | static void nfs4_xdr_enc_offload_cancel(struct rpc_rqst *req, | ||
284 | struct xdr_stream *xdr, | ||
285 | const void *data) | ||
286 | { | ||
287 | const struct nfs42_offload_status_args *args = data; | ||
288 | struct compound_hdr hdr = { | ||
289 | .minorversion = nfs4_xdr_minorversion(&args->osa_seq_args), | ||
290 | }; | ||
291 | |||
292 | encode_compound_hdr(xdr, req, &hdr); | ||
293 | encode_sequence(xdr, &args->osa_seq_args, &hdr); | ||
294 | encode_putfh(xdr, args->osa_src_fh, &hdr); | ||
295 | encode_offload_cancel(xdr, args, &hdr); | ||
296 | encode_nops(&hdr); | ||
297 | } | ||
298 | |||
299 | /* | ||
264 | * Encode DEALLOCATE request | 300 | * Encode DEALLOCATE request |
265 | */ | 301 | */ |
266 | static void nfs4_xdr_enc_deallocate(struct rpc_rqst *req, | 302 | static void nfs4_xdr_enc_deallocate(struct rpc_rqst *req, |
@@ -413,6 +449,12 @@ static int decode_copy(struct xdr_stream *xdr, struct nfs42_copy_res *res) | |||
413 | return decode_copy_requirements(xdr, res); | 449 | return decode_copy_requirements(xdr, res); |
414 | } | 450 | } |
415 | 451 | ||
452 | static int decode_offload_cancel(struct xdr_stream *xdr, | ||
453 | struct nfs42_offload_status_res *res) | ||
454 | { | ||
455 | return decode_op_hdr(xdr, OP_OFFLOAD_CANCEL); | ||
456 | } | ||
457 | |||
416 | static int decode_deallocate(struct xdr_stream *xdr, struct nfs42_falloc_res *res) | 458 | static int decode_deallocate(struct xdr_stream *xdr, struct nfs42_falloc_res *res) |
417 | { | 459 | { |
418 | return decode_op_hdr(xdr, OP_DEALLOCATE); | 460 | return decode_op_hdr(xdr, OP_DEALLOCATE); |
@@ -513,6 +555,32 @@ out: | |||
513 | } | 555 | } |
514 | 556 | ||
515 | /* | 557 | /* |
558 | * Decode OFFLOAD_CANCEL response | ||
559 | */ | ||
560 | static int nfs4_xdr_dec_offload_cancel(struct rpc_rqst *rqstp, | ||
561 | struct xdr_stream *xdr, | ||
562 | void *data) | ||
563 | { | ||
564 | struct nfs42_offload_status_res *res = data; | ||
565 | struct compound_hdr hdr; | ||
566 | int status; | ||
567 | |||
568 | status = decode_compound_hdr(xdr, &hdr); | ||
569 | if (status) | ||
570 | goto out; | ||
571 | status = decode_sequence(xdr, &res->osr_seq_res, rqstp); | ||
572 | if (status) | ||
573 | goto out; | ||
574 | status = decode_putfh(xdr); | ||
575 | if (status) | ||
576 | goto out; | ||
577 | status = decode_offload_cancel(xdr, res); | ||
578 | |||
579 | out: | ||
580 | return status; | ||
581 | } | ||
582 | |||
583 | /* | ||
516 | * Decode DEALLOCATE request | 584 | * Decode DEALLOCATE request |
517 | */ | 585 | */ |
518 | static int nfs4_xdr_dec_deallocate(struct rpc_rqst *rqstp, | 586 | static int nfs4_xdr_dec_deallocate(struct rpc_rqst *rqstp, |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 124a9f97c366..b22b41eff9c0 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -9620,6 +9620,7 @@ static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = { | |||
9620 | | NFS_CAP_LGOPEN | 9620 | | NFS_CAP_LGOPEN |
9621 | | NFS_CAP_ALLOCATE | 9621 | | NFS_CAP_ALLOCATE |
9622 | | NFS_CAP_COPY | 9622 | | NFS_CAP_COPY |
9623 | | NFS_CAP_OFFLOAD_CANCEL | ||
9623 | | NFS_CAP_DEALLOCATE | 9624 | | NFS_CAP_DEALLOCATE |
9624 | | NFS_CAP_SEEK | 9625 | | NFS_CAP_SEEK |
9625 | | NFS_CAP_LAYOUTSTATS | 9626 | | NFS_CAP_LAYOUTSTATS |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index cd41d2577a04..b7bde12d8cd5 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -7789,6 +7789,7 @@ const struct rpc_procinfo nfs4_procedures[] = { | |||
7789 | PROC42(LAYOUTSTATS, enc_layoutstats, dec_layoutstats), | 7789 | PROC42(LAYOUTSTATS, enc_layoutstats, dec_layoutstats), |
7790 | PROC42(CLONE, enc_clone, dec_clone), | 7790 | PROC42(CLONE, enc_clone, dec_clone), |
7791 | PROC42(COPY, enc_copy, dec_copy), | 7791 | PROC42(COPY, enc_copy, dec_copy), |
7792 | PROC42(OFFLOAD_CANCEL, enc_offload_cancel, dec_offload_cancel), | ||
7792 | PROC(LOOKUPP, enc_lookupp, dec_lookupp), | 7793 | PROC(LOOKUPP, enc_lookupp, dec_lookupp), |
7793 | }; | 7794 | }; |
7794 | 7795 | ||
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 57ffaa20d564..c44b87293229 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h | |||
@@ -527,6 +527,7 @@ enum { | |||
527 | NFSPROC4_CLNT_LAYOUTSTATS, | 527 | NFSPROC4_CLNT_LAYOUTSTATS, |
528 | NFSPROC4_CLNT_CLONE, | 528 | NFSPROC4_CLNT_CLONE, |
529 | NFSPROC4_CLNT_COPY, | 529 | NFSPROC4_CLNT_COPY, |
530 | NFSPROC4_CLNT_OFFLOAD_CANCEL, | ||
530 | 531 | ||
531 | NFSPROC4_CLNT_LOOKUPP, | 532 | NFSPROC4_CLNT_LOOKUPP, |
532 | }; | 533 | }; |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 2c18d618604e..fbc735f08d7e 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -255,5 +255,6 @@ struct nfs_server { | |||
255 | #define NFS_CAP_LAYOUTSTATS (1U << 22) | 255 | #define NFS_CAP_LAYOUTSTATS (1U << 22) |
256 | #define NFS_CAP_CLONE (1U << 23) | 256 | #define NFS_CAP_CLONE (1U << 23) |
257 | #define NFS_CAP_COPY (1U << 24) | 257 | #define NFS_CAP_COPY (1U << 24) |
258 | #define NFS_CAP_OFFLOAD_CANCEL (1U << 25) | ||
258 | 259 | ||
259 | #endif | 260 | #endif |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 3b7325cfb291..85e928a56cef 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -1403,6 +1403,18 @@ struct nfs42_copy_res { | |||
1403 | struct nfs_commitres commit_res; | 1403 | struct nfs_commitres commit_res; |
1404 | }; | 1404 | }; |
1405 | 1405 | ||
1406 | struct nfs42_offload_status_args { | ||
1407 | struct nfs4_sequence_args osa_seq_args; | ||
1408 | struct nfs_fh *osa_src_fh; | ||
1409 | nfs4_stateid osa_stateid; | ||
1410 | }; | ||
1411 | |||
1412 | struct nfs42_offload_status_res { | ||
1413 | struct nfs4_sequence_res osr_seq_res; | ||
1414 | uint64_t osr_count; | ||
1415 | int osr_status; | ||
1416 | }; | ||
1417 | |||
1406 | struct nfs42_seek_args { | 1418 | struct nfs42_seek_args { |
1407 | struct nfs4_sequence_args seq_args; | 1419 | struct nfs4_sequence_args seq_args; |
1408 | 1420 | ||