diff options
author | mnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2006-01-17 00:01:35 +0000 |
---|---|---|
committer | mnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6> | 2006-01-17 00:01:35 +0000 |
commit | 50f4df4ad4ddaced989c75981cdbfdd492aa07a9 (patch) | |
tree | 871aaa573afbf3c61ab64f2a2686ae1b564832a4 | |
parent | 8a36edc4464919f0bc53e96089acdf6a19495f3b (diff) | |
download | open-iscsi-50f4df4ad4ddaced989c75981cdbfdd492aa07a9.tar.gz |
sync upstream with svn
git-svn-id: svn://svn.berlios.de/open-iscsi@458 d7303112-9cec-0310-bdd2-e83a94d6c2b6
-rw-r--r-- | include/iscsi_if.h | 2 | ||||
-rw-r--r-- | kernel/Makefile | 1 | ||||
-rw-r--r-- | kernel/iscsi_tcp.c | 82 | ||||
-rw-r--r-- | kernel/iscsi_tcp.h | 2 | ||||
-rw-r--r-- | kernel/scsi_transport_iscsi.h | 27 |
5 files changed, 71 insertions, 43 deletions
diff --git a/include/iscsi_if.h b/include/iscsi_if.h index 6cb903a..a0eab84 100644 --- a/include/iscsi_if.h +++ b/include/iscsi_if.h @@ -168,6 +168,8 @@ typedef uint64_t iscsi_connh_t; /* iSCSI Data-Path connection handle */ #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) +#define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata)) + /** * iscsi_hostdata - get LLD hostdata from scsi_host * @_hostdata: pointer to scsi host's hostdata diff --git a/kernel/Makefile b/kernel/Makefile index 5eb4869..69938b3 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -5,7 +5,6 @@ EXTRA_CFLAGS += -I$(obj) -I$(obj)/../include obj-m += scsi_transport_iscsi.o -scsi_transport_iscsi-objs := libiscsi.o iscsi_if.o obj-m += iscsi_tcp.o KSRC ?= /lib/modules/`uname -r`/build diff --git a/kernel/iscsi_tcp.c b/kernel/iscsi_tcp.c index 650b9f3..4335d4e 100644 --- a/kernel/iscsi_tcp.c +++ b/kernel/iscsi_tcp.c @@ -33,6 +33,7 @@ #include <linux/delay.h> #include <linux/kfifo.h> #include <linux/scatterlist.h> +#include <linux/mutex.h> #include <net/tcp.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_device.h> @@ -49,7 +50,7 @@ MODULE_AUTHOR("Dmitry Yusupov <dmitry_yus@yahoo.com>, " "Alex Aizman <itn780@yahoo.com>"); MODULE_DESCRIPTION("iSCSI/TCP data-path"); MODULE_LICENSE("GPL"); -MODULE_VERSION("0:5.456"); +MODULE_VERSION("0:4.445"); /* #define DEBUG_TCP */ /* #define DEBUG_SCSI */ #define DEBUG_ASSERT @@ -2272,10 +2273,10 @@ iscsi_xmitworker(void *data) /* * serialize Xmit worker on a per-connection basis. */ - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); if (iscsi_data_xmit(conn)) scsi_queue_work(conn->session->host, &conn->xmitwork); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); } #define FAILURE_BAD_HOST 1 @@ -2426,11 +2427,18 @@ iscsi_pool_free(struct iscsi_queue *q, void **items) kfree(items); } -static int -iscsi_conn_create(struct Scsi_Host *shost, void *conndata, uint32_t conn_idx) +static struct iscsi_cls_conn * +iscsi_conn_create(struct Scsi_Host *shost, uint32_t conn_idx) { struct iscsi_session *session = iscsi_hostdata(shost->hostdata); - struct iscsi_conn *conn = conndata; + struct iscsi_conn *conn; + struct iscsi_cls_conn *cls_conn; + + cls_conn = iscsi_create_conn(hostdata_session(shost->hostdata), + conn_idx); + if (!cls_conn) + return NULL; + conn = cls_conn->dd_data; memset(conn, 0, sizeof(struct iscsi_conn)); conn->c_stage = ISCSI_CONN_INITIAL_STAGE; @@ -2491,10 +2499,10 @@ iscsi_conn_create(struct Scsi_Host *shost, void *conndata, uint32_t conn_idx) goto max_recv_dlenght_alloc_fail; init_timer(&conn->tmabort_timer); - init_MUTEX(&conn->xmitsema); + mutex_init(&conn->xmitmutex); init_waitqueue_head(&conn->ehwait); - return 0; + return cls_conn; max_recv_dlenght_alloc_fail: spin_lock_bh(&session->lock); @@ -2510,17 +2518,18 @@ immqueue_alloc_fail: writequeue_alloc_fail: kfifo_free(conn->xmitqueue); xmitqueue_alloc_fail: - return -ENOMEM; + iscsi_destroy_conn(cls_conn); + return NULL; } static void -iscsi_conn_destroy(void *data) +iscsi_conn_destroy(struct iscsi_cls_conn *cls_conn) { - struct iscsi_conn *conn = data; + struct iscsi_conn *conn = cls_conn->dd_data; struct iscsi_session *session = conn->session; unsigned long flags; - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); set_bit(SUSPEND_BIT, &conn->suspend_tx); if (conn->c_stage == ISCSI_CONN_INITIAL_STAGE && conn->sock) { struct sock *sk = conn->sock->sk; @@ -2551,7 +2560,7 @@ iscsi_conn_destroy(void *data) } spin_unlock_bh(&session->lock); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); /* * Block until all in-progress commands for this connection @@ -2611,6 +2620,8 @@ iscsi_conn_destroy(void *data) kfifo_free(conn->writequeue); kfifo_free(conn->immqueue); kfifo_free(conn->mgmtqueue); + + iscsi_destroy_conn(cls_conn); } static int @@ -2756,7 +2767,7 @@ iscsi_conn_stop(iscsi_connh_t connh, int flag) set_bit(SUSPEND_BIT, &conn->suspend_rx); write_unlock_bh(&sk->sk_callback_lock); - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); spin_lock_irqsave(session->host->host_lock, flags); spin_lock(&session->lock); @@ -2838,7 +2849,7 @@ iscsi_conn_stop(iscsi_connh_t connh, int flag) conn->datadgst_en = 0; } } - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); } static int @@ -2988,12 +2999,12 @@ iscsi_eh_abort(struct scsi_cmnd *sc) * 1) connection-level failure; * 2) recovery due protocol error; */ - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); spin_lock_bh(&session->lock); if (session->state != ISCSI_STATE_LOGGED_IN) { if (session->state == ISCSI_STATE_TERMINATE) { spin_unlock_bh(&session->lock); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); goto failed; } spin_unlock_bh(&session->lock); @@ -3011,7 +3022,7 @@ iscsi_eh_abort(struct scsi_cmnd *sc) * 2) session was re-open during time out of ctask. */ spin_unlock_bh(&session->lock); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); goto success; } conn->tmabort_state = TMABORT_INITIAL; @@ -3066,7 +3077,7 @@ iscsi_eh_abort(struct scsi_cmnd *sc) conn->tmabort_state == TMABORT_SUCCESS) { conn->tmabort_state = TMABORT_INITIAL; spin_unlock_bh(&session->lock); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); goto success; } conn->tmabort_state = TMABORT_INITIAL; @@ -3075,7 +3086,7 @@ iscsi_eh_abort(struct scsi_cmnd *sc) spin_unlock_bh(&session->lock); } } - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); /* @@ -3141,7 +3152,7 @@ failed: exit: del_timer_sync(&conn->tmabort_timer); - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); if (conn->sock) { struct sock *sk = conn->sock->sk; @@ -3149,7 +3160,7 @@ exit: iscsi_ctask_cleanup(conn, ctask); write_unlock_bh(&sk->sk_callback_lock); } - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); return rc; } @@ -3240,12 +3251,21 @@ static struct scsi_host_template iscsi_sht = { .this_id = -1, }; -static int -iscsi_session_create(struct Scsi_Host *shost, uint32_t initial_cmdsn) +static struct iscsi_transport iscsi_tcp_transport; + +static struct Scsi_Host * +iscsi_session_create(struct scsi_transport_template *scsit, + uint32_t initial_cmdsn) { - struct iscsi_session *session = iscsi_hostdata(shost->hostdata); + struct Scsi_Host *shost; + struct iscsi_session *session; int cmd_i; + shost = iscsi_transport_create_session(scsit, &iscsi_tcp_transport); + if (!shost) + return NULL; + + session = iscsi_hostdata(shost->hostdata); memset(session, 0, sizeof(struct iscsi_session)); session->host = shost; session->state = ISCSI_STATE_LOGGED_IN; @@ -3291,7 +3311,7 @@ iscsi_session_create(struct Scsi_Host *shost, uint32_t initial_cmdsn) if (iscsi_r2tpool_alloc(session)) goto r2tpool_alloc_fail; - return 0; + return shost; r2tpool_alloc_fail: for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) @@ -3301,7 +3321,7 @@ immdata_alloc_fail: mgmtpool_alloc_fail: iscsi_pool_free(&session->cmdpool, (void**)session->cmds); cmdpool_alloc_fail: - return -ENOMEM; + return NULL; } static void @@ -3325,6 +3345,8 @@ iscsi_session_destroy(struct Scsi_Host *shost) iscsi_r2tpool_free(session); iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds); iscsi_pool_free(&session->cmdpool, (void**)session->cmds); + + iscsi_transport_destroy_session(shost); } static int @@ -3347,7 +3369,7 @@ iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param, switch(param) { case ISCSI_PARAM_MAX_RECV_DLENGTH: { char *saveptr = conn->data; - int flags = GFP_KERNEL; + gfp_t flags = GFP_KERNEL; if (conn->data_size >= value) { conn->max_recv_dlength = value; @@ -3571,9 +3593,9 @@ iscsi_conn_send_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, char *data, struct iscsi_conn *conn = iscsi_ptr(connh); int rc; - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); rc = iscsi_conn_send_generic(conn, hdr, data, data_size); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); return rc; } diff --git a/kernel/iscsi_tcp.h b/kernel/iscsi_tcp.h index 80c865e..f95e61b 100644 --- a/kernel/iscsi_tcp.h +++ b/kernel/iscsi_tcp.h @@ -158,7 +158,7 @@ struct iscsi_conn { struct kfifo *mgmtqueue; /* mgmt (control) xmit queue */ struct kfifo *xmitqueue; /* data-path cmd queue */ struct work_struct xmitwork; /* per-conn. xmit workqueue */ - struct semaphore xmitsema; /* serializes connection xmit, + struct mutex xmitmutex; /* serializes connection xmit, * access to kfifos: * * xmitqueue, writequeue, * * immqueue, mgmtqueue */ diff --git a/kernel/scsi_transport_iscsi.h b/kernel/scsi_transport_iscsi.h index b0c1e71..e599f77 100644 --- a/kernel/scsi_transport_iscsi.h +++ b/kernel/scsi_transport_iscsi.h @@ -23,13 +23,13 @@ #ifndef SCSI_TRANSPORT_ISCSI_H #define SCSI_TRANSPORT_ISCSI_H -#include <linux/mempool.h> #include <linux/device.h> #include <iscsi_if.h> struct scsi_transport_template; struct Scsi_Host; struct mempool_zone; +struct iscsi_cls_conn; /** * struct iscsi_transport - iSCSI Transport template @@ -63,16 +63,16 @@ struct iscsi_transport { int max_lun; unsigned int max_conn; unsigned int max_cmd_len; - int (*create_session) (struct Scsi_Host *shost, - uint32_t initial_cmdsn); + struct Scsi_Host *(*create_session) (struct scsi_transport_template *t, + uint32_t initial_cmdsn); void (*destroy_session) (struct Scsi_Host *shost); - int (*create_conn) (struct Scsi_Host *shost, void *conndata, - uint32_t cid); + struct iscsi_cls_conn *(*create_conn) (struct Scsi_Host *shost, + uint32_t cid); int (*bind_conn) (iscsi_sessionh_t session, iscsi_connh_t conn, uint32_t transport_fd, int is_leading); int (*start_conn) (iscsi_connh_t conn); void (*stop_conn) (iscsi_connh_t conn, int flag); - void (*destroy_conn) (void *conndata); + void (*destroy_conn) (struct iscsi_cls_conn *conn); int (*set_param) (iscsi_connh_t conn, enum iscsi_param param, uint32_t value); int (*get_conn_param) (void *conndata, enum iscsi_param param, @@ -125,16 +125,21 @@ struct iscsi_cls_session { dev_to_shost(_session->dev.parent) /* - * session and connection calls + * session and connection functions that can be used by HW iSCSI LLDs */ extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, - struct iscsi_transport *t, uint32_t isid, - uint32_t initial_cmdsn); + struct iscsi_transport *t); extern int iscsi_destroy_session(struct iscsi_cls_session *session); -extern int iscsi_is_session_dev(const struct device *dev); extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, uint32_t cid); extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); -extern int iscsi_is_conn_dev(const struct device *dev); + +/* + * session functions used by software iscsi + */ +extern struct Scsi_Host * +iscsi_transport_create_session(struct scsi_transport_template *scsit, + struct iscsi_transport *transport); +extern int iscsi_transport_destroy_session(struct Scsi_Host *shost); #endif |