@@ -2931,10 +2931,15 @@ iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
task->itt = cmd_i;
task->state = ISCSI_TASK_FREE;
INIT_LIST_HEAD(&task->running);
+
+ if (iscsit->alloc_task_priv) {
+ if (iscsit->alloc_task_priv(session, task))
+ goto free_task_priv;
+ }
}
if (!try_module_get(iscsit->owner))
- goto module_get_fail;
+ goto free_task_priv;
if (iscsi_add_session(cls_session, id))
goto cls_session_fail;
@@ -2943,7 +2948,12 @@ iscsi_session_setup(struct iscsi_transport *iscsit, struct Scsi_Host *shost,
cls_session_fail:
module_put(iscsit->owner);
-module_get_fail:
+free_task_priv:
+ for (cmd_i--; cmd_i >= 0; cmd_i--) {
+ if (iscsit->free_task_priv)
+ iscsit->free_task_priv(session, session->cmds[cmd_i]);
+ }
+
iscsi_pool_free(&session->cmdpool);
cmdpool_alloc_fail:
iscsi_free_session(cls_session);
@@ -2962,6 +2972,13 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
struct iscsi_session *session = cls_session->dd_data;
struct module *owner = cls_session->transport->owner;
struct Scsi_Host *shost = session->host;
+ int cmd_i;
+
+ for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
+ if (session->tt->free_task_priv)
+ session->tt->free_task_priv(session,
+ session->cmds[cmd_i]);
+ }
iscsi_pool_free(&session->cmdpool);
@@ -22,6 +22,7 @@ struct Scsi_Host;
struct scsi_cmnd;
struct iscsi_cls_conn;
struct iscsi_conn;
+struct iscsi_session;
struct iscsi_task;
struct sockaddr;
struct iscsi_iface;
@@ -106,6 +107,10 @@ struct iscsi_transport {
void (*get_stats) (struct iscsi_cls_conn *conn,
struct iscsi_stats *stats);
+ int (*alloc_task_priv) (struct iscsi_session *session,
+ struct iscsi_task *task);
+ void (*free_task_priv) (struct iscsi_session *session,
+ struct iscsi_task *task);
int (*init_task) (struct iscsi_task *task);
int (*xmit_task) (struct iscsi_task *task);
void (*cleanup_task) (struct iscsi_task *task);
Some drivers need to allocate resources with functions like dma_alloc* that can't be allocated with the iscsi_task struct. The next patches have the iscsi drivers use the block/scsi mq cmd allocators for scsi tasks and the drivers can use the init_cmd_priv callout to allocate these extra resource for scsi tasks there. For mgmt tasks, drivers can use the callouts added in this patch. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/scsi/libiscsi.c | 21 +++++++++++++++++++-- include/scsi/scsi_transport_iscsi.h | 5 +++++ 2 files changed, 24 insertions(+), 2 deletions(-)