changeset 13957:7e73c8223f6c

ds_guid: Point directly "ds_zfsguid zfsguid" instead of using opaque object This get rid us of using allocations to keep opaque object that really is two uint64 values: uint64_t zpool_guid; uint64_t dataset_guid;
author Vitaliy Gusev <gusev.vitaliy@nexenta.com>
date Wed, 21 Aug 2013 23:49:08 +0400
parents 70cc8895c765
children bff31e96ff36
files usr/src/cmd/cmd-inet/usr.sbin/snoop/snoop_ctl.c usr/src/head/rpcsvc/ds_prot.x usr/src/uts/common/fs/nfs/ctl_ds_srv.c usr/src/uts/common/fs/nfs/dserv_mds.c usr/src/uts/common/fs/nfs/nfs41_ds_addr.c usr/src/uts/common/fs/nfs/nfs41_layout.c usr/src/uts/common/fs/nfs/nfs41_state.c
diffstat 7 files changed, 58 insertions(+), 107 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/cmd-inet/usr.sbin/snoop/snoop_ctl.c	Wed Aug 21 23:47:58 2013 +0400
+++ b/usr/src/cmd/cmd-inet/usr.sbin/snoop/snoop_ctl.c	Wed Aug 21 23:49:08 2013 +0400
@@ -405,7 +405,6 @@
 detail_ds_guid_map(uint_t len, ds_guid_map *dg, char *legend, char *indent)
 {
 	XDR		zxdr;
-	ds_zfsguid	zfsguid;
 	char		*p;
 	int		i;
 	int		j;
@@ -422,20 +421,15 @@
 			p = storage_types_map[dg[i].ds_guid.stor_type];
 
 		sprintf(get_line(0, 0), "%s    storage type = %s", indent, p);
-		xdrmem_create(&zxdr,
-		    dg[i].ds_guid.ds_guid_u.zfsguid.zfsguid_val,
-		    dg[i].ds_guid.ds_guid_u.zfsguid.zfsguid_len,
-		    XDR_DECODE);
-		memset(&zfsguid, '\0', sizeof (zfsguid));
-		if (!xdr_ds_zfsguid(&zxdr, &zfsguid))
-			return (FALSE);
+
+		if (dg[i].ds_guid.stor_type == ZFS) {
+			ds_zfsguid *zfsguid = &dg[i].ds_guid.ds_guid_u.zfsguid;
 
-		sprintf(get_line(0, 0), "%s    zpool guid = %llu",
-		    indent, zfsguid.zpool_guid);
-		sprintf(get_line(0, 0), "%s    dataset guid = %llu",
-		    indent, zfsguid.dataset_guid);
-
-		xdr_free(xdr_ds_zfsguid, (char *)&zfsguid);
+			sprintf(get_line(0, 0), "%s    zpool guid = %llX",
+			    indent, zfsguid->zpool_guid);
+			sprintf(get_line(0, 0), "%s    dataset guid = %llX",
+			    indent, zfsguid->dataset_guid);
+		}
 
 		for (j = 0; j < dg[i].mds_sid_array.mds_sid_array_len; j++) {
 			detail_mds_sid(&dg[i].mds_sid_array.
--- a/usr/src/head/rpcsvc/ds_prot.x	Wed Aug 21 23:47:58 2013 +0400
+++ b/usr/src/head/rpcsvc/ds_prot.x	Wed Aug 21 23:49:08 2013 +0400
@@ -240,13 +240,23 @@
 	mds_sid	mma_sid;
 };
 
+/*
+ * ds_zfsguid -
+ *
+ *	The data server guid made up of the local zpool guid + dataset id
+ */
+struct ds_zfsguid {
+	uint64_t	zpool_guid;
+	uint64_t	dataset_guid;
+};
+
 enum storage_type {
 	ZFS = 1
 };
 
 union ds_guid switch (storage_type stor_type) {
 case ZFS:
-	opaque	zfsguid<>;
+     struct ds_zfsguid zfsguid;
 default:
 	void;
 };
@@ -280,16 +290,6 @@
 };
 
 /*
- * ds_zfsguid -
- *
- *	The data server guid made up of the local zpool guid + dataset id
- */
-struct ds_zfsguid {
-	uint64_t	zpool_guid;
-	uint64_t	dataset_guid;
-};
-
-/*
  * ds_dev_info -
  *
  *     Information about zvol device
--- a/usr/src/uts/common/fs/nfs/ctl_ds_srv.c	Wed Aug 21 23:47:58 2013 +0400
+++ b/usr/src/uts/common/fs/nfs/ctl_ds_srv.c	Wed Aug 21 23:49:08 2013 +0400
@@ -515,7 +515,6 @@
 	int i;
 
 	for (i = 0; i < len; i++, info++) {
-		char name[16];
 		struct ds_guid guid;
 		uint64_t id[2];
 		rfs4_entry_t entry;
@@ -525,12 +524,7 @@
 			continue;
 
 		guid.stor_type = ZFS;
-		guid.ds_guid_u.zfsguid.zfsguid_len = sizeof (name);
-		guid.ds_guid_u.zfsguid.zfsguid_val = name;
-
-		id[0] = htonll(info->guid.zpool_guid);
-		id[1] = htonll(info->guid.dataset_guid);
-		bcopy(id, name, sizeof (name));
+		guid.ds_guid_u.zfsguid = info->guid;
 
 		rw_enter(&mds_server->ds_guid_info_lock, RW_READER);
 		entry = rfs4_dbsearch(mds_server->ds_guid_info_idx,
@@ -1055,9 +1049,6 @@
 		ASSERT(pgi->ds_guid.stor_type == ZFS);
 		guid_map[count].ds_guid = pgi->ds_guid;
 
-		ASSERT(pgi->ds_guid.ds_guid_u.zfsguid.zfsguid_len
-		    == sizeof (mds_sid_content));
-
 		/*
 		 * MDS SIDs: these would come from the mds_mapzap,
 		 * but for now we just reuse the ds_guid
@@ -1066,7 +1057,7 @@
 		 * can not just be the ZFS id for the root fileset
 		 * as a mds could have multiple root filesets...
 		 */
-		bcopy(pgi->ds_guid.ds_guid_u.zfsguid.zfsguid_val,
+		bcopy(&pgi->ds_guid.ds_guid_u.zfsguid,
 		    &sid_content, sizeof (sid_content));
 
 		/*
@@ -1087,9 +1078,9 @@
 		 * Note, since we stuff the xdr_buffer into the
 		 * sid_array, we never explicitly free it by name!
 		 */
-		sid_array[0].len = pgi->ds_guid.ds_guid_u.zfsguid.zfsguid_len;
+		sid_array[0].len = sizeof (ds_zfsguid);
 		sid_array[0].val = kmem_alloc(sid_array[0].len, KM_SLEEP);
-		bcopy(pgi->ds_guid.ds_guid_u.zfsguid.zfsguid_val,
+		bcopy(&pgi->ds_guid.ds_guid_u.zfsguid,
 		    sid_array[0].val, sid_array[0].len);
 		count++;
 
--- a/usr/src/uts/common/fs/nfs/dserv_mds.c	Wed Aug 21 23:47:58 2013 +0400
+++ b/usr/src/uts/common/fs/nfs/dserv_mds.c	Wed Aug 21 23:49:08 2013 +0400
@@ -1293,7 +1293,6 @@
 	open_root_objset_t *root;
 	ds_zfsguid *zfsguid = NULL;
 	XDR xdr;
-	int xdr_size = 0;
 	char *xdr_buffer;
 	int error = 0;
 	int i, j;
@@ -1393,27 +1392,9 @@
 		zfsguid[i].zpool_guid = root->oro_ds_guid.dg_zpool_guid;
 		zfsguid[i].dataset_guid = root->oro_ds_guid.dg_objset_guid;
 
-		/*
-		 * We do this here because of a possible
-		 * early termination of the loop.
-		 */
 		pcount_done++;
 
-		xdr_size = xdr_sizeof(xdr_ds_zfsguid, &zfsguid[i]);
-		ASSERT(xdr_size);
-		xdr_buffer = kmem_alloc(xdr_size, KM_SLEEP);
-
-		xdrmem_create(&xdr, xdr_buffer, xdr_size, XDR_ENCODE);
-
-		if (xdr_ds_zfsguid(&xdr, &zfsguid[i]) == FALSE) {
-			mutex_exit(&inst->dmi_content_lock);
-			kmem_free(xdr_buffer, xdr_size);
-			error = EIO;
-			goto out;
-		}
-
-		dz->guid_map.ds_guid.ds_guid_u.zfsguid.zfsguid_len = xdr_size;
-		dz->guid_map.ds_guid.ds_guid_u.zfsguid.zfsguid_val = xdr_buffer;
+		dz->guid_map.ds_guid.ds_guid_u.zfsguid = zfsguid[i];
 
 		/*
 		 * ToDo: This should include the list of MDS SIDs
@@ -1517,11 +1498,6 @@
 	for (i = 0; i < pcount_done; i++) {
 		dz = &args.ds_storinfo.ds_storinfo_val[i].
 		    ds_storinfo_u.zfs_info;
-		if (dz->guid_map.ds_guid.ds_guid_u.zfsguid.zfsguid_len) {
-			kmem_free(dz->guid_map.ds_guid.ds_guid_u.
-			    zfsguid.zfsguid_val,
-			    dz->guid_map.ds_guid.ds_guid_u.zfsguid.zfsguid_len);
-		}
 
 		for (j = 0; j < dz->attrs.attrs_len; j++) {
 			UTF8STRING_FREE(dz->attrs.attrs_val[j].attrname);
--- a/usr/src/uts/common/fs/nfs/nfs41_ds_addr.c	Wed Aug 21 23:47:58 2013 +0400
+++ b/usr/src/uts/common/fs/nfs/nfs41_ds_addr.c	Wed Aug 21 23:49:08 2013 +0400
@@ -42,8 +42,8 @@
 	 * Warning, do not, do not ever, free this guid!
 	 */
 	guid.stor_type = ZFS;
-	guid.ds_guid_u.zfsguid.zfsguid_len = sid->len;
-	guid.ds_guid_u.zfsguid.zfsguid_val = sid->val;
+	bcopy(sid->val, &guid.ds_guid_u.zfsguid,
+	    sizeof (guid.ds_guid_u.zfsguid));
 
 	/*
 	 * First we need to find the ds_guid_info_t which
--- a/usr/src/uts/common/fs/nfs/nfs41_layout.c	Wed Aug 21 23:47:58 2013 +0400
+++ b/usr/src/uts/common/fs/nfs/nfs41_layout.c	Wed Aug 21 23:49:08 2013 +0400
@@ -182,10 +182,10 @@
 		 * find it and i is the tail. Either way, same thing happens!
 		 */
 		gap->lc.lc_mds_sids[i].len =
-		    pgi->ds_guid.ds_guid_u.zfsguid.zfsguid_len;
+		    sizeof (pgi->ds_guid.ds_guid_u.zfsguid);
 		gap->lc.lc_mds_sids[i].val =
 		    kmem_alloc(gap->lc.lc_mds_sids[i].len, KM_SLEEP);
-		bcopy(pgi->ds_guid.ds_guid_u.zfsguid.zfsguid_val,
+		bcopy(&pgi->ds_guid.ds_guid_u.zfsguid,
 		    gap->lc.lc_mds_sids[i].val,
 		    gap->lc.lc_mds_sids[i].len);
 
--- a/usr/src/uts/common/fs/nfs/nfs41_state.c	Wed Aug 21 23:47:58 2013 +0400
+++ b/usr/src/uts/common/fs/nfs/nfs41_state.c	Wed Aug 21 23:49:08 2013 +0400
@@ -2261,8 +2261,6 @@
 	 */
 	switch (gp->stor_type) {
 	case ZFS:
-		kmem_free(gp->ds_guid_u.zfsguid.zfsguid_val,
-		    gp->ds_guid_u.zfsguid.zfsguid_len);
 		break;
 	}
 }
@@ -2279,11 +2277,7 @@
 
 	switch (dst->stor_type) {
 	case ZFS:
-		dst->ds_guid_u.zfsguid.zfsguid_val
-		    = kmem_alloc(dst->ds_guid_u.zfsguid.zfsguid_len, KM_SLEEP);
-		bcopy(src->ds_guid_u.zfsguid.zfsguid_val,
-		    dst->ds_guid_u.zfsguid.zfsguid_val,
-		    dst->ds_guid_u.zfsguid.zfsguid_len);
+		dst->ds_guid_u.zfsguid = src->ds_guid_u.zfsguid;
 		break;
 	default:
 		/* if it's unknown zero out the dst */
@@ -2294,32 +2288,38 @@
 	return (0);
 }
 
+static bool_t
+ds_zfsguid_compare(const ds_zfsguid *g1, const ds_zfsguid *g2)
+{
+	if (g1->zpool_guid != g2->zpool_guid)
+		return (FALSE);
+
+	if (g1->dataset_guid != g2->dataset_guid)
+		return (FALSE);
+
+	return (TRUE);
+}
+
 /*
- * compare ds_guids return 0 for not the same or
- * 1 if they are equal..
+ * compare ds_guids: return TRUE if equal
  */
-int
+bool_t
 ds_guid_compare(ds_guid_t *gp1, ds_guid_t *gp2)
 {
 	if (gp1->stor_type != gp2->stor_type)
-		return (0);
+		return (FALSE);
 
 	switch (gp1->stor_type) {
 	case ZFS:
-		if (gp1->ds_guid_u.zfsguid.zfsguid_len !=
-		    gp2->ds_guid_u.zfsguid.zfsguid_len)
-			return (0);
-		if (bcmp(gp1->ds_guid_u.zfsguid.zfsguid_val,
-		    gp2->ds_guid_u.zfsguid.zfsguid_val,
-		    gp2->ds_guid_u.zfsguid.zfsguid_len) != 0)
-			return (0);
+		if (!ds_zfsguid_compare(&gp1->ds_guid_u.zfsguid,
+		    &gp2->ds_guid_u.zfsguid))
+			return (FALSE);
 		break;
-
 	default:
-		return (0);
+		return (FALSE);
 	}
 
-	return (1);
+	return (TRUE);
 }
 
 void
@@ -2420,19 +2420,7 @@
 
 	src = &(pic->si->ds_storinfo_u.zfs_info.guid_map.ds_guid);
 	dest = &pgi->ds_guid;
-	dest->stor_type = src->stor_type;
-
-	/*
-	 * Copy ds_guid
-	 */
-	dest->ds_guid_u.zfsguid.zfsguid_len =
-	    src->ds_guid_u.zfsguid.zfsguid_len;
-	dest->ds_guid_u.zfsguid.zfsguid_val =
-	    kmem_zalloc(dest->ds_guid_u.zfsguid.zfsguid_len,
-	    KM_SLEEP);
-	bcopy(src->ds_guid_u.zfsguid.zfsguid_val,
-	    dest->ds_guid_u.zfsguid.zfsguid_val,
-	    dest->ds_guid_u.zfsguid.zfsguid_len);
+	ds_guid_copy(src, dest);
 
 	/*
 	 * Copy zfs attrs
@@ -2469,10 +2457,12 @@
 	ds_guid_t	*pg = (ds_guid_t *)key;
 	int		i;
 	uint32_t	hash = 0;
-
-	for (i = 0; i < pg->ds_guid_u.zfsguid.zfsguid_len; i++) {
+	unsigned char	*p = (unsigned char *)&pg->ds_guid_u.zfsguid;
+	int		n = sizeof (pg->ds_guid_u.zfsguid);
+
+	for (i = 0; i < n; i++) {
 		hash <<= 1;
-		hash += (uint_t)pg->ds_guid_u.zfsguid.zfsguid_val[i];
+		hash += (uint_t)p[i];
 	}
 
 	return (hash);
@@ -2516,6 +2506,7 @@
 	rw_exit(&instp->ds_guid_info_lock);
 
 	ds_guid_free(&pgi->ds_guid);
+
 	mds_free_zfsattr(pgi);
 
 	UTF8STRING_FREE(pgi->ds_dataset_name);
@@ -2550,10 +2541,9 @@
 	if (pgi == NULL)
 		return (1);
 
-	sid->len = pgi->ds_guid.ds_guid_u.zfsguid.zfsguid_len;
+	sid->len = sizeof (pgi->ds_guid.ds_guid_u.zfsguid);
 	sid->val = kmem_alloc(sid->len, KM_SLEEP);
-	bcopy(pgi->ds_guid.ds_guid_u.zfsguid.zfsguid_val,
-	    sid->val, sid->len);
+	bcopy(&pgi->ds_guid.ds_guid_u.zfsguid, sid->val, sid->len);
 
 	rfs4_dbe_rele(pgi->dbe);