aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/iscsi_tcp.c
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2006-02-01 22:06:49 -0500
committer <jejb@mulgrave.il.steeleye.com>2006-02-04 17:17:03 -0500
commit7b7232f3fb5ecd7c30cb52df368070cc5f5ca614 (patch)
treec7430280a69e587575bba336259e11a7aec8674e /drivers/scsi/iscsi_tcp.c
parentbb08f92ebd75704e07d69bb9d8ee234d1a500b98 (diff)
[SCSI] iscsi update: cleanup iscsi class interface
From: michaelc@cs.wisc.edu fujita.tomonori@lab.ntt.co.jp da-x@monatomic.org and err path fixup from: ogerlitz@voltaire.com This patch cleans up that interface by having the lld and class pass a iscsi_cls_session or iscsi_cls_conn between each other when the function is used by HW and SW iscsi llds. This way the lld does not have to remember if it has to send a handle or pointer and a handle or pointer to connection, session or host. This also has the class verify the session handle that gets passed from userspace instead of using the pointer passed into the kernel directly. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: Alex Aizman <itn780@yahoo.com> Signed-off-by: Dmitry Yusupov <dmitry_yus@yahoo.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/iscsi_tcp.c')
-rw-r--r--drivers/scsi/iscsi_tcp.c70
1 files changed, 39 insertions, 31 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index 780bfcc67096..d07d309ac026 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -146,7 +146,7 @@ iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err)
146 spin_unlock_irqrestore(&session->lock, flags); 146 spin_unlock_irqrestore(&session->lock, flags);
147 set_bit(SUSPEND_BIT, &conn->suspend_tx); 147 set_bit(SUSPEND_BIT, &conn->suspend_tx);
148 set_bit(SUSPEND_BIT, &conn->suspend_rx); 148 set_bit(SUSPEND_BIT, &conn->suspend_rx);
149 iscsi_conn_error(iscsi_handle(conn), err); 149 iscsi_conn_error(conn->cls_conn, err);
150} 150}
151 151
152static inline int 152static inline int
@@ -689,7 +689,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
689 break; 689 break;
690 690
691 if (!conn->in.datalen) { 691 if (!conn->in.datalen) {
692 rc = iscsi_recv_pdu(iscsi_handle(conn), hdr, 692 rc = iscsi_recv_pdu(conn->cls_conn, hdr,
693 NULL, 0); 693 NULL, 0);
694 if (conn->login_mtask != mtask) { 694 if (conn->login_mtask != mtask) {
695 spin_lock(&session->lock); 695 spin_lock(&session->lock);
@@ -737,7 +737,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
737 if (!conn->in.datalen) { 737 if (!conn->in.datalen) {
738 struct iscsi_mgmt_task *mtask; 738 struct iscsi_mgmt_task *mtask;
739 739
740 rc = iscsi_recv_pdu(iscsi_handle(conn), hdr, 740 rc = iscsi_recv_pdu(conn->cls_conn, hdr,
741 NULL, 0); 741 NULL, 0);
742 mtask = (struct iscsi_mgmt_task *) 742 mtask = (struct iscsi_mgmt_task *)
743 session->mgmt_cmds[conn->in.itt - 743 session->mgmt_cmds[conn->in.itt -
@@ -761,7 +761,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn)
761 rc = iscsi_check_assign_cmdsn(session, 761 rc = iscsi_check_assign_cmdsn(session,
762 (struct iscsi_nopin*)hdr); 762 (struct iscsi_nopin*)hdr);
763 if (!rc && hdr->ttt != ISCSI_RESERVED_TAG) 763 if (!rc && hdr->ttt != ISCSI_RESERVED_TAG)
764 rc = iscsi_recv_pdu(iscsi_handle(conn), 764 rc = iscsi_recv_pdu(conn->cls_conn,
765 hdr, NULL, 0); 765 hdr, NULL, 0);
766 } else 766 } else
767 rc = ISCSI_ERR_PROTO; 767 rc = ISCSI_ERR_PROTO;
@@ -1044,7 +1044,7 @@ iscsi_data_recv(struct iscsi_conn *conn)
1044 goto exit; 1044 goto exit;
1045 } 1045 }
1046 1046
1047 rc = iscsi_recv_pdu(iscsi_handle(conn), conn->in.hdr, 1047 rc = iscsi_recv_pdu(conn->cls_conn, conn->in.hdr,
1048 conn->data, conn->in.datalen); 1048 conn->data, conn->in.datalen);
1049 1049
1050 if (!rc && conn->datadgst_en && 1050 if (!rc && conn->datadgst_en &&
@@ -2428,19 +2428,20 @@ iscsi_pool_free(struct iscsi_queue *q, void **items)
2428} 2428}
2429 2429
2430static struct iscsi_cls_conn * 2430static struct iscsi_cls_conn *
2431iscsi_conn_create(struct Scsi_Host *shost, uint32_t conn_idx) 2431iscsi_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx)
2432{ 2432{
2433 struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
2433 struct iscsi_session *session = iscsi_hostdata(shost->hostdata); 2434 struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
2434 struct iscsi_conn *conn; 2435 struct iscsi_conn *conn;
2435 struct iscsi_cls_conn *cls_conn; 2436 struct iscsi_cls_conn *cls_conn;
2436 2437
2437 cls_conn = iscsi_create_conn(hostdata_session(shost->hostdata), 2438 cls_conn = iscsi_create_conn(cls_session, conn_idx);
2438 conn_idx);
2439 if (!cls_conn) 2439 if (!cls_conn)
2440 return NULL; 2440 return NULL;
2441 conn = cls_conn->dd_data; 2441 conn = cls_conn->dd_data;
2442 memset(conn, 0, sizeof(*conn));
2442 2443
2443 memset(conn, 0, sizeof(struct iscsi_conn)); 2444 conn->cls_conn = cls_conn;
2444 conn->c_stage = ISCSI_CONN_INITIAL_STAGE; 2445 conn->c_stage = ISCSI_CONN_INITIAL_STAGE;
2445 conn->in_progress = IN_PROGRESS_WAIT_HEADER; 2446 conn->in_progress = IN_PROGRESS_WAIT_HEADER;
2446 conn->id = conn_idx; 2447 conn->id = conn_idx;
@@ -2625,11 +2626,13 @@ iscsi_conn_destroy(struct iscsi_cls_conn *cls_conn)
2625} 2626}
2626 2627
2627static int 2628static int
2628iscsi_conn_bind(iscsi_sessionh_t sessionh, iscsi_connh_t connh, 2629iscsi_conn_bind(struct iscsi_cls_session *cls_session,
2629 uint32_t transport_fd, int is_leading) 2630 struct iscsi_cls_conn *cls_conn, uint32_t transport_fd,
2631 int is_leading)
2630{ 2632{
2631 struct iscsi_session *session = iscsi_ptr(sessionh); 2633 struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
2632 struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = iscsi_ptr(connh); 2634 struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
2635 struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = cls_conn->dd_data;
2633 struct sock *sk; 2636 struct sock *sk;
2634 struct socket *sock; 2637 struct socket *sock;
2635 int err; 2638 int err;
@@ -2703,9 +2706,9 @@ iscsi_conn_bind(iscsi_sessionh_t sessionh, iscsi_connh_t connh,
2703} 2706}
2704 2707
2705static int 2708static int
2706iscsi_conn_start(iscsi_connh_t connh) 2709iscsi_conn_start(struct iscsi_cls_conn *cls_conn)
2707{ 2710{
2708 struct iscsi_conn *conn = iscsi_ptr(connh); 2711 struct iscsi_conn *conn = cls_conn->dd_data;
2709 struct iscsi_session *session = conn->session; 2712 struct iscsi_session *session = conn->session;
2710 struct sock *sk; 2713 struct sock *sk;
2711 2714
@@ -2754,9 +2757,9 @@ iscsi_conn_start(iscsi_connh_t connh)
2754} 2757}
2755 2758
2756static void 2759static void
2757iscsi_conn_stop(iscsi_connh_t connh, int flag) 2760iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
2758{ 2761{
2759 struct iscsi_conn *conn = iscsi_ptr(connh); 2762 struct iscsi_conn *conn = cls_conn->dd_data;
2760 struct iscsi_session *session = conn->session; 2763 struct iscsi_session *session = conn->session;
2761 struct sock *sk; 2764 struct sock *sk;
2762 unsigned long flags; 2765 unsigned long flags;
@@ -3253,9 +3256,9 @@ static struct scsi_host_template iscsi_sht = {
3253 3256
3254static struct iscsi_transport iscsi_tcp_transport; 3257static struct iscsi_transport iscsi_tcp_transport;
3255 3258
3256static struct Scsi_Host * 3259static struct iscsi_cls_session *
3257iscsi_session_create(struct scsi_transport_template *scsit, 3260iscsi_session_create(struct scsi_transport_template *scsit,
3258 uint32_t initial_cmdsn) 3261 uint32_t initial_cmdsn, uint32_t *sid)
3259{ 3262{
3260 struct Scsi_Host *shost; 3263 struct Scsi_Host *shost;
3261 struct iscsi_session *session; 3264 struct iscsi_session *session;
@@ -3275,6 +3278,7 @@ iscsi_session_create(struct scsi_transport_template *scsit,
3275 session->exp_cmdsn = initial_cmdsn + 1; 3278 session->exp_cmdsn = initial_cmdsn + 1;
3276 session->max_cmdsn = initial_cmdsn + 1; 3279 session->max_cmdsn = initial_cmdsn + 1;
3277 session->max_r2t = 1; 3280 session->max_r2t = 1;
3281 *sid = shost->host_no;
3278 3282
3279 /* initialize SCSI PDU commands pool */ 3283 /* initialize SCSI PDU commands pool */
3280 if (iscsi_pool_init(&session->cmdpool, session->cmds_max, 3284 if (iscsi_pool_init(&session->cmdpool, session->cmds_max,
@@ -3311,7 +3315,7 @@ iscsi_session_create(struct scsi_transport_template *scsit,
3311 if (iscsi_r2tpool_alloc(session)) 3315 if (iscsi_r2tpool_alloc(session))
3312 goto r2tpool_alloc_fail; 3316 goto r2tpool_alloc_fail;
3313 3317
3314 return shost; 3318 return hostdata_session(shost->hostdata);
3315 3319
3316r2tpool_alloc_fail: 3320r2tpool_alloc_fail:
3317 for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) 3321 for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++)
@@ -3321,12 +3325,14 @@ immdata_alloc_fail:
3321mgmtpool_alloc_fail: 3325mgmtpool_alloc_fail:
3322 iscsi_pool_free(&session->cmdpool, (void**)session->cmds); 3326 iscsi_pool_free(&session->cmdpool, (void**)session->cmds);
3323cmdpool_alloc_fail: 3327cmdpool_alloc_fail:
3328 iscsi_transport_destroy_session(shost);
3324 return NULL; 3329 return NULL;
3325} 3330}
3326 3331
3327static void 3332static void
3328iscsi_session_destroy(struct Scsi_Host *shost) 3333iscsi_session_destroy(struct iscsi_cls_session *cls_session)
3329{ 3334{
3335 struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
3330 struct iscsi_session *session = iscsi_hostdata(shost->hostdata); 3336 struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
3331 int cmd_i; 3337 int cmd_i;
3332 struct iscsi_data_task *dtask, *n; 3338 struct iscsi_data_task *dtask, *n;
@@ -3350,10 +3356,10 @@ iscsi_session_destroy(struct Scsi_Host *shost)
3350} 3356}
3351 3357
3352static int 3358static int
3353iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param, 3359iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param,
3354 uint32_t value) 3360 uint32_t value)
3355{ 3361{
3356 struct iscsi_conn *conn = iscsi_ptr(connh); 3362 struct iscsi_conn *conn = cls_conn->dd_data;
3357 struct iscsi_session *session = conn->session; 3363 struct iscsi_session *session = conn->session;
3358 3364
3359 spin_lock_bh(&session->lock); 3365 spin_lock_bh(&session->lock);
@@ -3495,9 +3501,10 @@ iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param,
3495} 3501}
3496 3502
3497static int 3503static int
3498iscsi_session_get_param(struct Scsi_Host *shost, 3504iscsi_session_get_param(struct iscsi_cls_session *cls_session,
3499 enum iscsi_param param, uint32_t *value) 3505 enum iscsi_param param, uint32_t *value)
3500{ 3506{
3507 struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
3501 struct iscsi_session *session = iscsi_hostdata(shost->hostdata); 3508 struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
3502 3509
3503 switch(param) { 3510 switch(param) {
@@ -3539,9 +3546,10 @@ iscsi_session_get_param(struct Scsi_Host *shost,
3539} 3546}
3540 3547
3541static int 3548static int
3542iscsi_conn_get_param(void *data, enum iscsi_param param, uint32_t *value) 3549iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
3550 enum iscsi_param param, uint32_t *value)
3543{ 3551{
3544 struct iscsi_conn *conn = data; 3552 struct iscsi_conn *conn = cls_conn->dd_data;
3545 3553
3546 switch(param) { 3554 switch(param) {
3547 case ISCSI_PARAM_MAX_RECV_DLENGTH: 3555 case ISCSI_PARAM_MAX_RECV_DLENGTH:
@@ -3564,9 +3572,9 @@ iscsi_conn_get_param(void *data, enum iscsi_param param, uint32_t *value)
3564} 3572}
3565 3573
3566static void 3574static void
3567iscsi_conn_get_stats(iscsi_connh_t connh, struct iscsi_stats *stats) 3575iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats)
3568{ 3576{
3569 struct iscsi_conn *conn = iscsi_ptr(connh); 3577 struct iscsi_conn *conn = cls_conn->dd_data;
3570 3578
3571 stats->txdata_octets = conn->txdata_octets; 3579 stats->txdata_octets = conn->txdata_octets;
3572 stats->rxdata_octets = conn->rxdata_octets; 3580 stats->rxdata_octets = conn->rxdata_octets;
@@ -3587,10 +3595,10 @@ iscsi_conn_get_stats(iscsi_connh_t connh, struct iscsi_stats *stats)
3587} 3595}
3588 3596
3589static int 3597static int
3590iscsi_conn_send_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, char *data, 3598iscsi_conn_send_pdu(struct iscsi_cls_conn *cls_conn, struct iscsi_hdr *hdr,
3591 uint32_t data_size) 3599 char *data, uint32_t data_size)
3592{ 3600{
3593 struct iscsi_conn *conn = iscsi_ptr(connh); 3601 struct iscsi_conn *conn = cls_conn->dd_data;
3594 int rc; 3602 int rc;
3595 3603
3596 mutex_lock(&conn->xmitmutex); 3604 mutex_lock(&conn->xmitmutex);