summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlga Kornievskaia <kolga@netapp.com>2018-07-09 15:13:29 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2018-08-09 12:56:38 -0400
commitcb95deea0b4aa5c7c7423f4e075a3ddcd59e710b (patch)
tree67ad6bd3f1fe9cc92d51d93fed22ab05a087cd61
parent5178a125f6d5fb0720315ea4f7cca642fb936031 (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.c68
-rw-r--r--fs/nfs/nfs4proc.c1
-rw-r--r--fs/nfs/nfs4xdr.c1
-rw-r--r--include/linux/nfs4.h1
-rw-r--r--include/linux/nfs_fs_sb.h1
-rw-r--r--include/linux/nfs_xdr.h12
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
157static 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
148static void encode_deallocate(struct xdr_stream *xdr, 165static 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 */
283static 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 */
266static void nfs4_xdr_enc_deallocate(struct rpc_rqst *req, 302static 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
452static 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
416static int decode_deallocate(struct xdr_stream *xdr, struct nfs42_falloc_res *res) 458static 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 */
560static 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
579out:
580 return status;
581}
582
583/*
516 * Decode DEALLOCATE request 584 * Decode DEALLOCATE request
517 */ 585 */
518static int nfs4_xdr_dec_deallocate(struct rpc_rqst *rqstp, 586static 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
1406struct 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
1412struct nfs42_offload_status_res {
1413 struct nfs4_sequence_res osr_seq_res;
1414 uint64_t osr_count;
1415 int osr_status;
1416};
1417
1406struct nfs42_seek_args { 1418struct nfs42_seek_args {
1407 struct nfs4_sequence_args seq_args; 1419 struct nfs4_sequence_args seq_args;
1408 1420