From cbcf82aa58058fe05dbd9a8d8879ca0364e5df95 Mon Sep 17 00:00:00 2001 From: Rajesh Amaravathi Date: Thu, 12 Apr 2012 14:49:44 +0530 Subject: nfs/nlm: procedures for PC clients * This change introduces four NLMv4 procedures: NM_LOCK, SHARE, UNSHARE and FREE_ALL. These are used by PC clients (windows/dos) to control access to files. 1. NM_LOCK: this lock is not monitored by statd. 2. SHARE: A share reservation is a lock on the whole file that is taken whenever a file is opened on windows clients. This has ACCESS (N, R, W, RW) and DENY MODE (N, R, W, RW). ACCESS: mode of access requested by the client; DENY MODE: what the requesting client wants to deny other clients. 3. UNSHARE: remove a share reservation obtained by SHARE. Called while closing a file. 4. FREE_ALL: remove all share reservations and locks, both monitored and unmonitored, of the calling client. * lock and nm_lock use a common function with only a flag conveying whether or not to monitor a lock. * NOTES: 1. SHARE reservations are not STACK_WIND'd to subsequent xlators. These are maintained in-memory in the nfs xlator. 2. Consequently, for SHARE reservations to work effectively, all PC clients *must* mount from the same gNfs server. Not doing so will result in different servers maintaining separate SHARE reservations which will not be enforced for obvious reasons. Change-Id: Id4f22670a94ed58691a6a7f4c80aa8c11421a277 BUG: 800287 Signed-off-by: Rajesh Amaravathi Reviewed-on: http://review.gluster.com/3212 Tested-by: Gluster Build System Reviewed-by: Krishna Srinivas --- rpc/xdr/src/msg-nfs3.c | 20 ++++++++++++++++++++ rpc/xdr/src/msg-nfs3.h | 9 +++++++++ rpc/xdr/src/nlm4-xdr.c | 11 +++++++++++ rpc/xdr/src/nlm4-xdr.h | 9 +++++++++ rpc/xdr/src/nlm4.x | 9 +++++++-- 5 files changed, 56 insertions(+), 2 deletions(-) (limited to 'rpc/xdr') diff --git a/rpc/xdr/src/msg-nfs3.c b/rpc/xdr/src/msg-nfs3.c index f800b3128..8078f23f0 100644 --- a/rpc/xdr/src/msg-nfs3.c +++ b/rpc/xdr/src/msg-nfs3.c @@ -516,6 +516,20 @@ xdr_to_nlm4_unlockargs (struct iovec inmsg, nlm4_unlockargs *args) (xdrproc_t)xdr_nlm4_unlockargs); } +ssize_t +xdr_to_nlm4_shareargs (struct iovec inmsg, nlm4_shareargs *args) +{ + return xdr_to_generic (inmsg, (void*)args, + (xdrproc_t)xdr_nlm4_shareargs); +} + +ssize_t +xdr_serialize_nlm4_shareres (struct iovec outmsg, nlm4_shareres *res) +{ + return xdr_serialize_generic (outmsg, (void *)res, + (xdrproc_t)xdr_nlm4_shareres); +} + ssize_t xdr_serialize_nlm4_testargs (struct iovec outmsg, nlm4_testargs *args) { @@ -530,3 +544,9 @@ xdr_to_nlm4_res (struct iovec inmsg, nlm4_res *args) (xdrproc_t)xdr_nlm4_res); } +ssize_t +xdr_to_nlm4_freeallargs (struct iovec inmsg, nlm4_freeallargs *args) +{ + return xdr_to_generic (inmsg, (void*)args, + (xdrproc_t)xdr_nlm4_freeallargs); +} diff --git a/rpc/xdr/src/msg-nfs3.h b/rpc/xdr/src/msg-nfs3.h index 1310e02f8..701df300a 100644 --- a/rpc/xdr/src/msg-nfs3.h +++ b/rpc/xdr/src/msg-nfs3.h @@ -202,10 +202,19 @@ xdr_to_nlm4_cancelargs (struct iovec inmsg, nlm4_cancargs *args); extern ssize_t xdr_to_nlm4_unlockargs (struct iovec inmsg, nlm4_unlockargs *args); +extern ssize_t +xdr_to_nlm4_shareargs (struct iovec inmsg, nlm4_shareargs *args); + +extern ssize_t +xdr_serialize_nlm4_shareres (struct iovec outmsg, nlm4_shareres *res); + extern ssize_t xdr_serialize_nlm4_testargs (struct iovec outmsg, nlm4_testargs *args); extern ssize_t xdr_to_nlm4_res (struct iovec inmsg, nlm4_res *args); +extern ssize_t +xdr_to_nlm4_freeallargs (struct iovec inmsg, nlm4_freeallargs *args); + #endif diff --git a/rpc/xdr/src/nlm4-xdr.c b/rpc/xdr/src/nlm4-xdr.c index b41fbb15c..4cf6a51e8 100644 --- a/rpc/xdr/src/nlm4-xdr.c +++ b/rpc/xdr/src/nlm4-xdr.c @@ -228,6 +228,17 @@ xdr_nlm4_shareres (XDR *xdrs, nlm4_shareres *objp) return TRUE; } +bool_t +xdr_nlm4_freeallargs (XDR *xdrs, nlm4_freeallargs *objp) +{ + if (!xdr_string (xdrs, &objp->name, LM_MAXSTRLEN)) + return FALSE; + if (!xdr_uint32_t (xdrs, &objp->state)) + return FALSE; + return TRUE; +} + + /* bool_t xdr_nlm_sm_status (XDR *xdrs, nlm_sm_status *objp) diff --git a/rpc/xdr/src/nlm4-xdr.h b/rpc/xdr/src/nlm4-xdr.h index d95a6ad6e..3799f6b1d 100644 --- a/rpc/xdr/src/nlm4-xdr.h +++ b/rpc/xdr/src/nlm4-xdr.h @@ -183,6 +183,13 @@ struct nlm4_shareres { }; typedef struct nlm4_shareres nlm4_shareres; +struct nlm4_freeallargs { + char *name; + u_int32_t state; +}; +typedef struct nlm4_freeallargs nlm4_freeallargs; + + #define NLM4_NULL 0 #define NLM4_TEST 1 #define NLM4_LOCK 2 @@ -229,6 +236,7 @@ extern bool_t xdr_nlm4_cancargs (XDR *, nlm4_cancargs*); extern bool_t xdr_nlm4_unlockargs (XDR *, nlm4_unlockargs*); extern bool_t xdr_nlm4_shareargs (XDR *, nlm4_shareargs*); extern bool_t xdr_nlm4_shareres (XDR *, nlm4_shareres*); +extern bool_t xdr_nlm4_freeallargs (XDR *, nlm4_freeallargs*); #else /* K&R C */ extern bool_t xdr_netobj (); @@ -248,6 +256,7 @@ extern bool_t xdr_nlm4_cancargs (); extern bool_t xdr_nlm4_unlockargs (); extern bool_t xdr_nlm4_shareargs (); extern bool_t xdr_nlm4_shareres (); +extern bool_t xdr_nlm4_freeallargs (); #endif /* K&R C */ diff --git a/rpc/xdr/src/nlm4.x b/rpc/xdr/src/nlm4.x index d738b2777..a6de6f32b 100644 --- a/rpc/xdr/src/nlm4.x +++ b/rpc/xdr/src/nlm4.x @@ -74,7 +74,7 @@ struct nlm4_holder { }; struct nlm4_lock { - string caller_name; + string caller_name; netobj fh; netobj oh; u_int32_t svid; @@ -83,7 +83,7 @@ struct nlm4_lock { }; struct nlm4_share { - string caller_name; + string caller_name; netobj fh; netobj oh; fsh_mode mode; @@ -146,6 +146,11 @@ struct nlm4_shareres { int sequence; }; +struct nlm4_freeallargs { + string name; /* client hostname */ + uint32 state; /* unused */ +}; + /* * argument for the procedure called by rpc.statd when a monitored host * status change. -- cgit