Print this page
*** NO COMMENTS ***

*** 129,140 **** static void pppt_task_sent_status(pppt_task_t *ptask); static pppt_status_t pppt_task_try_abort(pppt_task_t *ptask); - static pppt_status_t pppt_task_hold(pppt_task_t *ptask); - static void pppt_task_rele(pppt_task_t *ptask); static void pppt_task_update_state(pppt_task_t *ptask, pppt_task_state_t new_state); --- 129,138 ----
*** 799,809 **** pppt_lport_task_free(scsi_task_t *task) { pppt_task_t *ptask = task->task_port_private; pppt_sess_t *ps = ptask->pt_sess; ! pppt_task_free(ptask); pppt_sess_rele(ps); } /*ARGSUSED*/ stmf_status_t --- 797,807 ---- pppt_lport_task_free(scsi_task_t *task) { pppt_task_t *ptask = task->task_port_private; pppt_sess_t *ps = ptask->pt_sess; ! pppt_task_rele(ptask); pppt_sess_rele(ps); } /*ARGSUSED*/ stmf_status_t
*** 1207,1217 **** sizeof (stmf_data_buf_t), KM_NOSLEEP); if (ptask != NULL) { ptask->pt_state = PTS_INIT; ptask->pt_read_buf = NULL; ptask->pt_read_xfer_msgid = 0; ! cv_init(&ptask->pt_cv, NULL, CV_DRIVER, NULL); mutex_init(&ptask->pt_mutex, NULL, MUTEX_DRIVER, NULL); immed_pbuf = (pppt_buf_t *)(ptask + 1); bzero(immed_pbuf, sizeof (*immed_pbuf)); immed_pbuf->pbuf_is_immed = B_TRUE; immed_pbuf->pbuf_stmf_buf = (stmf_data_buf_t *)(immed_pbuf + 1); --- 1205,1215 ---- sizeof (stmf_data_buf_t), KM_NOSLEEP); if (ptask != NULL) { ptask->pt_state = PTS_INIT; ptask->pt_read_buf = NULL; ptask->pt_read_xfer_msgid = 0; ! ptask->pt_refcnt = 0; mutex_init(&ptask->pt_mutex, NULL, MUTEX_DRIVER, NULL); immed_pbuf = (pppt_buf_t *)(ptask + 1); bzero(immed_pbuf, sizeof (*immed_pbuf)); immed_pbuf->pbuf_is_immed = B_TRUE; immed_pbuf->pbuf_stmf_buf = (stmf_data_buf_t *)(immed_pbuf + 1);
*** 1230,1241 **** void pppt_task_free(pppt_task_t *ptask) { mutex_enter(&ptask->pt_mutex); mutex_destroy(&ptask->pt_mutex); - cv_destroy(&ptask->pt_cv); kmem_free(ptask, sizeof (pppt_task_t) + sizeof (pppt_buf_t) + sizeof (stmf_data_buf_t)); } pppt_status_t --- 1228,1239 ---- void pppt_task_free(pppt_task_t *ptask) { mutex_enter(&ptask->pt_mutex); + ASSERT(ptask->pt_refcnt == 0); mutex_destroy(&ptask->pt_mutex); kmem_free(ptask, sizeof (pppt_task_t) + sizeof (pppt_buf_t) + sizeof (stmf_data_buf_t)); } pppt_status_t
*** 1247,1256 **** --- 1245,1256 ---- mutex_enter(&ptask->pt_sess->ps_mutex); mutex_enter(&ptask->pt_mutex); if (avl_find(&ptask->pt_sess->ps_task_list, ptask, &where) == NULL) { pppt_task_update_state(ptask, PTS_ACTIVE); + /* Manually increment refcnt, sincd we hold the mutex... */ + ptask->pt_refcnt++; avl_insert(&ptask->pt_sess->ps_task_list, ptask, where); mutex_exit(&ptask->pt_mutex); mutex_exit(&ptask->pt_sess->ps_mutex); return (PPPT_STATUS_SUCCESS); }
*** 1287,1296 **** --- 1287,1298 ---- if (remove) { mutex_enter(&ptask->pt_sess->ps_mutex); avl_remove(&ptask->pt_sess->ps_task_list, ptask); mutex_exit(&ptask->pt_sess->ps_mutex); + /* Out of the AVL tree, so drop a reference. */ + pppt_task_rele(ptask); } return (pppt_status); }
*** 1399,1414 **** if (remove) { mutex_enter(&ptask->pt_sess->ps_mutex); avl_remove(&ptask->pt_sess->ps_task_list, ptask); mutex_exit(&ptask->pt_sess->ps_mutex); } return (pppt_status); } ! static pppt_status_t pppt_task_hold(pppt_task_t *ptask) { pppt_status_t pppt_status = PPPT_STATUS_SUCCESS; mutex_enter(&ptask->pt_mutex); --- 1401,1418 ---- if (remove) { mutex_enter(&ptask->pt_sess->ps_mutex); avl_remove(&ptask->pt_sess->ps_task_list, ptask); mutex_exit(&ptask->pt_sess->ps_mutex); + /* Out of the AVL tree, so drop a reference. */ + pppt_task_rele(ptask); } return (pppt_status); } ! pppt_status_t pppt_task_hold(pppt_task_t *ptask) { pppt_status_t pppt_status = PPPT_STATUS_SUCCESS; mutex_enter(&ptask->pt_mutex);
*** 1423,1436 **** } static void pppt_task_rele(pppt_task_t *ptask) { mutex_enter(&ptask->pt_mutex); ptask->pt_refcnt--; ! cv_signal(&ptask->pt_cv); mutex_exit(&ptask->pt_mutex); } static void pppt_task_update_state(pppt_task_t *ptask, pppt_task_state_t new_state) --- 1427,1444 ---- } static void pppt_task_rele(pppt_task_t *ptask) { + boolean_t freeit; + mutex_enter(&ptask->pt_mutex); ptask->pt_refcnt--; ! freeit = (ptask->pt_refcnt == 0); mutex_exit(&ptask->pt_mutex); + if (freeit) + pppt_task_free(ptask); } static void pppt_task_update_state(pppt_task_t *ptask, pppt_task_state_t new_state)
*** 1438,1444 **** PPPT_LOG(CE_NOTE, "task %p %d -> %d", (void *)ptask, ptask->pt_state, new_state); ASSERT(mutex_owned(&ptask->pt_mutex)); ptask->pt_state = new_state; - cv_signal(&ptask->pt_cv); } --- 1446,1451 ----