diff options
| author | Amar Tumballi <amar@gluster.com> | 2012-01-17 05:28:51 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2012-01-24 20:14:17 -0800 | 
| commit | b02afc6d008f9959db28244eb2b9dd3b9ef92393 (patch) | |
| tree | c0bad790fb34f8ab2747b480d334cf9af75c5514 /rpc/xdr/src | |
| parent | 0694749c3e5039be327110a64dd66619b5d9121c (diff) | |
core: change lk-owner as a 1k buffer
so, NLM can send the lk-owner field directly to the locks translators,
while doing the same effort, also enabled sending maximum of 500 aux gid
over protocol.
Change-Id: I87c2514392748416f7ffe21d5154faad2e413969
Signed-off-by: Amar Tumballi <amar@gluster.com>
BUG: 767229
Reviewed-on: http://review.gluster.com/779
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@gluster.com>
Diffstat (limited to 'rpc/xdr/src')
| -rw-r--r-- | rpc/xdr/src/Makefile.am | 4 | ||||
| -rw-r--r-- | rpc/xdr/src/glusterfs3-xdr.c | 2 | ||||
| -rw-r--r-- | rpc/xdr/src/glusterfs3-xdr.h | 5 | ||||
| -rw-r--r-- | rpc/xdr/src/glusterfs3-xdr.x | 2 | ||||
| -rw-r--r-- | rpc/xdr/src/glusterfs3.h | 10 | ||||
| -rw-r--r-- | rpc/xdr/src/msg-nfs3.c | 78 | ||||
| -rw-r--r-- | rpc/xdr/src/rpc-common-xdr.c | 232 | ||||
| -rw-r--r-- | rpc/xdr/src/rpc-common-xdr.h | 113 | ||||
| -rw-r--r-- | rpc/xdr/src/rpc-common-xdr.x | 39 | 
9 files changed, 400 insertions, 85 deletions
diff --git a/rpc/xdr/src/Makefile.am b/rpc/xdr/src/Makefile.am index cabab3db62d..57c19338782 100644 --- a/rpc/xdr/src/Makefile.am +++ b/rpc/xdr/src/Makefile.am @@ -9,14 +9,14 @@ libgfxdr_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 \  libgfxdr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \  		$(top_builddir)/rpc/rpc-lib/src/libgfrpc.la -libgfxdr_la_SOURCES =  xdr-generic.c \ +libgfxdr_la_SOURCES =  xdr-generic.c rpc-common-xdr.c \  			glusterfs3-xdr.c \  			cli1-xdr.c \  			glusterd1-xdr.c \  			portmap-xdr.c \  			xdr-nfs3.c msg-nfs3.c -noinst_HEADERS = xdr-generic.h \ +noinst_HEADERS = xdr-generic.h rpc-common-xdr.h \  		glusterfs3-xdr.h glusterfs3.h \  		cli1-xdr.h \  		glusterd1-xdr.h \ diff --git a/rpc/xdr/src/glusterfs3-xdr.c b/rpc/xdr/src/glusterfs3-xdr.c index 64e504f46f6..62cff241d77 100644 --- a/rpc/xdr/src/glusterfs3-xdr.c +++ b/rpc/xdr/src/glusterfs3-xdr.c @@ -80,7 +80,7 @@ xdr_gf_proto_flock (XDR *xdrs, gf_proto_flock *objp)  		 return FALSE;  	 if (!xdr_u_int (xdrs, &objp->pid))  		 return FALSE; -	 if (!xdr_u_quad_t (xdrs, &objp->owner)) +	 if (!xdr_bytes (xdrs, (char **)&objp->lk_owner.lk_owner_val, (u_int *) &objp->lk_owner.lk_owner_len, ~0))  		 return FALSE;  	return TRUE;  } diff --git a/rpc/xdr/src/glusterfs3-xdr.h b/rpc/xdr/src/glusterfs3-xdr.h index 0c8af17d2cf..d9cf7926f96 100644 --- a/rpc/xdr/src/glusterfs3-xdr.h +++ b/rpc/xdr/src/glusterfs3-xdr.h @@ -63,7 +63,10 @@ struct gf_proto_flock {  	u_quad_t start;  	u_quad_t len;  	u_int pid; -	u_quad_t owner; +	struct { +		u_int lk_owner_len; +		char *lk_owner_val; +	} lk_owner;  };  typedef struct gf_proto_flock gf_proto_flock; diff --git a/rpc/xdr/src/glusterfs3-xdr.x b/rpc/xdr/src/glusterfs3-xdr.x index 592f7ed70c4..131feff1bab 100644 --- a/rpc/xdr/src/glusterfs3-xdr.x +++ b/rpc/xdr/src/glusterfs3-xdr.x @@ -19,7 +19,7 @@ struct gf_proto_flock {  	unsigned hyper start;  	unsigned hyper len;          unsigned int   pid; -        unsigned hyper owner; +        opaque         lk_owner<>;  } ; diff --git a/rpc/xdr/src/glusterfs3.h b/rpc/xdr/src/glusterfs3.h index ba64a0b4508..82a9e200189 100644 --- a/rpc/xdr/src/glusterfs3.h +++ b/rpc/xdr/src/glusterfs3.h @@ -197,7 +197,11 @@ gf_proto_flock_to_flock (struct gf_proto_flock *gf_proto_flock, struct gf_flock  	gf_flock->l_start    = gf_proto_flock->start;  	gf_flock->l_len      = gf_proto_flock->len;  	gf_flock->l_pid      = gf_proto_flock->pid; -	gf_flock->l_owner    = gf_proto_flock->owner; +        gf_flock->l_owner.len = gf_proto_flock->lk_owner.lk_owner_len; +        if (gf_flock->l_owner.len && +            (gf_flock->l_owner.len < GF_MAX_LOCK_OWNER_LEN)) +                memcpy (gf_flock->l_owner.data, gf_proto_flock->lk_owner.lk_owner_val, +                        gf_flock->l_owner.len);  } @@ -212,7 +216,9 @@ gf_proto_flock_from_flock (struct gf_proto_flock *gf_proto_flock, struct gf_floc  	gf_proto_flock->start    =  (gf_flock->l_start);  	gf_proto_flock->len      =  (gf_flock->l_len);  	gf_proto_flock->pid      =  (gf_flock->l_pid); -	gf_proto_flock->owner    =  (gf_flock->l_owner); +	gf_proto_flock->lk_owner.lk_owner_len =  gf_flock->l_owner.len; +        if (gf_flock->l_owner.len) +                gf_proto_flock->lk_owner.lk_owner_val = gf_flock->l_owner.data;  }  static inline void diff --git a/rpc/xdr/src/msg-nfs3.c b/rpc/xdr/src/msg-nfs3.c index d760d43b5d2..5fc92123cee 100644 --- a/rpc/xdr/src/msg-nfs3.c +++ b/rpc/xdr/src/msg-nfs3.c @@ -63,84 +63,6 @@ ret:          return ret;  } -/* -ssize_t -xdr_serialize_generic (struct iovec outmsg, void *res, xdrproc_t proc) -{ -        ssize_t ret = -1; -        XDR     xdr; - -        if ((!outmsg.iov_base) || (!res) || (!proc)) -                return -1; - -        xdrmem_create (&xdr, outmsg.iov_base, (unsigned int)outmsg.iov_len, -                       XDR_ENCODE); - -        if (!proc (&xdr, res)) { -                ret = -1; -                goto ret; -        } - -        ret = xdr_encoded_length (xdr); - -ret: -        return ret; -} - - -ssize_t -xdr_to_generic (struct iovec inmsg, void *args, xdrproc_t proc) -{ -        XDR     xdr; -        ssize_t ret = -1; - -        if ((!inmsg.iov_base) || (!args) || (!proc)) -                return -1; - -        xdrmem_create (&xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len, -                       XDR_DECODE); - -        if (!proc (&xdr, args)) { -                ret  = -1; -                goto ret; -        } - -        ret = xdr_decoded_length (xdr); -ret: -        return ret; -} - - -ssize_t -xdr_to_generic_payload (struct iovec inmsg, void *args, xdrproc_t proc, -                            struct iovec *pendingpayload) -{ -        XDR     xdr; -        ssize_t ret = -1; - -        if ((!inmsg.iov_base) || (!args) || (!proc)) -                return -1; - -        xdrmem_create (&xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len, -                       XDR_DECODE); - -        if (!proc (&xdr, args)) { -                ret  = -1; -                goto ret; -        } - -        ret = xdr_decoded_length (xdr); - -        if (pendingpayload) { -                pendingpayload->iov_base = xdr_decoded_remaining_addr (xdr); -                pendingpayload->iov_len = xdr_decoded_remaining_len (xdr); -        } - -ret: -        return ret; -} -*/ -  /* Translate the mountres3 structure in res into XDR format into memory   * referenced by outmsg.iov_base.   * Returns the number of bytes used in encoding into XDR format. diff --git a/rpc/xdr/src/rpc-common-xdr.c b/rpc/xdr/src/rpc-common-xdr.c new file mode 100644 index 00000000000..14ddea71537 --- /dev/null +++ b/rpc/xdr/src/rpc-common-xdr.c @@ -0,0 +1,232 @@ +/* +  Copyright (c) 2007-2011 Gluster, Inc. <http://www.gluster.com> +  This file is part of GlusterFS. + +  GlusterFS is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published +  by the Free Software Foundation; either version 3 of the License, +  or (at your option) any later version. + +  GlusterFS is distributed in the hope that it will be useful, but +  WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  General Public License for more details. + +  You should have received a copy of the GNU General Public License +  along with this program.  If not, see +  <http://www.gnu.org/licenses/>. +*/ + +#include "xdr-common.h" +#include "compat.h" + +#if defined(__GNUC__) +#if __GNUC__ >= 4 +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif +#endif + +/* + * Please do not edit this file. + * It was generated using rpcgen. + */ + +#include "rpc-common-xdr.h" + +bool_t +xdr_auth_glusterfs_parms_v2 (XDR *xdrs, auth_glusterfs_parms_v2 *objp) +{ +	register int32_t *buf; +        buf = NULL; + + +	if (xdrs->x_op == XDR_ENCODE) { +		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); +		if (buf == NULL) { +			 if (!xdr_int (xdrs, &objp->pid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->uid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->gid)) +				 return FALSE; + +		} else { +		IXDR_PUT_LONG(buf, objp->pid); +		IXDR_PUT_U_LONG(buf, objp->uid); +		IXDR_PUT_U_LONG(buf, objp->gid); +		} +		 if (!xdr_array (xdrs, (char **)&objp->groups.groups_val, (u_int *) &objp->groups.groups_len, ~0, +			sizeof (u_int), (xdrproc_t) xdr_u_int)) +			 return FALSE; +		 if (!xdr_bytes (xdrs, (char **)&objp->lk_owner.lk_owner_val, (u_int *) &objp->lk_owner.lk_owner_len, ~0)) +			 return FALSE; +		return TRUE; +	} else if (xdrs->x_op == XDR_DECODE) { +		buf = XDR_INLINE (xdrs, 3 * BYTES_PER_XDR_UNIT); +		if (buf == NULL) { +			 if (!xdr_int (xdrs, &objp->pid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->uid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->gid)) +				 return FALSE; + +		} else { +		objp->pid = IXDR_GET_LONG(buf); +		objp->uid = IXDR_GET_U_LONG(buf); +		objp->gid = IXDR_GET_U_LONG(buf); +		} +		 if (!xdr_array (xdrs, (char **)&objp->groups.groups_val, (u_int *) &objp->groups.groups_len, ~0, +			sizeof (u_int), (xdrproc_t) xdr_u_int)) +			 return FALSE; +		 if (!xdr_bytes (xdrs, (char **)&objp->lk_owner.lk_owner_val, (u_int *) &objp->lk_owner.lk_owner_len, ~0)) +			 return FALSE; +	 return TRUE; +	} + +	 if (!xdr_int (xdrs, &objp->pid)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->uid)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->gid)) +		 return FALSE; +	 if (!xdr_array (xdrs, (char **)&objp->groups.groups_val, (u_int *) &objp->groups.groups_len, ~0, +		sizeof (u_int), (xdrproc_t) xdr_u_int)) +		 return FALSE; +	 if (!xdr_bytes (xdrs, (char **)&objp->lk_owner.lk_owner_val, (u_int *) &objp->lk_owner.lk_owner_len, ~0)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_auth_glusterfs_parms (XDR *xdrs, auth_glusterfs_parms *objp) +{ +	register int32_t *buf; +        int i; +        buf = NULL; + + +	if (xdrs->x_op == XDR_ENCODE) { +		 if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) +			 return FALSE; +		buf = XDR_INLINE (xdrs, (4 +  16 )* BYTES_PER_XDR_UNIT); +		if (buf == NULL) { +			 if (!xdr_u_int (xdrs, &objp->pid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->uid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->gid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->ngrps)) +				 return FALSE; +			 if (!xdr_vector (xdrs, (char *)objp->groups, 16, +				sizeof (u_int), (xdrproc_t) xdr_u_int)) +				 return FALSE; +		} else { +			IXDR_PUT_U_LONG(buf, objp->pid); +			IXDR_PUT_U_LONG(buf, objp->uid); +			IXDR_PUT_U_LONG(buf, objp->gid); +			IXDR_PUT_U_LONG(buf, objp->ngrps); +			{ +				register u_int *genp; + +				for (i = 0, genp = objp->groups; +					i < 16; ++i) { +					IXDR_PUT_U_LONG(buf, *genp++); +				} +			} +		} +		return TRUE; +	} else if (xdrs->x_op == XDR_DECODE) { +		 if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) +			 return FALSE; +		buf = XDR_INLINE (xdrs, (4 +  16 )* BYTES_PER_XDR_UNIT); +		if (buf == NULL) { +			 if (!xdr_u_int (xdrs, &objp->pid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->uid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->gid)) +				 return FALSE; +			 if (!xdr_u_int (xdrs, &objp->ngrps)) +				 return FALSE; +			 if (!xdr_vector (xdrs, (char *)objp->groups, 16, +				sizeof (u_int), (xdrproc_t) xdr_u_int)) +				 return FALSE; +		} else { +			objp->pid = IXDR_GET_U_LONG(buf); +			objp->uid = IXDR_GET_U_LONG(buf); +			objp->gid = IXDR_GET_U_LONG(buf); +			objp->ngrps = IXDR_GET_U_LONG(buf); +			{ +				register u_int *genp; + +				for (i = 0, genp = objp->groups; +					i < 16; ++i) { +					*genp++ = IXDR_GET_U_LONG(buf); +				} +			} +		} +	 return TRUE; +	} + +	 if (!xdr_u_quad_t (xdrs, &objp->lk_owner)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->pid)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->uid)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->gid)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->ngrps)) +		 return FALSE; +	 if (!xdr_vector (xdrs, (char *)objp->groups, 16, +		sizeof (u_int), (xdrproc_t) xdr_u_int)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_gf_dump_req (XDR *xdrs, gf_dump_req *objp) +{ +	register int32_t *buf; +        buf = NULL; + +	 if (!xdr_u_quad_t (xdrs, &objp->gfs_id)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_gf_prog_detail (XDR *xdrs, gf_prog_detail *objp) +{ +	register int32_t *buf; +        buf = NULL; + +	 if (!xdr_string (xdrs, &objp->progname, ~0)) +		 return FALSE; +	 if (!xdr_u_quad_t (xdrs, &objp->prognum)) +		 return FALSE; +	 if (!xdr_u_quad_t (xdrs, &objp->progver)) +		 return FALSE; +	 if (!xdr_pointer (xdrs, (char **)&objp->next, sizeof (gf_prog_detail), (xdrproc_t) xdr_gf_prog_detail)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_gf_dump_rsp (XDR *xdrs, gf_dump_rsp *objp) +{ +	register int32_t *buf; +        buf = NULL; + +	 if (!xdr_u_quad_t (xdrs, &objp->gfs_id)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->op_ret)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->op_errno)) +		 return FALSE; +	 if (!xdr_pointer (xdrs, (char **)&objp->prog, sizeof (gf_prog_detail), (xdrproc_t) xdr_gf_prog_detail)) +		 return FALSE; +	return TRUE; +} diff --git a/rpc/xdr/src/rpc-common-xdr.h b/rpc/xdr/src/rpc-common-xdr.h new file mode 100644 index 00000000000..66d9c3772fe --- /dev/null +++ b/rpc/xdr/src/rpc-common-xdr.h @@ -0,0 +1,113 @@ +/* +  Copyright (c) 2007-2011 Gluster, Inc. <http://www.gluster.com> +  This file is part of GlusterFS. + +  GlusterFS is free software; you can redistribute it and/or modify +  it under the terms of the GNU General Public License as published +  by the Free Software Foundation; either version 3 of the License, +  or (at your option) any later version. + +  GlusterFS is distributed in the hope that it will be useful, but +  WITHOUT ANY WARRANTY; without even the implied warranty of +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +  General Public License for more details. + +  You should have received a copy of the GNU General Public License +  along with this program.  If not, see +  <http://www.gnu.org/licenses/>. +*/ + +#include "xdr-common.h" +#include "compat.h" + +#if defined(__GNUC__) +#if __GNUC__ >= 4 +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif +#endif + +/* + * Please do not edit this file. + * It was generated using rpcgen. + */ + +#ifndef _RPC_COMMON_XDR_H_RPCGEN +#define _RPC_COMMON_XDR_H_RPCGEN + +#include <rpc/rpc.h> + + +#ifdef __cplusplus +extern "C" { +#endif + + +struct auth_glusterfs_parms_v2 { +	int pid; +	u_int uid; +	u_int gid; +	struct { +		u_int groups_len; +		u_int *groups_val; +	} groups; +	struct { +		u_int lk_owner_len; +		char *lk_owner_val; +	} lk_owner; +}; +typedef struct auth_glusterfs_parms_v2 auth_glusterfs_parms_v2; + +struct auth_glusterfs_parms { +	u_quad_t lk_owner; +	u_int pid; +	u_int uid; +	u_int gid; +	u_int ngrps; +	u_int groups[16]; +}; +typedef struct auth_glusterfs_parms auth_glusterfs_parms; + +struct gf_dump_req { +	u_quad_t gfs_id; +}; +typedef struct gf_dump_req gf_dump_req; + +struct gf_prog_detail { +	char *progname; +	u_quad_t prognum; +	u_quad_t progver; +	struct gf_prog_detail *next; +}; +typedef struct gf_prog_detail gf_prog_detail; + +struct gf_dump_rsp { +	u_quad_t gfs_id; +	int op_ret; +	int op_errno; +	struct gf_prog_detail *prog; +}; +typedef struct gf_dump_rsp gf_dump_rsp; + +/* the xdr functions */ + +#if defined(__STDC__) || defined(__cplusplus) +extern  bool_t xdr_auth_glusterfs_parms_v2 (XDR *, auth_glusterfs_parms_v2*); +extern  bool_t xdr_auth_glusterfs_parms (XDR *, auth_glusterfs_parms*); +extern  bool_t xdr_gf_dump_req (XDR *, gf_dump_req*); +extern  bool_t xdr_gf_prog_detail (XDR *, gf_prog_detail*); +extern  bool_t xdr_gf_dump_rsp (XDR *, gf_dump_rsp*); + +#else /* K&R C */ +extern bool_t xdr_auth_glusterfs_parms_v2 (); +extern bool_t xdr_auth_glusterfs_parms (); +extern bool_t xdr_gf_dump_req (); +extern bool_t xdr_gf_prog_detail (); +extern bool_t xdr_gf_dump_rsp (); + +#endif /* K&R C */ + +#ifdef __cplusplus +} +#endif + +#endif /* !_RPC_COMMON_XDR_H_RPCGEN */ diff --git a/rpc/xdr/src/rpc-common-xdr.x b/rpc/xdr/src/rpc-common-xdr.x new file mode 100644 index 00000000000..ca28f38b5db --- /dev/null +++ b/rpc/xdr/src/rpc-common-xdr.x @@ -0,0 +1,39 @@ +/* This file has definition of few XDR structures which are + * not captured in any section specific file */ + +struct auth_glusterfs_parms_v2 { +        int pid; +        unsigned int uid; +        unsigned int gid; +        unsigned int groups<>; +        opaque lk_owner<>; +}; + +struct auth_glusterfs_parms { +        unsigned hyper lk_owner; +        unsigned int pid; +        unsigned int uid; +	unsigned int gid; +	unsigned int ngrps; +	unsigned groups[16]; +}; + +struct gf_dump_req { +	unsigned hyper gfs_id; +}; + + +struct gf_prog_detail { +	string progname<>; +	unsigned hyper prognum; +	unsigned hyper progver; +	struct gf_prog_detail *next; +}; + + +struct gf_dump_rsp { +        unsigned hyper gfs_id; +        int op_ret; +	int op_errno; +	struct gf_prog_detail *prog; +};  | 
