Mercurial > illumos > nfs4.1
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);