[SCSI] libiscsi, iser, tcp: remove recv_lock
The recv lock was defined so the iscsi layer could block the recv path from processing IO during recovery. It turns out iser just set a lock to that pointer which was pointless. We now disconnect the transport connection before doing recovery so we do not need the recv lock. For iscsi_tcp we still stop the recv path incase older tools are being used. This patch also has iscsi_itt_to_ctask user grab the session lock and has the caller access the task with the lock or get a ref to it in case the target is broken and sends a tmf success response then sends data or a response for the command that was supposed to be affected bty the tmf. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
committed by
James Bottomley
parent
3cf7b233ff
commit
913e5bf435
@ -281,9 +281,6 @@ iscsi_iser_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx)
|
||||
conn->max_recv_dlength = 128;
|
||||
|
||||
iser_conn = conn->dd_data;
|
||||
/* currently this is the only field which need to be initiated */
|
||||
rwlock_init(&iser_conn->lock);
|
||||
|
||||
conn->dd_data = iser_conn;
|
||||
iser_conn->iscsi_conn = conn;
|
||||
|
||||
@ -342,9 +339,6 @@ iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session,
|
||||
ib_conn->iser_conn = iser_conn;
|
||||
iser_conn->ib_conn = ib_conn;
|
||||
iser_conn_get(ib_conn);
|
||||
|
||||
conn->recv_lock = &iser_conn->lock;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -355,12 +349,18 @@ iscsi_iser_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
|
||||
struct iscsi_iser_conn *iser_conn = conn->dd_data;
|
||||
struct iser_conn *ib_conn = iser_conn->ib_conn;
|
||||
|
||||
iscsi_conn_stop(cls_conn, flag);
|
||||
/*
|
||||
* There is no unbind event so the stop callback
|
||||
* must release the ref from the bind.
|
||||
* Userspace may have goofed up and not bound the connection or
|
||||
* might have only partially setup the connection.
|
||||
*/
|
||||
iser_conn_put(ib_conn);
|
||||
if (ib_conn) {
|
||||
iscsi_conn_stop(cls_conn, flag);
|
||||
/*
|
||||
* There is no unbind event so the stop callback
|
||||
* must release the ref from the bind.
|
||||
*/
|
||||
iser_conn_put(ib_conn);
|
||||
}
|
||||
iser_conn->ib_conn = NULL;
|
||||
}
|
||||
|
||||
|
@ -263,8 +263,6 @@ struct iser_conn {
|
||||
struct iscsi_iser_conn {
|
||||
struct iscsi_conn *iscsi_conn;/* ptr to iscsi conn */
|
||||
struct iser_conn *ib_conn; /* iSER IB conn */
|
||||
|
||||
rwlock_t lock;
|
||||
};
|
||||
|
||||
struct iscsi_iser_task {
|
||||
|
@ -558,7 +558,12 @@ void iser_rcv_completion(struct iser_desc *rx_desc,
|
||||
opcode = hdr->opcode & ISCSI_OPCODE_MASK;
|
||||
|
||||
if (opcode == ISCSI_OP_SCSI_CMD_RSP) {
|
||||
spin_lock(&conn->iscsi_conn->session->lock);
|
||||
task = iscsi_itt_to_ctask(conn->iscsi_conn, hdr->itt);
|
||||
if (task)
|
||||
__iscsi_get_task(task);
|
||||
spin_unlock(&conn->iscsi_conn->session->lock);
|
||||
|
||||
if (!task)
|
||||
iser_err("itt can't be matched to task!!! "
|
||||
"conn %p opcode %d itt %d\n",
|
||||
@ -568,6 +573,7 @@ void iser_rcv_completion(struct iser_desc *rx_desc,
|
||||
iser_dbg("itt %d task %p\n",hdr->itt, task);
|
||||
iser_task->status = ISER_TASK_STATUS_COMPLETED;
|
||||
iser_task_rdma_finalize(iser_task);
|
||||
iscsi_put_task(task);
|
||||
}
|
||||
}
|
||||
iser_dto_buffs_release(dto);
|
||||
|
Reference in New Issue
Block a user