@@ -232,7 +232,7 @@ static int beiscsi_eh_abort(struct scsi_cmnd *sc)
return SUCCESS;
}
/* get a task ref till FW processes the req for the ICD used */
- __iscsi_get_task(abrt_task);
+ iscsi_get_task(abrt_task);
abrt_io_task = abrt_task->dd_data;
conn = abrt_task->conn;
beiscsi_conn = conn->dd_data;
@@ -287,7 +287,7 @@ static bool beiscsi_dev_reset_sc_iter(struct scsi_cmnd *sc, void *data,
}
/* get a task ref till FW processes the req for the ICD used */
- __iscsi_get_task(task);
+ iscsi_get_task(task);
io_task = task->dd_data;
/* mark WRB invalid which have been not processed by FW yet */
if (is_chip_be2_be3r(phba)) {
@@ -1253,7 +1253,7 @@ hwi_complete_drvr_msgs(struct beiscsi_conn *beiscsi_conn,
if (task) {
spin_lock(&task->lock);
if (!iscsi_task_is_completed(task))
- __iscsi_get_task(task);
+ iscsi_get_task(task);
else
task = NULL;
spin_unlock(&task->lock);
@@ -1366,7 +1366,7 @@ static void hwi_complete_cmd(struct beiscsi_conn *beiscsi_conn,
if (task) {
spin_lock(&task->lock);
if (!iscsi_task_is_completed(task))
- __iscsi_get_task(task);
+ iscsi_get_task(task);
else
task = NULL;
spin_unlock(&task->lock);
@@ -1162,10 +1162,8 @@ static void bnx2i_cleanup_task(struct iscsi_task *task)
if (task->state == ISCSI_TASK_ABRT_TMF) {
bnx2i_send_cmd_cleanup_req(hba, task->dd_data);
- spin_unlock_bh(&conn->session->back_lock);
wait_for_completion_timeout(&bnx2i_conn->cmd_cleanup_cmpl,
msecs_to_jiffies(ISCSI_CMD_CLEANUP_TIMEOUT));
- spin_lock_bh(&conn->session->back_lock);
}
bnx2i_iscsi_unmap_sg_list(task->dd_data);
}
@@ -486,28 +486,17 @@ static void iscsi_free_task(struct iscsi_task *task)
sc->scsi_done(sc);
}
-void __iscsi_get_task(struct iscsi_task *task)
+void iscsi_get_task(struct iscsi_task *task)
{
refcount_inc(&task->refcount);
}
-EXPORT_SYMBOL_GPL(__iscsi_get_task);
+EXPORT_SYMBOL_GPL(iscsi_get_task);
-void __iscsi_put_task(struct iscsi_task *task)
+void iscsi_put_task(struct iscsi_task *task)
{
if (refcount_dec_and_test(&task->refcount))
iscsi_free_task(task);
}
-EXPORT_SYMBOL_GPL(__iscsi_put_task);
-
-void iscsi_put_task(struct iscsi_task *task)
-{
- struct iscsi_session *session = task->conn->session;
-
- /* regular RX path uses back_lock */
- spin_lock_bh(&session->back_lock);
- __iscsi_put_task(task);
- spin_unlock_bh(&session->back_lock);
-}
EXPORT_SYMBOL_GPL(iscsi_put_task);
/**
@@ -536,7 +525,7 @@ static void iscsi_finish_task(struct iscsi_task *task, int state)
WRITE_ONCE(conn->ping_task, NULL);
/* release get from queueing */
- __iscsi_put_task(task);
+ iscsi_put_task(task);
}
/**
@@ -587,12 +576,12 @@ static bool cleanup_queued_task(struct iscsi_task *task)
*/
if (task->state == ISCSI_TASK_RUNNING ||
task->state == ISCSI_TASK_COMPLETED)
- __iscsi_put_task(task);
+ iscsi_put_task(task);
}
if (conn->task == task) {
conn->task = NULL;
- __iscsi_put_task(task);
+ iscsi_put_task(task);
}
return early_complete;
@@ -788,10 +777,7 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
return task;
free_task:
- /* regular RX path uses back_lock */
- spin_lock(&session->back_lock);
- __iscsi_put_task(task);
- spin_unlock(&session->back_lock);
+ iscsi_put_task(task);
return NULL;
}
@@ -1156,7 +1142,7 @@ struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *conn, itt_t itt)
if (iscsi_task_is_completed(task))
return NULL;
- __iscsi_get_task(task);
+ iscsi_get_task(task);
return task;
} else {
return iscsi_itt_to_ctask(conn, itt);
@@ -1426,7 +1412,7 @@ struct iscsi_task *iscsi_itt_to_ctask(struct iscsi_conn *conn, itt_t itt)
spin_unlock_bh(&task->lock);
return NULL;
}
- __iscsi_get_task(task);
+ iscsi_get_task(task);
spin_unlock_bh(&task->lock);
return task;
@@ -1505,11 +1491,9 @@ static int iscsi_xmit_task(struct iscsi_conn *conn, struct iscsi_task *task,
{
int rc;
- spin_lock_bh(&conn->session->back_lock);
-
if (!conn->task) {
/* Take a ref so we can access it after xmit_task() */
- __iscsi_get_task(task);
+ iscsi_get_task(task);
} else {
/* Already have a ref from when we failed to send it last call */
conn->task = NULL;
@@ -1520,7 +1504,7 @@ static int iscsi_xmit_task(struct iscsi_conn *conn, struct iscsi_task *task,
* case a bad target sends a cmd rsp before we have handled the task.
*/
if (was_requeue)
- __iscsi_put_task(task);
+ iscsi_put_task(task);
/*
* Do this after dropping the extra ref because if this was a requeue
@@ -1532,31 +1516,26 @@ static int iscsi_xmit_task(struct iscsi_conn *conn, struct iscsi_task *task,
* task and get woken up again.
*/
conn->task = task;
- spin_unlock_bh(&conn->session->back_lock);
return -ENODATA;
}
- spin_unlock_bh(&conn->session->back_lock);
spin_unlock_bh(&conn->session->frwd_lock);
rc = conn->session->tt->xmit_task(task);
- spin_lock_bh(&conn->session->frwd_lock);
if (!rc) {
/* done with this task */
task->last_xfer = jiffies;
+ iscsi_put_task(task);
}
- /* regular RX path uses back_lock */
- spin_lock(&conn->session->back_lock);
+
+ spin_lock_bh(&conn->session->frwd_lock);
if (rc) {
/*
- * get an extra ref that is released next time we access it
- * as conn->task above.
+ * Keep ref from above. Will be released next time we access it
+ * as conn->task.
*/
- __iscsi_get_task(task);
conn->task = task;
}
- __iscsi_put_task(task);
- spin_unlock(&conn->session->back_lock);
return rc;
}
@@ -1627,10 +1606,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
running);
list_del_init(&task->running);
if (iscsi_prep_mgmt_task(conn, task)) {
- /* regular RX path uses back_lock */
- spin_lock_bh(&conn->session->back_lock);
- __iscsi_put_task(task);
- spin_unlock_bh(&conn->session->back_lock);
+ iscsi_put_task(task);
continue;
}
rc = iscsi_xmit_task(conn, task, false);
@@ -1999,7 +1975,7 @@ static bool iscsi_sc_iter(struct scsi_cmnd *sc, void *data, bool rsvd)
spin_unlock_bh(&task->lock);
return true;
}
- __iscsi_get_task(task);
+ iscsi_get_task(task);
spin_unlock_bh(&task->lock);
if (iter_data->lun != -1 && iter_data->lun != task->sc->device->lun) {
@@ -2163,7 +2139,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
spin_unlock(&task->lock);
goto done;
}
- __iscsi_get_task(task);
+ iscsi_get_task(task);
spin_unlock(&task->lock);
if (READ_ONCE(session->state) != ISCSI_STATE_LOGGED_IN) {
@@ -2364,7 +2340,7 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
goto check_done;
}
- __iscsi_get_task(task);
+ iscsi_get_task(task);
spin_unlock_bh(&task->lock);
/*
@@ -706,11 +706,8 @@ static void qedi_mtask_completion(struct qedi_ctx *qedi,
static void qedi_process_nopin_local_cmpl(struct qedi_ctx *qedi,
struct iscsi_cqe_solicited *cqe,
- struct iscsi_task *task,
- struct qedi_conn *qedi_conn)
+ struct iscsi_task *task)
{
- struct iscsi_conn *conn = qedi_conn->cls_conn->dd_data;
- struct iscsi_session *session = conn->session;
struct qedi_cmd *cmd = task->dd_data;
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_UNSOL,
@@ -720,9 +717,7 @@ static void qedi_process_nopin_local_cmpl(struct qedi_ctx *qedi,
cmd->state = RESPONSE_RECEIVED;
qedi_clear_task_idx(qedi, cmd->task_id);
- spin_lock_bh(&session->back_lock);
- __iscsi_put_task(task);
- spin_unlock_bh(&session->back_lock);
+ iscsi_put_task(task);
}
static void qedi_process_cmd_cleanup_resp(struct qedi_ctx *qedi,
@@ -904,7 +899,7 @@ void qedi_fp_process_cqes(struct qedi_work *work)
if ((nopout_hdr->itt == RESERVED_ITT) &&
(cqe->cqe_solicited.itid != (u16)RESERVED_ITT)) {
qedi_process_nopin_local_cmpl(qedi, &cqe->cqe_solicited,
- task, q_conn);
+ task);
} else {
/* Process other solicited responses */
qedi_mtask_completion(qedi, cqe, task, q_conn, que_idx);
@@ -65,7 +65,7 @@ static int qedi_eh_abort(struct scsi_cmnd *cmd)
return SUCCESS;
}
- __iscsi_get_task(task);
+ iscsi_get_task(task);
spin_unlock_bh(&task->lock);
qedi_conn = task->conn->dd_data;
@@ -487,8 +487,7 @@ extern struct iscsi_task *iscsi_itt_to_ctask(struct iscsi_conn *, itt_t);
extern struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *, itt_t);
extern void iscsi_requeue_task(struct iscsi_task *task);
extern void iscsi_put_task(struct iscsi_task *task);
-extern void __iscsi_put_task(struct iscsi_task *task);
-extern void __iscsi_get_task(struct iscsi_task *task);
+extern void iscsi_get_task(struct iscsi_task *task);
extern void iscsi_complete_scsi_task(struct iscsi_task *task,
uint32_t exp_cmdsn, uint32_t max_cmdsn);
extern int iscsi_complete_task(struct iscsi_conn *conn, struct iscsi_task *task,
There is now no need to hold the back_lock when calling iscsi_put_task. This patch removes the cases we were grabbing it, and syncs up the ref count naming functions. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/scsi/be2iscsi/be_main.c | 8 ++-- drivers/scsi/bnx2i/bnx2i_iscsi.c | 2 - drivers/scsi/libiscsi.c | 64 ++++++++++---------------------- drivers/scsi/qedi/qedi_fw.c | 11 ++---- drivers/scsi/qedi/qedi_iscsi.c | 2 +- include/scsi/libiscsi.h | 3 +- 6 files changed, 29 insertions(+), 61 deletions(-)