Some drivers need to allocate resources that 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@xxxxxxxxxx> --- drivers/scsi/libiscsi.c | 21 +++++++++++++++++++-- include/scsi/scsi_transport_iscsi.h | 5 +++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index ae8b755..6621a69 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -2885,10 +2885,15 @@ struct iscsi_cls_session * 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; @@ -2897,7 +2902,12 @@ struct iscsi_cls_session * 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); @@ -2916,6 +2926,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); diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index 8a26a2f..cdd358e 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h @@ -22,6 +22,7 @@ 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); -- 1.8.3.1