void iscsit_sess_destroy(iscsit_sess_t *ist) { idm_refcnt_destroy(&ist->ist_refcnt); if (ist->ist_initiator_name) kmem_free(ist->ist_initiator_name, strlen(ist->ist_initiator_name) + 1); if (ist->ist_initiator_alias) kmem_free(ist->ist_initiator_alias, strlen(ist->ist_initiator_alias) + 1); if (ist->ist_target_name) kmem_free(ist->ist_target_name, strlen(ist->ist_target_name) + 1); if (ist->ist_target_alias) kmem_free(ist->ist_target_alias, strlen(ist->ist_target_alias) + 1); avl_destroy(&ist->ist_task_list); kmem_free(ist->ist_rxpdu_queue, sizeof (iscsit_cbuf_t)); list_destroy(&ist->ist_conn_list); list_destroy(&ist->ist_events); cv_destroy(&ist->ist_cv); mutex_destroy(&ist->ist_mutex); mutex_destroy(&ist->ist_sn_mutex); kmem_free(ist, sizeof (*ist)); }
/* * iser_tgt_svc_create() * Establish the CM service for inbound iSER service requests on the port * indicated by sr->sr_port. * idm_svc_req_t contains the service parameters. */ idm_status_t iser_tgt_svc_create(idm_svc_req_t *sr, idm_svc_t *is) { iser_svc_t *iser_svc; int rc; iser_svc = kmem_zalloc(sizeof (iser_svc_t), KM_SLEEP); is->is_iser_svc = (void *)iser_svc; idm_refcnt_init(&iser_svc->is_refcnt, iser_svc); list_create(&iser_svc->is_sbindlist, sizeof (iser_sbind_t), offsetof(iser_sbind_t, is_list_node)); iser_svc->is_svcid = ibt_get_ip_sid(IPPROTO_TCP, sr->sr_port); /* * Register an iSER target service for the requested port * and set the iser_svc structure in the idm_svc handle. */ rc = iser_register_service(is); if (rc != DDI_SUCCESS) { ISER_LOG(CE_NOTE, "iser_tgt_svc_create: iser_register_service " "failed on port (%d): rc (0x%x)", sr->sr_port, rc); (void) ibt_release_ip_sid(iser_svc->is_svcid); list_destroy(&iser_svc->is_sbindlist); idm_refcnt_destroy(&iser_svc->is_refcnt); kmem_free(iser_svc, sizeof (iser_svc_t)); return (IDM_STATUS_FAIL); } return (IDM_STATUS_SUCCESS); }
/* * iser_tgt_svc_destroy() * Teardown resources allocated in iser_tgt_svc_create() */ static void iser_tgt_svc_destroy(idm_svc_t *is) { iser_svc_t *iser_svc; iser_svc = (iser_svc_t *)is->is_iser_svc; /* * Deregister the iSER target service on this port and free * the iser_svc structure from the idm_svc handle. */ iser_deregister_service(is); /* Wait for the iSER service handle's refcnt to zero */ idm_refcnt_wait_ref(&iser_svc->is_refcnt); list_destroy(&iser_svc->is_sbindlist); idm_refcnt_destroy(&iser_svc->is_refcnt); kmem_free(iser_svc, sizeof (iser_svc_t)); }