summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6>2006-01-17 00:01:35 +0000
committermnc <mnc@d7303112-9cec-0310-bdd2-e83a94d6c2b6>2006-01-17 00:01:35 +0000
commit50f4df4ad4ddaced989c75981cdbfdd492aa07a9 (patch)
tree871aaa573afbf3c61ab64f2a2686ae1b564832a4
parent8a36edc4464919f0bc53e96089acdf6a19495f3b (diff)
downloadopen-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.h2
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/iscsi_tcp.c82
-rw-r--r--kernel/iscsi_tcp.h2
-rw-r--r--kernel/scsi_transport_iscsi.h27
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