NFSD CB_OFFLOAD xdr
Signed-off-by: Olga Kornievskaia <kolga@netapp.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
		
							parent
							
								
									6bf4ca7fbc
								
							
						
					
					
						commit
						9eb190fca8
					
				@ -39,6 +39,7 @@
 | 
				
			|||||||
#include "state.h"
 | 
					#include "state.h"
 | 
				
			||||||
#include "netns.h"
 | 
					#include "netns.h"
 | 
				
			||||||
#include "xdr4cb.h"
 | 
					#include "xdr4cb.h"
 | 
				
			||||||
 | 
					#include "xdr4.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NFSDDBG_FACILITY                NFSDDBG_PROC
 | 
					#define NFSDDBG_FACILITY                NFSDDBG_PROC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -105,6 +106,7 @@ enum nfs_cb_opnum4 {
 | 
				
			|||||||
	OP_CB_WANTS_CANCELLED		= 12,
 | 
						OP_CB_WANTS_CANCELLED		= 12,
 | 
				
			||||||
	OP_CB_NOTIFY_LOCK		= 13,
 | 
						OP_CB_NOTIFY_LOCK		= 13,
 | 
				
			||||||
	OP_CB_NOTIFY_DEVICEID		= 14,
 | 
						OP_CB_NOTIFY_DEVICEID		= 14,
 | 
				
			||||||
 | 
						OP_CB_OFFLOAD			= 15,
 | 
				
			||||||
	OP_CB_ILLEGAL			= 10044
 | 
						OP_CB_ILLEGAL			= 10044
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -682,6 +684,101 @@ static int nfs4_xdr_dec_cb_notify_lock(struct rpc_rqst *rqstp,
 | 
				
			|||||||
	return decode_cb_op_status(xdr, OP_CB_NOTIFY_LOCK, &cb->cb_status);
 | 
						return decode_cb_op_status(xdr, OP_CB_NOTIFY_LOCK, &cb->cb_status);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * struct write_response4 {
 | 
				
			||||||
 | 
					 *	stateid4	wr_callback_id<1>;
 | 
				
			||||||
 | 
					 *	length4		wr_count;
 | 
				
			||||||
 | 
					 *	stable_how4	wr_committed;
 | 
				
			||||||
 | 
					 *	verifier4	wr_writeverf;
 | 
				
			||||||
 | 
					 * };
 | 
				
			||||||
 | 
					 * union offload_info4 switch (nfsstat4 coa_status) {
 | 
				
			||||||
 | 
					 *	case NFS4_OK:
 | 
				
			||||||
 | 
					 *		write_response4	coa_resok4;
 | 
				
			||||||
 | 
					 *	default:
 | 
				
			||||||
 | 
					 *	length4		coa_bytes_copied;
 | 
				
			||||||
 | 
					 * };
 | 
				
			||||||
 | 
					 * struct CB_OFFLOAD4args {
 | 
				
			||||||
 | 
					 *	nfs_fh4		coa_fh;
 | 
				
			||||||
 | 
					 *	stateid4	coa_stateid;
 | 
				
			||||||
 | 
					 *	offload_info4	coa_offload_info;
 | 
				
			||||||
 | 
					 * };
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void encode_offload_info4(struct xdr_stream *xdr,
 | 
				
			||||||
 | 
									 __be32 nfserr,
 | 
				
			||||||
 | 
									 const struct nfsd4_copy *cp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__be32 *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p = xdr_reserve_space(xdr, 4);
 | 
				
			||||||
 | 
						*p++ = nfserr;
 | 
				
			||||||
 | 
						if (!nfserr) {
 | 
				
			||||||
 | 
							p = xdr_reserve_space(xdr, 4 + 8 + 4 + NFS4_VERIFIER_SIZE);
 | 
				
			||||||
 | 
							p = xdr_encode_empty_array(p);
 | 
				
			||||||
 | 
							p = xdr_encode_hyper(p, cp->cp_res.wr_bytes_written);
 | 
				
			||||||
 | 
							*p++ = cpu_to_be32(cp->cp_res.wr_stable_how);
 | 
				
			||||||
 | 
							p = xdr_encode_opaque_fixed(p, cp->cp_res.wr_verifier.data,
 | 
				
			||||||
 | 
										    NFS4_VERIFIER_SIZE);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							p = xdr_reserve_space(xdr, 8);
 | 
				
			||||||
 | 
							/* We always return success if bytes were written */
 | 
				
			||||||
 | 
							p = xdr_encode_hyper(p, 0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void encode_cb_offload4args(struct xdr_stream *xdr,
 | 
				
			||||||
 | 
									   __be32 nfserr,
 | 
				
			||||||
 | 
									   const struct knfsd_fh *fh,
 | 
				
			||||||
 | 
									   const struct nfsd4_copy *cp,
 | 
				
			||||||
 | 
									   struct nfs4_cb_compound_hdr *hdr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__be32 *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p = xdr_reserve_space(xdr, 4);
 | 
				
			||||||
 | 
						*p++ = cpu_to_be32(OP_CB_OFFLOAD);
 | 
				
			||||||
 | 
						encode_nfs_fh4(xdr, fh);
 | 
				
			||||||
 | 
						encode_stateid4(xdr, &cp->cp_res.cb_stateid);
 | 
				
			||||||
 | 
						encode_offload_info4(xdr, nfserr, cp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hdr->nops++;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void nfs4_xdr_enc_cb_offload(struct rpc_rqst *req,
 | 
				
			||||||
 | 
									    struct xdr_stream *xdr,
 | 
				
			||||||
 | 
									    const void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const struct nfsd4_callback *cb = data;
 | 
				
			||||||
 | 
						const struct nfsd4_copy *cp =
 | 
				
			||||||
 | 
							container_of(cb, struct nfsd4_copy, cp_cb);
 | 
				
			||||||
 | 
						struct nfs4_cb_compound_hdr hdr = {
 | 
				
			||||||
 | 
							.ident = 0,
 | 
				
			||||||
 | 
							.minorversion = cb->cb_clp->cl_minorversion,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						encode_cb_compound4args(xdr, &hdr);
 | 
				
			||||||
 | 
						encode_cb_sequence4args(xdr, cb, &hdr);
 | 
				
			||||||
 | 
						encode_cb_offload4args(xdr, cp->nfserr, &cp->fh, cp, &hdr);
 | 
				
			||||||
 | 
						encode_cb_nops(&hdr);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int nfs4_xdr_dec_cb_offload(struct rpc_rqst *rqstp,
 | 
				
			||||||
 | 
									   struct xdr_stream *xdr,
 | 
				
			||||||
 | 
									   void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct nfsd4_callback *cb = data;
 | 
				
			||||||
 | 
						struct nfs4_cb_compound_hdr hdr;
 | 
				
			||||||
 | 
						int status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						status = decode_cb_compound4res(xdr, &hdr);
 | 
				
			||||||
 | 
						if (unlikely(status))
 | 
				
			||||||
 | 
							return status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (cb) {
 | 
				
			||||||
 | 
							status = decode_cb_sequence4res(xdr, cb);
 | 
				
			||||||
 | 
							if (unlikely(status || cb->cb_seq_status))
 | 
				
			||||||
 | 
								return status;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return decode_cb_op_status(xdr, OP_CB_OFFLOAD, &cb->cb_status);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * RPC procedure tables
 | 
					 * RPC procedure tables
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -703,6 +800,7 @@ static const struct rpc_procinfo nfs4_cb_procedures[] = {
 | 
				
			|||||||
	PROC(CB_LAYOUT,	COMPOUND,	cb_layout,	cb_layout),
 | 
						PROC(CB_LAYOUT,	COMPOUND,	cb_layout,	cb_layout),
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	PROC(CB_NOTIFY_LOCK,	COMPOUND,	cb_notify_lock,	cb_notify_lock),
 | 
						PROC(CB_NOTIFY_LOCK,	COMPOUND,	cb_notify_lock,	cb_notify_lock),
 | 
				
			||||||
 | 
						PROC(CB_OFFLOAD,	COMPOUND,	cb_offload,	cb_offload),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static unsigned int nfs4_cb_counts[ARRAY_SIZE(nfs4_cb_procedures)];
 | 
					static unsigned int nfs4_cb_counts[ARRAY_SIZE(nfs4_cb_procedures)];
 | 
				
			||||||
 | 
				
			|||||||
@ -573,6 +573,7 @@ enum nfsd4_cb_op {
 | 
				
			|||||||
	NFSPROC4_CLNT_CB_NULL = 0,
 | 
						NFSPROC4_CLNT_CB_NULL = 0,
 | 
				
			||||||
	NFSPROC4_CLNT_CB_RECALL,
 | 
						NFSPROC4_CLNT_CB_RECALL,
 | 
				
			||||||
	NFSPROC4_CLNT_CB_LAYOUT,
 | 
						NFSPROC4_CLNT_CB_LAYOUT,
 | 
				
			||||||
 | 
						NFSPROC4_CLNT_CB_OFFLOAD,
 | 
				
			||||||
	NFSPROC4_CLNT_CB_SEQUENCE,
 | 
						NFSPROC4_CLNT_CB_SEQUENCE,
 | 
				
			||||||
	NFSPROC4_CLNT_CB_NOTIFY_LOCK,
 | 
						NFSPROC4_CLNT_CB_NOTIFY_LOCK,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -511,6 +511,7 @@ struct nfsd42_write_res {
 | 
				
			|||||||
	u64			wr_bytes_written;
 | 
						u64			wr_bytes_written;
 | 
				
			||||||
	u32			wr_stable_how;
 | 
						u32			wr_stable_how;
 | 
				
			||||||
	nfs4_verifier		wr_verifier;
 | 
						nfs4_verifier		wr_verifier;
 | 
				
			||||||
 | 
						stateid_t		cb_stateid;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct nfsd4_copy {
 | 
					struct nfsd4_copy {
 | 
				
			||||||
@ -526,6 +527,11 @@ struct nfsd4_copy {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* response */
 | 
						/* response */
 | 
				
			||||||
	struct nfsd42_write_res	cp_res;
 | 
						struct nfsd42_write_res	cp_res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* for cb_offload */
 | 
				
			||||||
 | 
						struct nfsd4_callback	cp_cb;
 | 
				
			||||||
 | 
						__be32			nfserr;
 | 
				
			||||||
 | 
						struct knfsd_fh		fh;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct nfsd4_seek {
 | 
					struct nfsd4_seek {
 | 
				
			||||||
 | 
				
			|||||||
@ -38,3 +38,13 @@
 | 
				
			|||||||
#define NFS4_dec_cb_notify_lock_sz	(cb_compound_dec_hdr_sz  +      \
 | 
					#define NFS4_dec_cb_notify_lock_sz	(cb_compound_dec_hdr_sz  +      \
 | 
				
			||||||
					cb_sequence_dec_sz +            \
 | 
										cb_sequence_dec_sz +            \
 | 
				
			||||||
					op_dec_sz)
 | 
										op_dec_sz)
 | 
				
			||||||
 | 
					#define enc_cb_offload_info_sz		(1 + 1 + 2 + 1 +		\
 | 
				
			||||||
 | 
										XDR_QUADLEN(NFS4_VERIFIER_SIZE))
 | 
				
			||||||
 | 
					#define NFS4_enc_cb_offload_sz		(cb_compound_enc_hdr_sz +       \
 | 
				
			||||||
 | 
										cb_sequence_enc_sz +            \
 | 
				
			||||||
 | 
										enc_nfs4_fh_sz +		\
 | 
				
			||||||
 | 
										enc_stateid_sz +		\
 | 
				
			||||||
 | 
										enc_cb_offload_info_sz)
 | 
				
			||||||
 | 
					#define NFS4_dec_cb_offload_sz		(cb_compound_dec_hdr_sz  +      \
 | 
				
			||||||
 | 
										cb_sequence_dec_sz +            \
 | 
				
			||||||
 | 
										op_dec_sz)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user