diff options
| author | Amar Tumballi <amar@gluster.com> | 2010-06-23 02:55:21 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-06-24 10:32:11 -0700 | 
| commit | e82ca8fc5164f4ba2ff396da86b4a490d9a47370 (patch) | |
| tree | 1c92b4d4c0a4ad42b2213f17c92ededc45ae89a2 /xlators/protocol/lib/src | |
| parent | 487e9f1d59bbf7b37a30ceef5dbfd8ca77b94988 (diff) | |
minor improvements in protocol
* rpc_clnt_submit() now takes 'cbkfn' as an argument.
* readdir xdr now uses dirent structure directly instead of
  using 'opaque' buffer through which it was serializing /
  unserializing the dirent structure.
* 'gfs_id' field (currently used for debugging) is properly updated
Signed-off-by: Amar Tumballi <amar@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 875 (Implement a new protocol to provide proper backward/forward compatibility)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=875
Diffstat (limited to 'xlators/protocol/lib/src')
| -rw-r--r-- | xlators/protocol/lib/src/Makefile.am | 2 | ||||
| -rw-r--r-- | xlators/protocol/lib/src/glusterfs-xdr.c | 97 | ||||
| -rw-r--r-- | xlators/protocol/lib/src/glusterfs-xdr.h | 78 | ||||
| -rw-r--r-- | xlators/protocol/lib/src/glusterfs3.x | 42 | ||||
| -rw-r--r-- | xlators/protocol/lib/src/msg-xdr.h | 2 | ||||
| -rw-r--r-- | xlators/protocol/lib/src/protocol-common.c | 109 | ||||
| -rw-r--r-- | xlators/protocol/lib/src/protocol-common.h | 11 | 
7 files changed, 148 insertions, 193 deletions
diff --git a/xlators/protocol/lib/src/Makefile.am b/xlators/protocol/lib/src/Makefile.am index ece59ef905a..98cf44d0948 100644 --- a/xlators/protocol/lib/src/Makefile.am +++ b/xlators/protocol/lib/src/Makefile.am @@ -10,6 +10,6 @@ libgfproto1_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -D_GNU_SO  libgfproto1_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la -libgfproto1_la_SOURCES = authenticate.c protocol-common.c msg-xdr.c glusterfs-xdr.c +libgfproto1_la_SOURCES = authenticate.c msg-xdr.c glusterfs-xdr.c  noinst_HEADERS = authenticate.h protocol-common.h msg-xdr.h glusterfs-xdr.h diff --git a/xlators/protocol/lib/src/glusterfs-xdr.c b/xlators/protocol/lib/src/glusterfs-xdr.c index 6538d6d26f8..e8a254094f9 100644 --- a/xlators/protocol/lib/src/glusterfs-xdr.c +++ b/xlators/protocol/lib/src/glusterfs-xdr.c @@ -1148,21 +1148,6 @@ xdr_gfs3_readdir_req (XDR *xdrs, gfs3_readdir_req *objp)  }  bool_t -xdr_gfs3_readdir_rsp (XDR *xdrs, gfs3_readdir_rsp *objp) -{ - -	 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_bytes (xdrs, (char **)&objp->buf.buf_val, (u_int *) &objp->buf.buf_len, ~0)) -		 return FALSE; -	return TRUE; -} - -bool_t  xdr_gfs3_readdirp_req (XDR *xdrs, gfs3_readdirp_req *objp)  { @@ -1182,21 +1167,6 @@ xdr_gfs3_readdirp_req (XDR *xdrs, gfs3_readdirp_req *objp)  }  bool_t -xdr_gfs3_readdirp_rsp (XDR *xdrs, gfs3_readdirp_rsp *objp) -{ - -	 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_bytes (xdrs, (char **)&objp->buf.buf_val, (u_int *) &objp->buf.buf_len, ~0)) -		 return FALSE; -	return TRUE; -} - -bool_t  xdr_gf_setvolume_req (XDR *xdrs, gf_setvolume_req *objp)  { @@ -1759,3 +1729,70 @@ xdr_gf_dump_version_rsp (XDR *xdrs, gf_dump_version_rsp *objp)  	return TRUE;  } + + +bool_t +xdr_gfs3_dirlist (XDR *xdrs, gfs3_dirlist *objp) +{ +	 if (!xdr_u_quad_t (xdrs, &objp->d_ino)) +		 return FALSE; +	 if (!xdr_u_quad_t (xdrs, &objp->d_off)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->d_len)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->d_type)) +		 return FALSE; +	 if (!xdr_string (xdrs, &objp->name, ~0)) +		 return FALSE; +	 if (!xdr_pointer (xdrs, (char **)&objp->nextentry, sizeof (gfs3_dirlist), (xdrproc_t) xdr_gfs3_dirlist)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_gfs3_readdir_rsp (XDR *xdrs, gfs3_readdir_rsp *objp) +{ +	 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->reply, sizeof (gfs3_dirlist), (xdrproc_t) xdr_gfs3_dirlist)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_gfs3_dirplist (XDR *xdrs, gfs3_dirplist *objp) +{ +	 if (!xdr_u_quad_t (xdrs, &objp->d_ino)) +		 return FALSE; +	 if (!xdr_u_quad_t (xdrs, &objp->d_off)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->d_len)) +		 return FALSE; +	 if (!xdr_u_int (xdrs, &objp->d_type)) +		 return FALSE; +	 if (!xdr_string (xdrs, &objp->name, ~0)) +		 return FALSE; +	 if (!xdr_gf_iatt (xdrs, &objp->stat)) +		 return FALSE; +	 if (!xdr_pointer (xdrs, (char **)&objp->nextentry, sizeof (gfs3_dirplist), (xdrproc_t) xdr_gfs3_dirplist)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_gfs3_readdirp_rsp (XDR *xdrs, gfs3_readdirp_rsp *objp) +{ +	 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->reply, sizeof (struct gfs3_dirplist), (xdrproc_t) xdr_gfs3_dirplist)) +		 return FALSE; +	return TRUE; +} diff --git a/xlators/protocol/lib/src/glusterfs-xdr.h b/xlators/protocol/lib/src/glusterfs-xdr.h index 1870f319d63..f99335c4210 100644 --- a/xlators/protocol/lib/src/glusterfs-xdr.h +++ b/xlators/protocol/lib/src/glusterfs-xdr.h @@ -294,16 +294,6 @@ gf_stat_from_iatt (struct gf_iatt *gf_stat, struct iatt *iatt)  } -struct gf_dirent_nb { -	uint64_t       d_ino; -	uint64_t       d_off; -	uint32_t       d_len; -	uint32_t       d_type; -        struct gf_iatt d_stat; -	char           d_name[0]; -} __attribute__((packed)); - -  /* Gluster FS Payload structures */  struct gfs3_stat_req { @@ -831,17 +821,6 @@ struct gfs3_readdir_req {  };  typedef struct gfs3_readdir_req gfs3_readdir_req; -struct gfs3_readdir_rsp { -	u_quad_t gfs_id; -	int op_ret; -	int op_errno; -	struct { -		u_int buf_len; -		char *buf_val; -	} buf; -}; -typedef struct gfs3_readdir_rsp gfs3_readdir_rsp; -  struct gfs3_readdirp_req {  	u_quad_t gfs_id;  	u_quad_t ino; @@ -852,17 +831,6 @@ struct gfs3_readdirp_req {  };  typedef struct gfs3_readdirp_req gfs3_readdirp_req; -struct gfs3_readdirp_rsp { -	u_quad_t gfs_id; -	int op_ret; -	int op_errno; -	struct { -		u_int buf_len; -		char *buf_val; -	} buf; -}; -typedef struct gfs3_readdirp_rsp gfs3_readdirp_rsp; -  struct gf_setvolume_req {  	u_quad_t gfs_id;  	struct { @@ -1136,6 +1104,44 @@ struct gf_dump_version_rsp {  };  typedef struct gf_dump_version_rsp gf_dump_version_rsp; +struct gfs3_dirlist { +	u_quad_t d_ino; +	u_quad_t d_off; +	u_int d_len; +	u_int d_type; +	char *name; +	struct gfs3_dirlist *nextentry; +}; +typedef struct gfs3_dirlist gfs3_dirlist; + +struct gfs3_readdir_rsp { +	u_quad_t gfs_id; +	int op_ret; +	int op_errno; +	struct gfs3_dirlist *reply; +}; +typedef struct gfs3_readdir_rsp gfs3_readdir_rsp; + +struct gfs3_dirplist { +	u_quad_t d_ino; +	u_quad_t d_off; +	u_int d_len; +	u_int d_type; +	char *name; +	struct gf_iatt stat; +	struct gfs3_dirplist *nextentry; +}; +typedef struct gfs3_dirplist gfs3_dirplist; + +struct gfs3_readdirp_rsp { +	u_quad_t gfs_id; +	int op_ret; +	int op_errno; +	struct gfs3_dirplist *reply; +}; +typedef struct gfs3_readdirp_rsp gfs3_readdirp_rsp; + +  /* the xdr functions */  #if defined(__STDC__) || defined(__cplusplus) @@ -1194,9 +1200,11 @@ extern  bool_t xdr_gfs3_opendir_req (XDR *, gfs3_opendir_req*);  extern  bool_t xdr_gfs3_opendir_rsp (XDR *, gfs3_opendir_rsp*);  extern  bool_t xdr_gfs3_fsyncdir_req (XDR *, gfs3_fsyncdir_req*);  extern  bool_t xdr_gfs3_readdir_req (XDR *, gfs3_readdir_req*); +extern  bool_t xdr_gfs3_dirlist (XDR *, gfs3_dirlist*);  extern  bool_t xdr_gfs3_readdir_rsp (XDR *, gfs3_readdir_rsp*); -extern  bool_t xdr_gfs3_readdirp_req (XDR *, gfs3_readdirp_req*); +extern  bool_t xdr_gfs3_dirplist (XDR *, gfs3_dirplist*);  extern  bool_t xdr_gfs3_readdirp_rsp (XDR *, gfs3_readdirp_rsp*); +extern  bool_t xdr_gfs3_readdirp_req (XDR *, gfs3_readdirp_req*);  extern  bool_t xdr_gf_setvolume_req (XDR *, gf_setvolume_req*);  extern  bool_t xdr_gf_setvolume_rsp (XDR *, gf_setvolume_rsp*);  extern  bool_t xdr_gfs3_access_req (XDR *, gfs3_access_req*); @@ -1283,9 +1291,11 @@ extern bool_t xdr_gfs3_opendir_req ();  extern bool_t xdr_gfs3_opendir_rsp ();  extern bool_t xdr_gfs3_fsyncdir_req ();  extern bool_t xdr_gfs3_readdir_req (); +extern bool_t xdr_gfs3_dirlist ();  extern bool_t xdr_gfs3_readdir_rsp (); -extern bool_t xdr_gfs3_readdirp_req (); +extern bool_t xdr_gfs3_dirplist ();  extern bool_t xdr_gfs3_readdirp_rsp (); +extern bool_t xdr_gfs3_readdirp_req ();  extern bool_t xdr_gf_setvolume_req ();  extern bool_t xdr_gf_setvolume_rsp ();  extern bool_t xdr_gfs3_access_req (); diff --git a/xlators/protocol/lib/src/glusterfs3.x b/xlators/protocol/lib/src/glusterfs3.x index b6cc6e6abad..c9510527c27 100644 --- a/xlators/protocol/lib/src/glusterfs3.x +++ b/xlators/protocol/lib/src/glusterfs3.x @@ -491,10 +491,40 @@ struct   gfs3_finodelk_req {  	unsigned hyper offset;  	unsigned int size;  }; -struct gfs3_readdir_res { +struct gfs3_dirlist { +	unsigned hyper  d_ino; +	unsigned hyper  d_off; +        unsigned int    d_len; +	unsigned int    d_type; +	char           *name; +	struct gfs3_dirlist *nextentry; +}; + +struct gfs3_readdir_rsp {          unsigned hyper gfs_id; -	opaque     buf<>; -}  ; +        int    op_ret; +        int    op_errno; +        struct gfs3_dirlist reply; +}; + + + +struct gfs3_dirplist { +	unsigned hyper  d_ino; +	unsigned hyper  d_off; +        unsigned int    d_len; +	unsigned int    d_type; +	char           *name; +	struct gf_iatt  name_attributes; +	struct gfs3_dirplist *nextentry; +}; + +struct gfs3_readdirp_rsp { +        unsigned hyper gfs_id; +        int    op_ret; +        int    op_errno; +	struct gfs3_dirlistp reply; +};   struct gfs3_readdirp_req { @@ -505,12 +535,6 @@ struct gfs3_readdir_res {  	unsigned hyper offset;  	unsigned int size;  }  ; - struct gfs3_readdirp_rsp { -        unsigned hyper gfs_id; -        int    op_ret; -        int    op_errno; -        opaque     buf<>; -}  ;   struct gf_setvolume_req { diff --git a/xlators/protocol/lib/src/msg-xdr.h b/xlators/protocol/lib/src/msg-xdr.h index 4c383e5a52a..872d9401e48 100644 --- a/xlators/protocol/lib/src/msg-xdr.h +++ b/xlators/protocol/lib/src/msg-xdr.h @@ -532,5 +532,7 @@ ssize_t  xdr_to_lookup_rsp (struct iovec inmsg, void *args);  ssize_t  xdr_to_readv_rsp (struct iovec inmsg, void *args); +ssize_t +xdr_to_getspec_rsp (struct iovec inmsg, void *args);  #endif /* !_MSG_XDR_H */ diff --git a/xlators/protocol/lib/src/protocol-common.c b/xlators/protocol/lib/src/protocol-common.c deleted file mode 100644 index 4a9845e082d..00000000000 --- a/xlators/protocol/lib/src/protocol-common.c +++ /dev/null @@ -1,109 +0,0 @@ -/* -  Copyright (c) 2007-2010 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 "globals.h" -#include "compat.h" -#include "protocol-common.h" -#include "glusterfs-xdr.h" - - -static int -gf_dirent_nb_size (gf_dirent_t *entries) -{ -	return (sizeof (struct gf_dirent_nb) + strlen (entries->d_name) + 1); -} - -int -gf_dirent_serialize (gf_dirent_t *entries, char *buf, size_t buf_size) -{ -	struct gf_dirent_nb *entry_nb = NULL; -	gf_dirent_t         *entry = NULL; -	int                  size = 0; -	int                  entry_size = 0; - - -	list_for_each_entry (entry, &entries->list, list) { -		entry_size = gf_dirent_nb_size (entry); - -		if (buf && (size + entry_size <= buf_size)) { -			entry_nb = (void *) (buf + size); - -			entry_nb->d_ino  = entry->d_ino; -			entry_nb->d_off  = entry->d_off; -			entry_nb->d_len  = entry->d_len; -			entry_nb->d_type = entry->d_type; - -                        gf_stat_from_iatt (&entry_nb->d_stat, &entry->d_stat); - -			strcpy (entry_nb->d_name, entry->d_name); -		} -		size += entry_size; -	} - -	return size; -} - - -int -gf_dirent_unserialize (gf_dirent_t *entries, const char *buf, size_t buf_size) -{ -	struct gf_dirent_nb *entry_nb = NULL; -	int                  remaining_size = 0; -	int                  least_dirent_size = 0; -	int                  count = 0; -	gf_dirent_t         *entry = NULL; -	int                  entry_strlen = 0; -	int                  entry_len = 0; - - -	remaining_size = buf_size; -	least_dirent_size = (sizeof (struct gf_dirent_nb) + 2); - -	while (remaining_size >= least_dirent_size) { -		entry_nb = (void *)(buf + (buf_size - remaining_size)); - -		entry_strlen = strnlen (entry_nb->d_name, remaining_size); -		if (entry_strlen == remaining_size) { -			break; -		} - -		entry_len = sizeof (gf_dirent_t) + entry_strlen + 1; -		entry = GF_CALLOC (1, entry_len, gf_common_mt_gf_dirent_t); -		if (!entry) { -			break; -		} - -		entry->d_ino  = entry_nb->d_ino; -		entry->d_off  = entry_nb->d_off; -		entry->d_len  = entry_nb->d_len; -		entry->d_type = entry_nb->d_type; - -                gf_stat_to_iatt (&entry_nb->d_stat, &entry->d_stat); - -		strcpy (entry->d_name, entry_nb->d_name); - -		list_add_tail (&entry->list, &entries->list); - -		remaining_size -= (sizeof (*entry_nb) + entry_strlen + 1); -		count++; -	} - -	return count; -} diff --git a/xlators/protocol/lib/src/protocol-common.h b/xlators/protocol/lib/src/protocol-common.h index 98a79d0fa17..5378d90ba45 100644 --- a/xlators/protocol/lib/src/protocol-common.h +++ b/xlators/protocol/lib/src/protocol-common.h @@ -20,11 +20,6 @@  #ifndef _PROTOCOL_COMMON_H  #define _PROTOCOL_COMMON_H -#define GF_PROTOCOL_DEFAULT_PORT 6971 - -#define GF_LOCAL_IOV 1 /* All headers are here */ -#define GF_EXTRA_IOV 2 /* needed for write/read etc */ -  enum gf_fop_procnum {          GFS3_OP_NULL,    /* 0 */          GFS3_OP_STAT, @@ -79,6 +74,7 @@ enum gf_handshake_procnum {          GF_HNDSK_SETVOLUME,          GF_HNDSK_GETSPEC,          GF_HNDSK_PING, +        GF_HNDSK_MAXVALUE,  };  enum gf_mgmt_procnum { @@ -96,9 +92,4 @@ enum gf_mgmt_procnum {  #define GLUSTER_HNDSK_PROGRAM   14398633 /* Completely random */  #define GLUSTER_HNDSK_VERSION   1   /* 0.0.1 */ -int -gf_dirent_unserialize (gf_dirent_t *entries, const char *buf, size_t buf_size); -int -gf_dirent_serialize (gf_dirent_t *entries, char *buf, size_t buf_size); -  #endif /* !_PROTOCOL_COMMON_H */  | 
