Print this page
6659 nvlist_free(NULL) is a no-op


1093 static void
1094 dam_deact_cleanup(dam_t *mapp, id_t addrid, char *addrstr,
1095     damap_deact_rsn_t deact_rsn)
1096 {
1097         dam_da_t *passp;
1098 
1099         passp = ddi_get_soft_state(mapp->dam_da, addrid);
1100         ASSERT(passp);
1101         if (mapp->dam_deactivate_cb)
1102                 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg,
1103                     ddi_strid_id2str(mapp->dam_addr_hash, addrid),
1104                     addrid, passp->da_ppriv, deact_rsn);
1105 
1106         /*
1107          * clear the active bit and free the backing info for
1108          * this address
1109          */
1110         mutex_enter(&mapp->dam_lock);
1111         bitset_del(&mapp->dam_active_set, addrid);
1112         passp->da_ppriv = NULL;
1113         if (passp->da_nvl)
1114                 nvlist_free(passp->da_nvl);
1115         passp->da_nvl = NULL;
1116         passp->da_ppriv_rpt = NULL;
1117         if (passp->da_nvl_rpt)
1118                 nvlist_free(passp->da_nvl_rpt);
1119         passp->da_nvl_rpt = NULL;
1120 
1121         DTRACE_PROBE3(damap__addr__deactivate__end,
1122             char *, mapp->dam_name, dam_t *, mapp,
1123             char *, addrstr);
1124 
1125         (void) dam_addr_release(mapp, addrid);
1126         mutex_exit(&mapp->dam_lock);
1127 }
1128 
1129 /*
1130  * taskq callback for multi-thread activation
1131  */
1132 static void
1133 dam_tq_config(void *arg)
1134 {
1135         cfg_tqd_t *tqd = (cfg_tqd_t *)arg;
1136 
1137         dam_addr_activate(tqd->tqd_mapp, tqd->tqd_id);


1641 
1642         ASSERT(mutex_owned(&mapp->dam_lock));
1643         passp = ddi_get_soft_state(mapp->dam_da, addrid);
1644         ASSERT(passp);
1645         /*
1646          * clear the report bit
1647          * if the address has a registered deactivation handler and
1648          * we are holding a private data pointer and the address has not
1649          * stabilized, deactivate the address (private data).
1650          */
1651         bitset_del(&mapp->dam_report_set, addrid);
1652         if (!DAM_IS_STABLE(mapp, addrid) && mapp->dam_deactivate_cb &&
1653             passp->da_ppriv_rpt) {
1654                 mutex_exit(&mapp->dam_lock);
1655                 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg,
1656                     ddi_strid_id2str(mapp->dam_addr_hash, addrid),
1657                     addrid, passp->da_ppriv_rpt, DAMAP_DEACT_RSN_UNSTBL);
1658                 mutex_enter(&mapp->dam_lock);
1659         }
1660         passp->da_ppriv_rpt = NULL;
1661         if (passp->da_nvl_rpt)
1662                 nvlist_free(passp->da_nvl_rpt);
1663 }
1664 
1665 /*
1666  * return the map ID of an address
1667  */
1668 static id_t
1669 dam_get_addrid(dam_t *mapp, char *address)
1670 {
1671         damap_id_t addrid;
1672         dam_da_t *passp;
1673 
1674         ASSERT(mutex_owned(&mapp->dam_lock));
1675         if ((addrid = ddi_strid_str2id(mapp->dam_addr_hash, address)) == 0) {
1676                 if ((addrid = ddi_strid_alloc(mapp->dam_addr_hash,
1677                     address)) == (damap_id_t)0) {
1678                         return (0);
1679                 }
1680                 if (ddi_soft_state_zalloc(mapp->dam_da, addrid) !=
1681                     DDI_SUCCESS) {




1093 static void
1094 dam_deact_cleanup(dam_t *mapp, id_t addrid, char *addrstr,
1095     damap_deact_rsn_t deact_rsn)
1096 {
1097         dam_da_t *passp;
1098 
1099         passp = ddi_get_soft_state(mapp->dam_da, addrid);
1100         ASSERT(passp);
1101         if (mapp->dam_deactivate_cb)
1102                 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg,
1103                     ddi_strid_id2str(mapp->dam_addr_hash, addrid),
1104                     addrid, passp->da_ppriv, deact_rsn);
1105 
1106         /*
1107          * clear the active bit and free the backing info for
1108          * this address
1109          */
1110         mutex_enter(&mapp->dam_lock);
1111         bitset_del(&mapp->dam_active_set, addrid);
1112         passp->da_ppriv = NULL;

1113         nvlist_free(passp->da_nvl);
1114         passp->da_nvl = NULL;
1115         passp->da_ppriv_rpt = NULL;

1116         nvlist_free(passp->da_nvl_rpt);
1117         passp->da_nvl_rpt = NULL;
1118 
1119         DTRACE_PROBE3(damap__addr__deactivate__end,
1120             char *, mapp->dam_name, dam_t *, mapp,
1121             char *, addrstr);
1122 
1123         (void) dam_addr_release(mapp, addrid);
1124         mutex_exit(&mapp->dam_lock);
1125 }
1126 
1127 /*
1128  * taskq callback for multi-thread activation
1129  */
1130 static void
1131 dam_tq_config(void *arg)
1132 {
1133         cfg_tqd_t *tqd = (cfg_tqd_t *)arg;
1134 
1135         dam_addr_activate(tqd->tqd_mapp, tqd->tqd_id);


1639 
1640         ASSERT(mutex_owned(&mapp->dam_lock));
1641         passp = ddi_get_soft_state(mapp->dam_da, addrid);
1642         ASSERT(passp);
1643         /*
1644          * clear the report bit
1645          * if the address has a registered deactivation handler and
1646          * we are holding a private data pointer and the address has not
1647          * stabilized, deactivate the address (private data).
1648          */
1649         bitset_del(&mapp->dam_report_set, addrid);
1650         if (!DAM_IS_STABLE(mapp, addrid) && mapp->dam_deactivate_cb &&
1651             passp->da_ppriv_rpt) {
1652                 mutex_exit(&mapp->dam_lock);
1653                 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg,
1654                     ddi_strid_id2str(mapp->dam_addr_hash, addrid),
1655                     addrid, passp->da_ppriv_rpt, DAMAP_DEACT_RSN_UNSTBL);
1656                 mutex_enter(&mapp->dam_lock);
1657         }
1658         passp->da_ppriv_rpt = NULL;

1659         nvlist_free(passp->da_nvl_rpt);
1660 }
1661 
1662 /*
1663  * return the map ID of an address
1664  */
1665 static id_t
1666 dam_get_addrid(dam_t *mapp, char *address)
1667 {
1668         damap_id_t addrid;
1669         dam_da_t *passp;
1670 
1671         ASSERT(mutex_owned(&mapp->dam_lock));
1672         if ((addrid = ddi_strid_str2id(mapp->dam_addr_hash, address)) == 0) {
1673                 if ((addrid = ddi_strid_alloc(mapp->dam_addr_hash,
1674                     address)) == (damap_id_t)0) {
1675                         return (0);
1676                 }
1677                 if (ddi_soft_state_zalloc(mapp->dam_da, addrid) !=
1678                     DDI_SUCCESS) {