995 ret = topo_mod_seterrno(mp,
996 ETOPO_PRSR_REGMETH);
997 goto pmr_done;
998 }
999 }
1000 if (is_nonvolatile) {
1001 if (topo_prop_setnonvolatile(tn, meth.pg_name,
1002 meth.prop_name, &err) != 0) {
1003 ret = topo_mod_seterrno(mp,
1004 ETOPO_PRSR_REGMETH);
1005 goto pmr_done;
1006 }
1007 }
1008 }
1009
1010 pmr_done:
1011 if (meth_name)
1012 xmlFree(meth_name);
1013 if (prop_name)
1014 xmlFree(prop_name);
1015 if (arg_nvl)
1016 nvlist_free(arg_nvl);
1017 return (ret);
1018 }
1019
1020
1021 static int
1022 pgroup_record(topo_mod_t *mp, xmlNodePtr pxn, tnode_t *tn, const char *rname,
1023 tf_pad_t *rpad, int pi, const char *ppgrp_name)
1024 {
1025 topo_stability_t nmstab, dstab;
1026 uint64_t ver;
1027 xmlNodePtr cn;
1028 xmlChar *name;
1029 nvlist_t **apl = NULL;
1030 nvlist_t *pgnvl = NULL;
1031 int pcnt = 0;
1032 int ai = 0;
1033 int e;
1034
1035 topo_dprintf(mp->tm_hdl, TOPO_DBG_XML, "pgroup_record\n");
1085 }
1086 for (cn = pxn->xmlChildrenNode; cn != NULL; cn = cn->next) {
1087 if (xmlStrcmp(cn->name, (xmlChar *)Propval) == 0) {
1088 if (ai < pcnt) {
1089 if ((apl[ai] = pval_record(mp, cn)) == NULL)
1090 break;
1091 }
1092 ai++;
1093 } else if (xmlStrcmp(cn->name, (xmlChar *)Prop_meth) == 0) {
1094 if (pmeth_record(mp, (const char *)name, cn, tn, rname,
1095 ppgrp_name) < 0)
1096 break;
1097 }
1098 }
1099 xmlFree(name);
1100 if (pcnt > 0) {
1101 e |= (ai != pcnt);
1102 e |= nvlist_add_nvlist_array(pgnvl, INV_PGRP_ALLPROPS, apl,
1103 pcnt);
1104 for (ai = 0; ai < pcnt; ai++)
1105 if (apl[ai] != NULL)
1106 nvlist_free(apl[ai]);
1107 topo_mod_free(mp, apl, pcnt * sizeof (nvlist_t *));
1108 if (e != 0) {
1109 nvlist_free(pgnvl);
1110 return (-1);
1111 }
1112 }
1113 rpad->tpad_pgs[pi] = pgnvl;
1114 return (0);
1115 }
1116
1117 static int
1118 pgroups_record(topo_mod_t *mp, xmlNodePtr pxn, tnode_t *tn, const char *rname,
1119 tf_pad_t *rpad, const char *ppgrp)
1120 {
1121 xmlNodePtr cn;
1122 int pi = 0;
1123
1124 topo_dprintf(mp->tm_hdl, TOPO_DBG_XML, "pgroups_record: pxn->name=%s\n",
1125 pxn->name);
|
995 ret = topo_mod_seterrno(mp,
996 ETOPO_PRSR_REGMETH);
997 goto pmr_done;
998 }
999 }
1000 if (is_nonvolatile) {
1001 if (topo_prop_setnonvolatile(tn, meth.pg_name,
1002 meth.prop_name, &err) != 0) {
1003 ret = topo_mod_seterrno(mp,
1004 ETOPO_PRSR_REGMETH);
1005 goto pmr_done;
1006 }
1007 }
1008 }
1009
1010 pmr_done:
1011 if (meth_name)
1012 xmlFree(meth_name);
1013 if (prop_name)
1014 xmlFree(prop_name);
1015 nvlist_free(arg_nvl);
1016 return (ret);
1017 }
1018
1019
1020 static int
1021 pgroup_record(topo_mod_t *mp, xmlNodePtr pxn, tnode_t *tn, const char *rname,
1022 tf_pad_t *rpad, int pi, const char *ppgrp_name)
1023 {
1024 topo_stability_t nmstab, dstab;
1025 uint64_t ver;
1026 xmlNodePtr cn;
1027 xmlChar *name;
1028 nvlist_t **apl = NULL;
1029 nvlist_t *pgnvl = NULL;
1030 int pcnt = 0;
1031 int ai = 0;
1032 int e;
1033
1034 topo_dprintf(mp->tm_hdl, TOPO_DBG_XML, "pgroup_record\n");
1084 }
1085 for (cn = pxn->xmlChildrenNode; cn != NULL; cn = cn->next) {
1086 if (xmlStrcmp(cn->name, (xmlChar *)Propval) == 0) {
1087 if (ai < pcnt) {
1088 if ((apl[ai] = pval_record(mp, cn)) == NULL)
1089 break;
1090 }
1091 ai++;
1092 } else if (xmlStrcmp(cn->name, (xmlChar *)Prop_meth) == 0) {
1093 if (pmeth_record(mp, (const char *)name, cn, tn, rname,
1094 ppgrp_name) < 0)
1095 break;
1096 }
1097 }
1098 xmlFree(name);
1099 if (pcnt > 0) {
1100 e |= (ai != pcnt);
1101 e |= nvlist_add_nvlist_array(pgnvl, INV_PGRP_ALLPROPS, apl,
1102 pcnt);
1103 for (ai = 0; ai < pcnt; ai++)
1104 nvlist_free(apl[ai]);
1105 topo_mod_free(mp, apl, pcnt * sizeof (nvlist_t *));
1106 if (e != 0) {
1107 nvlist_free(pgnvl);
1108 return (-1);
1109 }
1110 }
1111 rpad->tpad_pgs[pi] = pgnvl;
1112 return (0);
1113 }
1114
1115 static int
1116 pgroups_record(topo_mod_t *mp, xmlNodePtr pxn, tnode_t *tn, const char *rname,
1117 tf_pad_t *rpad, const char *ppgrp)
1118 {
1119 xmlNodePtr cn;
1120 int pi = 0;
1121
1122 topo_dprintf(mp->tm_hdl, TOPO_DBG_XML, "pgroups_record: pxn->name=%s\n",
1123 pxn->name);
|