Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

NFS: Implement NFSv4.2's OFFLOAD_STATUS XDR

Add XDR encoding and decoding functions for the NFSv4.2
OFFLOAD_STATUS operation.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Link: https://lore.kernel.org/r/20250113153235.48706-13-cel@kernel.org
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>

authored by

Chuck Lever and committed by
Trond Myklebust
8955e7ce 43502f6e

+91 -2
+86
fs/nfs/nfs42xdr.c
··· 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 */ \ ··· 148 143 decode_sequence_maxsz + \ 149 144 decode_putfh_maxsz + \ 150 145 decode_offload_cancel_maxsz) 146 + #define NFS4_enc_offload_status_sz (compound_encode_hdr_maxsz + \ 147 + encode_sequence_maxsz + \ 148 + encode_putfh_maxsz + \ 149 + encode_offload_status_maxsz) 150 + #define NFS4_dec_offload_status_sz (compound_decode_hdr_maxsz + \ 151 + decode_sequence_maxsz + \ 152 + decode_putfh_maxsz + \ 153 + decode_offload_status_maxsz) 151 154 #define NFS4_enc_copy_notify_sz (compound_encode_hdr_maxsz + \ 152 155 encode_sequence_maxsz + \ 153 156 encode_putfh_maxsz + \ ··· 355 342 struct compound_hdr *hdr) 356 343 { 357 344 encode_op_hdr(xdr, OP_OFFLOAD_CANCEL, decode_offload_cancel_maxsz, hdr); 345 + encode_nfs4_stateid(xdr, &args->osa_stateid); 346 + } 347 + 348 + static void encode_offload_status(struct xdr_stream *xdr, 349 + const struct nfs42_offload_status_args *args, 350 + struct compound_hdr *hdr) 351 + { 352 + encode_op_hdr(xdr, OP_OFFLOAD_STATUS, decode_offload_status_maxsz, hdr); 358 353 encode_nfs4_stateid(xdr, &args->osa_stateid); 359 354 } 360 355 ··· 587 566 encode_sequence(xdr, &args->osa_seq_args, &hdr); 588 567 encode_putfh(xdr, args->osa_src_fh, &hdr); 589 568 encode_offload_cancel(xdr, args, &hdr); 569 + encode_nops(&hdr); 570 + } 571 + 572 + /* 573 + * Encode OFFLOAD_STATUS request 574 + */ 575 + static void nfs4_xdr_enc_offload_status(struct rpc_rqst *req, 576 + struct xdr_stream *xdr, 577 + const void *data) 578 + { 579 + const struct nfs42_offload_status_args *args = data; 580 + struct compound_hdr hdr = { 581 + .minorversion = nfs4_xdr_minorversion(&args->osa_seq_args), 582 + }; 583 + 584 + encode_compound_hdr(xdr, req, &hdr); 585 + encode_sequence(xdr, &args->osa_seq_args, &hdr); 586 + encode_putfh(xdr, args->osa_src_fh, &hdr); 587 + encode_offload_status(xdr, args, &hdr); 590 588 encode_nops(&hdr); 591 589 } 592 590 ··· 959 919 struct nfs42_offload_status_res *res) 960 920 { 961 921 return decode_op_hdr(xdr, OP_OFFLOAD_CANCEL); 922 + } 923 + 924 + static int decode_offload_status(struct xdr_stream *xdr, 925 + struct nfs42_offload_status_res *res) 926 + { 927 + ssize_t result; 928 + int status; 929 + 930 + status = decode_op_hdr(xdr, OP_OFFLOAD_STATUS); 931 + if (status) 932 + return status; 933 + /* osr_count */ 934 + if (xdr_stream_decode_u64(xdr, &res->osr_count) < 0) 935 + return -EIO; 936 + /* osr_complete<1> */ 937 + result = xdr_stream_decode_uint32_array(xdr, &res->osr_complete, 1); 938 + if (result < 0) 939 + return -EIO; 940 + res->complete_count = result; 941 + return 0; 962 942 } 963 943 964 944 static int decode_copy_notify(struct xdr_stream *xdr, ··· 1425 1365 if (status) 1426 1366 goto out; 1427 1367 status = decode_offload_cancel(xdr, res); 1368 + 1369 + out: 1370 + return status; 1371 + } 1372 + 1373 + /* 1374 + * Decode OFFLOAD_STATUS response 1375 + */ 1376 + static int nfs4_xdr_dec_offload_status(struct rpc_rqst *rqstp, 1377 + struct xdr_stream *xdr, 1378 + void *data) 1379 + { 1380 + struct nfs42_offload_status_res *res = data; 1381 + struct compound_hdr hdr; 1382 + int status; 1383 + 1384 + status = decode_compound_hdr(xdr, &hdr); 1385 + if (status) 1386 + goto out; 1387 + status = decode_sequence(xdr, &res->osr_seq_res, rqstp); 1388 + if (status) 1389 + goto out; 1390 + status = decode_putfh(xdr); 1391 + if (status) 1392 + goto out; 1393 + status = decode_offload_status(xdr, res); 1428 1394 1429 1395 out: 1430 1396 return status;
+1
fs/nfs/nfs4xdr.c
··· 7702 7702 PROC42(CLONE, enc_clone, dec_clone), 7703 7703 PROC42(COPY, enc_copy, dec_copy), 7704 7704 PROC42(OFFLOAD_CANCEL, enc_offload_cancel, dec_offload_cancel), 7705 + PROC42(OFFLOAD_STATUS, enc_offload_status, dec_offload_status), 7705 7706 PROC42(COPY_NOTIFY, enc_copy_notify, dec_copy_notify), 7706 7707 PROC(LOOKUPP, enc_lookupp, dec_lookupp), 7707 7708 PROC42(LAYOUTERROR, enc_layouterror, dec_layouterror),
+1
include/linux/nfs4.h
··· 691 691 NFSPROC4_CLNT_LISTXATTRS, 692 692 NFSPROC4_CLNT_REMOVEXATTR, 693 693 NFSPROC4_CLNT_READ_PLUS, 694 + NFSPROC4_CLNT_OFFLOAD_STATUS, 694 695 }; 695 696 696 697 /* nfs41 types */
+3 -2
include/linux/nfs_xdr.h
··· 1515 1515 1516 1516 struct nfs42_offload_status_res { 1517 1517 struct nfs4_sequence_res osr_seq_res; 1518 - uint64_t osr_count; 1519 - int osr_status; 1518 + u64 osr_count; 1519 + int complete_count; 1520 + u32 osr_complete; 1520 1521 }; 1521 1522 1522 1523 struct nfs42_copy_notify_args {