Example #1
0
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));
}
Example #2
0
/*
 * 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);
}
Example #3
0
/*
 * 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));
}