3163 stmf_state.stmf_svc_ilu_draining = ilu->ilu_next;
3164 }
3165 if (ilu == stmf_state.stmf_svc_ilu_timing) {
3166 stmf_state.stmf_svc_ilu_timing = ilu->ilu_next;
3167 }
3168 if (lu->lu_lp) {
3169 ((stmf_i_lu_provider_t *)
3170 (lu->lu_lp->lp_stmf_private))->ilp_nlus--;
3171 }
3172 if (ilu->ilu_luid) {
3173 ((stmf_id_data_t *)ilu->ilu_luid)->id_pt_to_object =
3174 NULL;
3175 ilu->ilu_luid = NULL;
3176 }
3177 STMF_EVENT_FREE_HANDLE(ilu->ilu_event_hdl);
3178 } else {
3179 mutex_exit(&stmf_state.stmf_lock);
3180 return (STMF_BUSY);
3181 }
3182 if (ilu->ilu_kstat_info) {
3183 kmem_free(ilu->ilu_kstat_info->ks_data,
3184 ilu->ilu_kstat_info->ks_data_size);
3185 kstat_delete(ilu->ilu_kstat_info);
3186 }
3187 if (ilu->ilu_kstat_io) {
3188 kstat_delete(ilu->ilu_kstat_io);
3189 mutex_destroy(&ilu->ilu_kstat_lock);
3190 }
3191 cv_destroy(&ilu->ilu_offline_pending_cv);
3192 mutex_exit(&stmf_state.stmf_lock);
3193 return (STMF_SUCCESS);
3194 }
3195
3196 void
3197 stmf_set_port_standby(stmf_local_port_t *lport, uint16_t rtpid)
3198 {
3199 stmf_i_local_port_t *ilport =
3200 (stmf_i_local_port_t *)lport->lport_stmf_private;
3201 ilport->ilport_rtpid = rtpid;
3202 ilport->ilport_standby = 1;
3203 }
3204
3342 if (ilport->ilport_prev)
3343 ilport->ilport_prev->ilport_next = ilport->ilport_next;
3344 else
3345 stmf_state.stmf_ilportlist = ilport->ilport_next;
3346 id_free(stmf_state.stmf_ilport_inst_space,
3347 ilport->ilport_instance);
3348 rw_destroy(&ilport->ilport_lock);
3349 stmf_state.stmf_nlports--;
3350 if (lport->lport_pp) {
3351 ((stmf_i_port_provider_t *)
3352 (lport->lport_pp->pp_stmf_private))->ipp_npps--;
3353 }
3354 ilport->ilport_tg = NULL;
3355 STMF_EVENT_FREE_HANDLE(ilport->ilport_event_hdl);
3356 } else {
3357 mutex_exit(&stmf_state.stmf_lock);
3358 return (STMF_BUSY);
3359 }
3360 if (ilport->ilport_kstat_info) {
3361 kmem_free(ilport->ilport_kstat_info->ks_data,
3362 ilport->ilport_kstat_info->ks_data_size);
3363 kstat_delete(ilport->ilport_kstat_info);
3364 }
3365 if (ilport->ilport_kstat_io) {
3366 kstat_delete(ilport->ilport_kstat_io);
3367 mutex_destroy(&ilport->ilport_kstat_lock);
3368 }
3369 mutex_exit(&stmf_state.stmf_lock);
3370 return (STMF_SUCCESS);
3371 }
3372
3373 /*
3374 * Rport id/instance mappings remain valid until STMF is unloaded
3375 */
3376 static int
3377 stmf_irport_compare(const void *void_irport1, const void *void_irport2)
3378 {
3379 const stmf_i_remote_port_t *irport1 = void_irport1;
3380 const stmf_i_remote_port_t *irport2 = void_irport2;
3381 int result;
3382
|
3163 stmf_state.stmf_svc_ilu_draining = ilu->ilu_next;
3164 }
3165 if (ilu == stmf_state.stmf_svc_ilu_timing) {
3166 stmf_state.stmf_svc_ilu_timing = ilu->ilu_next;
3167 }
3168 if (lu->lu_lp) {
3169 ((stmf_i_lu_provider_t *)
3170 (lu->lu_lp->lp_stmf_private))->ilp_nlus--;
3171 }
3172 if (ilu->ilu_luid) {
3173 ((stmf_id_data_t *)ilu->ilu_luid)->id_pt_to_object =
3174 NULL;
3175 ilu->ilu_luid = NULL;
3176 }
3177 STMF_EVENT_FREE_HANDLE(ilu->ilu_event_hdl);
3178 } else {
3179 mutex_exit(&stmf_state.stmf_lock);
3180 return (STMF_BUSY);
3181 }
3182 if (ilu->ilu_kstat_info) {
3183 kmem_free(ilu->ilu_kstat_info->ks_data, STMF_KSTAT_LU_SZ);
3184 kstat_delete(ilu->ilu_kstat_info);
3185 }
3186 if (ilu->ilu_kstat_io) {
3187 kstat_delete(ilu->ilu_kstat_io);
3188 mutex_destroy(&ilu->ilu_kstat_lock);
3189 }
3190 cv_destroy(&ilu->ilu_offline_pending_cv);
3191 mutex_exit(&stmf_state.stmf_lock);
3192 return (STMF_SUCCESS);
3193 }
3194
3195 void
3196 stmf_set_port_standby(stmf_local_port_t *lport, uint16_t rtpid)
3197 {
3198 stmf_i_local_port_t *ilport =
3199 (stmf_i_local_port_t *)lport->lport_stmf_private;
3200 ilport->ilport_rtpid = rtpid;
3201 ilport->ilport_standby = 1;
3202 }
3203
3341 if (ilport->ilport_prev)
3342 ilport->ilport_prev->ilport_next = ilport->ilport_next;
3343 else
3344 stmf_state.stmf_ilportlist = ilport->ilport_next;
3345 id_free(stmf_state.stmf_ilport_inst_space,
3346 ilport->ilport_instance);
3347 rw_destroy(&ilport->ilport_lock);
3348 stmf_state.stmf_nlports--;
3349 if (lport->lport_pp) {
3350 ((stmf_i_port_provider_t *)
3351 (lport->lport_pp->pp_stmf_private))->ipp_npps--;
3352 }
3353 ilport->ilport_tg = NULL;
3354 STMF_EVENT_FREE_HANDLE(ilport->ilport_event_hdl);
3355 } else {
3356 mutex_exit(&stmf_state.stmf_lock);
3357 return (STMF_BUSY);
3358 }
3359 if (ilport->ilport_kstat_info) {
3360 kmem_free(ilport->ilport_kstat_info->ks_data,
3361 STMF_KSTAT_TGT_SZ);
3362 kstat_delete(ilport->ilport_kstat_info);
3363 }
3364 if (ilport->ilport_kstat_io) {
3365 kstat_delete(ilport->ilport_kstat_io);
3366 mutex_destroy(&ilport->ilport_kstat_lock);
3367 }
3368 mutex_exit(&stmf_state.stmf_lock);
3369 return (STMF_SUCCESS);
3370 }
3371
3372 /*
3373 * Rport id/instance mappings remain valid until STMF is unloaded
3374 */
3375 static int
3376 stmf_irport_compare(const void *void_irport1, const void *void_irport2)
3377 {
3378 const stmf_i_remote_port_t *irport1 = void_irport1;
3379 const stmf_i_remote_port_t *irport2 = void_irport2;
3380 int result;
3381
|