[PATCH] minorversion 1 xdr infrastructure for nfsv4.1 callbacks

Benny Halevy bhalevy at ns1.bhalevy.com
Mon May 7 12:35:06 EDT 2007


todo: for v4.1 must send cb_sequence first
---
 fs/nfsd/nfs4callback.c     |   23 ++++++++++++++++-------
 fs/nfsd/nfs4state.c        |    4 ++++
 include/linux/nfs4.h       |    1 -
 include/linux/nfsd/state.h |    4 +++-
 4 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index c2f4732..6caca21 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -84,8 +84,8 @@ enum nfs_cb_opnum4 {
 #define NFS4_dec_cb_recall_sz		(cb_compound_dec_hdr_sz  +      \
 					op_dec_sz)
 #define NFS4_enc_cb_layout_sz		(cb_compound_enc_hdr_sz +       \
-					1 + enc_stateid_sz +            \
-					enc_nfs4_fh_sz)
+					1 + 3 +                         \
+					enc_nfs4_fh_sz + 4)
 
 #define NFS4_dec_cb_layout_sz		(cb_compound_dec_hdr_sz  +      \
 					op_dec_sz)
@@ -150,9 +150,13 @@ xdr_error:                                      \
 } while (0)
 
 struct nfs4_cb_compound_hdr {
-	int		status;
-	u32		ident;
+	/* args */
+	u32		minorversion;
+	u32		ident;		/* minorversion 0 only */
 	u32		nops;
+
+	/* res */
+	int		status;
 	u32		taglen;
 	char *		tag;
 };
@@ -221,8 +225,10 @@ encode_cb_compound_hdr(struct xdr_stream *xdr, struct nfs4_cb_compound_hdr *hdr)
 
 	RESERVE_SPACE(16);
 	WRITE32(0);            /* tag length is always 0 */
-	WRITE32(NFS4_MINOR_VERSION);
-	WRITE32(hdr->ident);
+	WRITE32(hdr->minorversion);
+	if (hdr->minorversion == 0) {
+		WRITE32(hdr->ident);
+	}
 	WRITE32(hdr->nops);
 	return 0;
 }
@@ -291,6 +297,7 @@ nfs4_xdr_enc_cb_recall(struct rpc_rqst *req, u32 *p, struct nfs4_cb_recall *args
 {
 	struct xdr_stream xdr;
 	struct nfs4_cb_compound_hdr hdr = {
+		.minorversion = args->cbr_minorversion,
 		.ident = args->cbr_ident,
 		.nops   = 1,
 	};
@@ -306,7 +313,8 @@ nfs4_xdr_enc_cb_layout(struct rpc_rqst *req, u32 *p, struct nfs4_cb_layout *args
 	struct xdr_stream xdr;
 
 	struct nfs4_cb_compound_hdr hdr = {
-		.ident = args->cbl_ident,
+		.minorversion = 1,
+		.ident = 0,
 		.nops   = 1,
 	};
 
@@ -588,6 +596,7 @@ nfsd4_cb_recall(struct nfs4_delegation *dp)
 	if (IS_ERR(msg.rpc_cred))
 		goto out;
 
+	cbr->cbr_minorversion = clp->cl_callback.cb_minorversion;
 	cbr->cbr_trunc = 0; /* XXX need to implement truncate optimization */
 	cbr->cbr_dp = dp;
 
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index cd5c212..3d438e4 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1378,6 +1378,10 @@ int nfsd4_create_session(struct svc_rqst *rqstp, struct nfsd4_create_session *se
 		conf = unconf;
 		unconf = NULL;
 	}
+
+	conf->cl_callback.cb_minorversion = 1;
+	conf->cl_callback.cb_prog = session->callback_prog;
+
 	status = alloc_init_session(conf, session);
 
 out_replay:
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h
index c77a9ec..e8ddf14 100644
--- a/include/linux/nfs4.h
+++ b/include/linux/nfs4.h
@@ -399,7 +399,6 @@ enum lock_type4 {
 
 #define NFSPROC4_NULL 0
 #define NFSPROC4_COMPOUND 1
-#define NFS4_MINOR_VERSION 0
 #define NFS4_DEBUG 1
 
 /* Index of predefined Linux client operations */
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index db0ff4d..5040b6f 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -70,6 +70,7 @@ typedef struct {
 
 
 struct nfs4_cb_recall {
+	u32			cbr_minorversion;
 	u32			cbr_ident;
 	int			cbr_trunc;
 	stateid_t		cbr_stateid;
@@ -102,7 +103,8 @@ struct nfs4_callback {
 	u32                     cb_addr;
 	unsigned short          cb_port;
 	u32                     cb_prog;
-	u32                     cb_ident;
+	u32                     cb_minorversion;
+	u32                     cb_ident;   /* minorversion 0 only */
 	/* RPC client info */
 	atomic_t		cb_set;     /* successful CB_NULL call */
 	struct rpc_program      cb_program;
-- 
1.5.1


--------------030804050305050304060404--


More information about the pNFS mailing list