covert iscsi_tcp
RFC PATCH 4/5 covert iscsi_tcp
convert open-iscsi to use new class/lib functions.
Signed-off-by Mike Christie <[email protected]>
drivers/scsi/iscsi_tcp.c +86 -86
@@ -314,8 +314,8 @@ out:debug_scsi ("done [sc %lx res %d itt 0x%x]\n" , (long )sc, sc->result, ctask->itt); conn->scsirsp_pdus_cnt++; + ctask->done (sc);iscsi_ctask_cleanup (conn, ctask); - sc->scsi_done (sc);return rc; }
@@ -988,8 +988,8 @@ done:debug_scsi ("done [sc %lx res %d itt 0x%x]\n" , (long )sc, sc->result, ctask->itt); conn->scsirsp_pdus_cnt++; + ctask->done (sc);iscsi_ctask_cleanup (conn, ctask); - sc->scsi_done (sc); }return rc;
@@ -2296,14 +2296,8 @@ iscsi_xmitworker(void *data)up (&conn->xmitsema); } -#define FAILURE_BAD_HOST 1 -#define FAILURE_SESSION_FAILED 2 -#define FAILURE_SESSION_FREED 3 -#define FAILURE_WINDOW_CLOSED 4 -#define FAILURE_SESSION_TERMINATE 5 -static int -iscsi_queuecommand (struct scsi_cmnd *sc,void (*done)(struct scsi_cmnd *)) +iscsi_execute_task (struct scsi_cmnd *sc,void (*done)(struct scsi_cmnd *)) {struct Scsi_Host *host;int reason =0 ;
@@ -2311,7 +2305,6 @@ iscsi_queuecommand(struct scsi_cmnd *sc,struct iscsi_conn *conn =NULL ;struct iscsi_cmd_task *ctask =NULL ; - sc->scsi_done = done; sc->result =0 ; host = sc->device->host;
@@ -2322,13 +2315,13 @@ iscsi_queuecommand(struct scsi_cmnd *sc,if (session->state !=ISCSI_STATE_LOGGED_IN ) {if (session->state ==ISCSI_STATE_FAILED ) { - reason =FAILURE_SESSION_FAILED ; + reason =ISCSI_FAILURE_SESSION_FAILED ; goto reject; }else if (session->state ==ISCSI_STATE_TERMINATE ) { - reason =FAILURE_SESSION_TERMINATE ; + reason =ISCSI_FAILURE_SESSION_TERMINATE ; goto fault; } - reason =FAILURE_SESSION_FREED ; + reason =ISCSI_FAILURE_SESSION_FREED ; goto fault; }
@@ -2336,7 +2329,7 @@ iscsi_queuecommand(struct scsi_cmnd *sc,* Check for iSCSI window and take care of CmdSN wrap-around */ if ((int )(session->max_cmdsn - session->cmdsn) <0 ) { - reason =FAILURE_WINDOW_CLOSED ; + reason =ISCSI_FAILURE_WINDOW_CLOSED ; goto reject; }
@@ -2345,6 +2338,7 @@ iscsi_queuecommand(struct scsi_cmnd *sc,__kfifo_get (session->cmdpool.queue, (void *)&ctask,sizeof (void *));BUG_ON (ctask->sc); + ctask->done = done; sc->SCp.phase = session->age; sc->SCp.ptr = (char *)ctask;iscsi_cmd_init (conn, ctask, sc);
@@ -2356,36 +2350,20 @@ iscsi_queuecommand(struct scsi_cmnd *sc, conn->id, (long )sc, ctask->itt, sc->request_bufflen, session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1);spin_unlock (&session->lock); - -if (!in_interrupt () && !down_trylock (&conn->xmitsema)) { -spin_unlock_irq (host->host_lock); -if (iscsi_data_xmit (conn)) -schedule_work (&conn->xmitwork); -up (&conn->xmitsema); -spin_lock_irq (host->host_lock); - }else -schedule_work (&conn->xmitwork); +schedule_work (&conn->xmitwork);return 0 ; reject:spin_unlock (&session->lock);debug_scsi ("cmd 0x%x rejected (%d)\n" , sc->cmnd[0 ], reason); -return SCSI_MLQUEUE_HOST_BUSY ; +return reason; fault:spin_unlock (&session->lock);printk (KERN_ERR "iscsi_tcp: cmd 0x%x is not queued (%d)\n" , sc->cmnd[0 ], reason); - sc->sense_buffer[0 ] =0x70 ; - sc->sense_buffer[2 ] =NOT_READY ; - sc->sense_buffer[7 ] =0x6 ; - sc->sense_buffer[12 ] =0x08 ; - sc->sense_buffer[13 ] =0x00 ; - sc->result = (DID_NO_CONNECT <<16 ); - sc->resid = sc->request_bufflen; - sc->scsi_done (sc); -return 0 ; +return reason; } static int
@@ -2443,17 +2421,13 @@ iscsi_pool_free(struct iscsi_queue *q, vkfree (items); } -static iscsi_connh_t -iscsi_conn_create (iscsi_sessionh_t sessionh,uint32_t conn_idx) +static int +iscsi_conn_create (struct Scsi_Host *shost,void *conndata,uint32_t conn_idx) { -struct iscsi_session *session =iscsi_ptr (sessionh); -struct iscsi_conn *conn =NULL ; +struct iscsi_session *session =iscsi_hostdata (shost->hostdata); +struct iscsi_conn *conn = conndata; - conn =kmalloc (sizeof (struct iscsi_conn ),GFP_KERNEL ); -if (conn ==NULL ) - goto conn_alloc_fail;memset (conn,0 ,sizeof (struct iscsi_conn )); - conn->c_stage =ISCSI_CONN_INITIAL_STAGE ; conn->in_progress =IN_PROGRESS_WAIT_HEADER ; conn->id = conn_idx;
@@ -2515,7 +2489,7 @@ iscsi_conn_create(iscsi_sessionh_t sessiinit_MUTEX (&conn->xmitsema);init_waitqueue_head (&conn->ehwait); -return iscsi_handle (conn); +return 0 ; max_recv_dlenght_alloc_fail:spin_lock_bh (&session->lock);
@@ -2531,15 +2505,13 @@ immqueue_alloc_fail: writequeue_alloc_fail:kfifo_free (conn->xmitqueue); xmitqueue_alloc_fail: -kfree (conn); -conn_alloc_fail: -return iscsi_handle (NULL ); +return -ENOMEM ; }static void -iscsi_conn_destroy (iscsi_connh_t connh) +iscsi_conn_destroy (void *data) { -struct iscsi_conn *conn =iscsi_ptr (connh); +struct iscsi_conn *conn = data;struct iscsi_session *session = conn->session;down (&conn->xmitsema);
@@ -2633,7 +2605,6 @@ iscsi_conn_destroy(iscsi_connh_t connh)kfifo_free (conn->writequeue);kfifo_free (conn->immqueue);kfifo_free (conn->mgmtqueue); -kfree (conn); } static int
@@ -2769,7 +2740,6 @@ iscsi_conn_stop(iscsi_connh_t connh, intstruct iscsi_conn *conn =iscsi_ptr (connh);struct iscsi_session *session = conn->session;struct sock *sk; -unsigned long flags;BUG_ON (!conn->sock); sk = conn->sock->sk;
@@ -2779,7 +2749,6 @@ iscsi_conn_stop(iscsi_connh_t connh, intdown (&conn->xmitsema); -spin_lock_irqsave (session->host->host_lock, flags);spin_lock (&session->lock); conn->stop_stage = flag; conn->c_stage =ISCSI_CONN_STOPPED ;
@@ -2792,7 +2761,6 @@ iscsi_conn_stop(iscsi_connh_t connh, int session->state =ISCSI_STATE_FAILED ;spin_unlock (&session->lock); -spin_unlock_irqrestore (session->host->host_lock, flags);if (flag ==STOP_CONN_TERM || flag ==STOP_CONN_RECOVER ) {struct iscsi_cmd_task *ctask;
@@ -3247,7 +3215,7 @@ iscsi_r2tpool_free(struct iscsi_sessionstatic struct scsi_host_template iscsi_sht = { .name ="iSCSI Initiator over TCP/IP, v." ISCSI_VERSION_STR , - .queuecommand = iscsi_queuecommand, + .queuecommand = iscsi_scsi_queuecmd, .can_queue =ISCSI_XMIT_CMDS_MAX -1 , .sg_tablesize =ISCSI_SG_TABLESIZE , .cmd_per_lun =ISCSI_CMD_PER_LUN ,
@@ -3258,17 +3226,15 @@ static struct scsi_host_template iscsi_s .this_id = -1, }; -static iscsi_sessionh_t -iscsi_session_create (uint32_t initial_cmdsn,struct Scsi_Host *host) +static int +iscsi_session_create (struct iscsi_host *ihost,struct Scsi_Host *shost, +uint32_t initial_cmdsn) { +struct iscsi_session *session =iscsi_hostdata (shost->hostdata);int cmd_i; -struct iscsi_session *session; - session =iscsi_hostdata (host->hostdata);memset (session,0 ,sizeof (struct iscsi_session )); - - session->host = host; - session->id = host->host_no; + session->host = shost; session->state =ISCSI_STATE_LOGGED_IN ; session->mgmtpool_max =ISCSI_MGMT_CMDS_MAX ; session->cmds_max =ISCSI_XMIT_CMDS_MAX ;
@@ -3312,7 +3278,7 @@ iscsi_session_create(uint32_t initial_cmif (iscsi_r2tpool_alloc (session)) goto r2tpool_alloc_fail; -return iscsi_handle (session); +return 0 ; r2tpool_alloc_fail:for (cmd_i =0 ; cmd_i < session->mgmtpool_max; cmd_i++)
@@ -3322,15 +3288,15 @@ immdata_alloc_fail: mgmtpool_alloc_fail:iscsi_pool_free (&session->cmdpool, (void **)session->cmds); cmdpool_alloc_fail: -return iscsi_handle (NULL ); +return -ENOMEM ; }static void -iscsi_session_destroy (iscsi_sessionh_t sessionh) +iscsi_session_destroy (struct iscsi_host *ihost,struct Scsi_Host *shost) { +struct iscsi_session *session =iscsi_hostdata (shost->hostdata);int cmd_i;struct iscsi_data_task *dtask, *n; -struct iscsi_session *session =iscsi_ptr (sessionh);for (cmd_i =0 ; cmd_i < session->cmds_max; cmd_i++) {struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
@@ -3492,25 +3458,12 @@ iscsi_conn_set_param(iscsi_connh_t connh }static int -iscsi_conn_get_param (iscsi_connh_t connh,enum iscsi_param param, -uint32_t *value) +iscsi_session_get_param (struct Scsi_Host *shost, +enum iscsi_param param,uint32_t *value) { -struct iscsi_conn *conn =iscsi_ptr (connh); -struct iscsi_session *session = conn->session; +struct iscsi_session *session =iscsi_hostdata (shost->hostdata);switch (param) { -case ISCSI_PARAM_MAX_RECV_DLENGTH : - *value = conn->max_recv_dlength; -break ; -case ISCSI_PARAM_MAX_XMIT_DLENGTH : - *value = conn->max_xmit_dlength; -break ; -case ISCSI_PARAM_HDRDGST_EN : - *value = conn->hdrdgst_en; -break ; -case ISCSI_PARAM_DATADGST_EN : - *value = conn->datadgst_en; -break ;case ISCSI_PARAM_INITIAL_R2T_EN : *value = session->initial_r2t_en;break ;
@@ -3548,6 +3501,31 @@ iscsi_conn_get_param(iscsi_connh_t connhreturn 0 ; } +static int +iscsi_conn_get_param (void *data,enum iscsi_param param,uint32_t *value) +{ +struct iscsi_conn *conn = data; + +switch (param) { +case ISCSI_PARAM_MAX_RECV_DLENGTH : + *value = conn->max_recv_dlength; +break ; +case ISCSI_PARAM_MAX_XMIT_DLENGTH : + *value = conn->max_xmit_dlength; +break ; +case ISCSI_PARAM_HDRDGST_EN : + *value = conn->hdrdgst_en; +break ; +case ISCSI_PARAM_DATADGST_EN : + *value = conn->datadgst_en; +break ; +default : +return ISCSI_ERR_PARAM_NOT_FOUND ; + } + +return 0 ; +} +static void iscsi_conn_get_stats (iscsi_connh_t connh,struct iscsi_stats *stats) {
@@ -3592,6 +3570,7 @@ static struct iscsi_transport iscsi_tcp_ | CAP_DATADGST, .host_template = &iscsi_sht, .hostdata_size = sizeof(struct iscsi_session), + .conndata_size = sizeof(struct iscsi_conn), .max_conn = 1, .max_cmd_len = ISCSI_TCP_MAX_CMD_LEN, .create_session = iscsi_session_create,
@@ -3600,18 +3579,21 @@ static struct iscsi_transport iscsi_tcp_ .bind_conn = iscsi_conn_bind, .destroy_conn = iscsi_conn_destroy, .set_param = iscsi_conn_set_param, - .get_param = iscsi_conn_get_param, + .get_conn_param = iscsi_conn_get_param, + .get_session_param = iscsi_session_get_param, .start_conn = iscsi_conn_start, .stop_conn = iscsi_conn_stop, .send_pdu = iscsi_conn_send_pdu, .get_stats = iscsi_conn_get_stats, + .execute_task = iscsi_execute_task, }; +static struct scsi_transport_template *scsi_transport; +static struct iscsi_host *ihost; +static int __init iscsi_tcp_init (void ) { -int error; -if (iscsi_max_lun <1 ) {printk (KERN_ERR "Invalid max_lun value of %u\n" , iscsi_max_lun);return -EINVAL ;
@@ -3624,16 +3606,34 @@ iscsi_tcp_init(void)if (!taskcache)return -ENOMEM ; - error =iscsi_register_transport (&iscsi_tcp_transport); -if (error) -kmem_cache_destroy (taskcache); + scsi_transport =iscsi_register_transport (&iscsi_tcp_transport); +if (!scsi_transport) + goto free_task_cache; -return error; + ihost =iscsi_alloc_iscsi_host (&iscsi_tcp_transport, scsi_transport); +if (!ihost) + goto unregister_transport; + +if (iscsi_add_iscsi_host (ihost,NULL ,"iscsi_tcp" )) + goto free_iscsi_host; + +return 0 ; + +free_iscsi_host: +iscsi_host_put (ihost); +unregister_transport: +iscsi_unregister_transport (&iscsi_tcp_transport); +free_task_cache: +kmem_cache_destroy (taskcache); +return -ENOMEM ; } static void __exitiscsi_tcp_exit (void ) { +iscsi_remove_iscsi_host (ihost); +iscsi_host_put (ihost); +iscsi_unregister_transport (&iscsi_tcp_transport);kmem_cache_destroy (taskcache); }
drivers/scsi/iscsi_tcp.h +1 -1
@@ -214,7 +214,6 @@ struct iscsi_session {/* control data */ struct Scsi_Host *host; -int id;struct iscsi_conn *leadconn;/* leading connection */ spinlock_t lock;/* protects session state, * * sequence numbers, *
@@ -317,6 +316,7 @@ struct iscsi_cmd_task {struct iscsi_buf immbuf;/* for imm data digest */ struct iscsi_data_task *dtask;/* data task in progress*/ int digest_offset;/* for partial buff digest */ + void (*done)(struct scsi_cmnd *); /* completion fn */ };#endif /* ISCSI_H */