diff options
| author | Rajesh Amaravathi <rajesh@redhat.com> | 2012-04-12 14:49:44 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2012-05-17 02:12:49 -0700 | 
| commit | cbcf82aa58058fe05dbd9a8d8879ca0364e5df95 (patch) | |
| tree | 83c7dc8da592fb0442d5626eac6779c813d61655 /rpc | |
| parent | d8ede99e6f429d3a63b794c495f99fc8f76e9651 (diff) | |
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 <rajesh@redhat.com>
Reviewed-on: http://review.gluster.com/3212
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Krishna Srinivas <krishna@gluster.com>
Diffstat (limited to 'rpc')
| -rw-r--r-- | rpc/xdr/src/msg-nfs3.c | 20 | ||||
| -rw-r--r-- | rpc/xdr/src/msg-nfs3.h | 9 | ||||
| -rw-r--r-- | rpc/xdr/src/nlm4-xdr.c | 11 | ||||
| -rw-r--r-- | rpc/xdr/src/nlm4-xdr.h | 9 | ||||
| -rw-r--r-- | rpc/xdr/src/nlm4.x | 9 | 
5 files changed, 56 insertions, 2 deletions
diff --git a/rpc/xdr/src/msg-nfs3.c b/rpc/xdr/src/msg-nfs3.c index f800b3128fa..8078f23f097 100644 --- a/rpc/xdr/src/msg-nfs3.c +++ b/rpc/xdr/src/msg-nfs3.c @@ -517,6 +517,20 @@ xdr_to_nlm4_unlockargs (struct iovec inmsg, nlm4_unlockargs *args)  }  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)  {          return xdr_serialize_generic (outmsg, (void*)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 1310e02f897..701df300a6e 100644 --- a/rpc/xdr/src/msg-nfs3.h +++ b/rpc/xdr/src/msg-nfs3.h @@ -203,9 +203,18 @@ 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 b41fbb15cac..4cf6a51e8fd 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 d95a6ad6e58..3799f6b1d98 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 d738b27770d..a6de6f32bf4 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<MAXNAMELEN>; +	string caller_name<LM_MAXSTRLEN>;  	netobj fh;  	netobj oh;  	u_int32_t svid; @@ -83,7 +83,7 @@ struct nlm4_lock {  };  struct nlm4_share { -	string caller_name<MAXNAMELEN>; +	string caller_name<LM_MAXSTRLEN>;  	netobj fh;  	netobj oh;  	fsh_mode mode; @@ -146,6 +146,11 @@ struct	nlm4_shareres {  	int	sequence;  }; +struct  nlm4_freeallargs { +        string       name<LM_MAXSTRLEN>;   /* client hostname */ +        uint32       state;                /* unused */ +}; +  /*   * argument for the procedure called by rpc.statd when a monitored host   * status change.  | 
