[SCSI] libiscsi: add completion function for drivers that do not need pdu processing
beiscsi does not need the iscsi scsi cmd processing. It does not even get this info on the completion path. This adds a function to just update the sequencing numbers and complete a task. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: Jayamohan Kallickal <jayamohank@serverengines.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
Родитель
dd784edcfc
Коммит
4c0ba5d259
|
@ -109,12 +109,9 @@ inline void iscsi_conn_queue_work(struct iscsi_conn *conn)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_conn_queue_work);
|
||||
|
||||
void
|
||||
iscsi_update_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr)
|
||||
static void __iscsi_update_cmdsn(struct iscsi_session *session,
|
||||
uint32_t exp_cmdsn, uint32_t max_cmdsn)
|
||||
{
|
||||
uint32_t max_cmdsn = be32_to_cpu(hdr->max_cmdsn);
|
||||
uint32_t exp_cmdsn = be32_to_cpu(hdr->exp_cmdsn);
|
||||
|
||||
/*
|
||||
* standard specifies this check for when to update expected and
|
||||
* max sequence numbers
|
||||
|
@ -138,6 +135,12 @@ iscsi_update_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr)
|
|||
iscsi_conn_queue_work(session->leadconn);
|
||||
}
|
||||
}
|
||||
|
||||
void iscsi_update_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr)
|
||||
{
|
||||
__iscsi_update_cmdsn(session, be32_to_cpu(hdr->exp_cmdsn),
|
||||
be32_to_cpu(hdr->max_cmdsn));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_update_cmdsn);
|
||||
|
||||
/**
|
||||
|
@ -499,6 +502,31 @@ static void iscsi_complete_task(struct iscsi_task *task, int state)
|
|||
__iscsi_put_task(task);
|
||||
}
|
||||
|
||||
/**
|
||||
* iscsi_complete_scsi_task - finish scsi task normally
|
||||
* @task: iscsi task for scsi cmd
|
||||
* @exp_cmdsn: expected cmd sn in cpu format
|
||||
* @max_cmdsn: max cmd sn in cpu format
|
||||
*
|
||||
* This is used when drivers do not need or cannot perform
|
||||
* lower level pdu processing.
|
||||
*
|
||||
* Called with session lock
|
||||
*/
|
||||
void iscsi_complete_scsi_task(struct iscsi_task *task,
|
||||
uint32_t exp_cmdsn, uint32_t max_cmdsn)
|
||||
{
|
||||
struct iscsi_conn *conn = task->conn;
|
||||
|
||||
ISCSI_DBG_SESSION(conn->session, "[itt 0x%x]\n", task->itt);
|
||||
|
||||
conn->last_recv = jiffies;
|
||||
__iscsi_update_cmdsn(conn->session, exp_cmdsn, max_cmdsn);
|
||||
iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_complete_scsi_task);
|
||||
|
||||
|
||||
/*
|
||||
* session lock must be held and if not called for a task that is
|
||||
* still pending or from the xmit thread, then xmit thread must
|
||||
|
|
|
@ -415,6 +415,8 @@ 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_get_task(struct iscsi_task *task);
|
||||
extern void iscsi_complete_scsi_task(struct iscsi_task *task,
|
||||
uint32_t exp_cmdsn, uint32_t max_cmdsn);
|
||||
|
||||
/*
|
||||
* generic helpers
|
||||
|
|
Загрузка…
Ссылка в новой задаче