[stgt] [PATCH RFC 3/3] - new iser code (after pthreads revert)

Alexander Nezhinsky alexandern at Voltaire.COM
Thu Jul 22 13:16:18 CEST 2010


Signed-off-by: Alexander Nezhinsky <alexandern at voltaire.com>
---
 usr/Makefile          |    2 +-
 usr/iscsi/iscsi_tcp.c |    4 ++
 usr/iscsi/iscsid.c    |   86 ++++++++++++++++++++-----------------
 usr/iscsi/iscsid.h    |   74 ++++++++++++++++++-------------
 usr/iscsi/isns.c      |   24 ++--------
 usr/iscsi/session.c   |    5 +--
 usr/iscsi/target.c    |  114 ++-----------------------------------------------
 usr/list.h            |    3 +
 8 files changed, 108 insertions(+), 204 deletions(-)

diff --git a/usr/Makefile b/usr/Makefile
index 262300d..e2a6e0b 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -19,7 +19,7 @@ TGTD_OBJS += bs_rdwr.o bs_aio.o
 
 ifneq ($(ISCSI_RDMA),)
 CFLAGS += -DISCSI_RDMA
-TGTD_OBJS += iscsi/iscsi_rdma.o
+TGTD_OBJS += iscsi/iser_ib.o iscsi/iser_text.o
 LIBS += -libverbs -lrdmacm
 endif
 endif
diff --git a/usr/iscsi/iscsi_tcp.c b/usr/iscsi/iscsi_tcp.c
index 8fc145f..e41e019 100644
--- a/usr/iscsi/iscsi_tcp.c
+++ b/usr/iscsi/iscsi_tcp.c
@@ -134,6 +134,10 @@ static void accept_connection(int afd, int events, void *data)
 	tcp_conn->fd = fd;
 	conn->tp = &iscsi_tcp;
 
+	conn->op.conn_show = iscsi_tcp.ep_show;
+	conn->op.conn_getsockname = iscsi_tcp.ep_getsockname;
+	conn->op.conn_getpeername = iscsi_tcp.ep_getpeername;
+
 	conn_read_pdu(conn);
 	set_non_blocking(fd);
 
diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
index 3ca98ab..bb103e6 100644
--- a/usr/iscsi/iscsid.c
+++ b/usr/iscsi/iscsid.c
@@ -38,7 +38,6 @@
 #include "util.h"
 #include "driver.h"
 #include "scsi.h"
-#include "tgtadm.h"
 #include "crc32c.h"
 
 #define MAX_QUEUE_CMD	128
@@ -97,14 +96,17 @@ static struct iscsi_key login_keys[] = {
 	{NULL, 0, 0, 0, NULL},
 };
 
-char *text_key_find(struct iscsi_connection *conn, char *searchKey)
+extern char *text_key_find(struct iscsi_connection *conn, char *searchKey)
 {
-	char *data, *key, *value;
-	int keylen, datasize;
+	return text_key_find_in_buf(conn->req.data, conn->req.datasize, searchKey);
+}
+
+char *text_key_find_in_buf(char *data, unsigned int datasize, char *searchKey)
+{
+	char *key, *value;
+	int keylen;
 
 	keylen = strlen(searchKey);
-	data = conn->req.data;
-	datasize = conn->req.datasize;
 
 	while (1) {
 		for (key = data; datasize > 0 && *data != '='; data++, datasize--)
@@ -159,7 +161,6 @@ void text_key_add(struct iscsi_connection *conn, char *key, char *value)
 	int keylen = strlen(key);
 	int valuelen = strlen(value);
 	int len = keylen + valuelen + 2;
-	char *buffer;
 	int max_len;
 
 	if (conn->state == STATE_FULL)
@@ -170,13 +171,12 @@ void text_key_add(struct iscsi_connection *conn, char *key, char *value)
 	if (!conn->rsp.datasize)
 		conn->rsp.data = conn->rsp_buffer;
 
-	buffer = conn->rsp_buffer;
-
 	if (conn->rsp.datasize + len > max_len &&
 	    (conn->req.bhs.opcode & ISCSI_OPCODE_MASK) != ISCSI_OP_TEXT)
 		goto drop;
 
 	if (conn->rsp.datasize + len > conn->rsp_buffer_size) {
+		char *buffer = conn->rsp_buffer;
 		buffer = realloc(buffer, conn->rsp.datasize + len);
 		if (buffer) {
 			conn->rsp_buffer = buffer;
@@ -186,17 +186,27 @@ void text_key_add(struct iscsi_connection *conn, char *key, char *value)
 			goto drop;
 	}
 
-	buffer += conn->rsp.datasize;
-	conn->rsp.datasize += len;
+	text_key_add_to_buf(conn->rsp_buffer, &conn->rsp.datasize, key, value);
+	return;
+
+drop:
+	log_warning("Dropping key (%s=%s)", key, value);
+	return;
+}
+
+void text_key_add_to_buf(char *data, unsigned int *datalen, char *key, char *value)
+{
+	int keylen = strlen(key);
+	int valuelen = strlen(value);
+	int len = keylen + valuelen + 2;
+	char *buffer = data + *datalen;
 
 	strcpy(buffer, key);
 	buffer += keylen;
 	*buffer++ = '=';
 	strcpy(buffer, value);
-	return;
-drop:
-	log_warning("Dropping key (%s=%s)", key, value);
-	return;
+
+	*datalen += len;
 }
 
 static void text_key_add_reject(struct iscsi_connection *conn, char *key)
@@ -468,9 +478,6 @@ static void login_start(struct iscsi_connection *conn)
 		}
 	}
 
-	if (conn->session_type == SESSION_DISCOVERY)
-		conn->tid = GLOBAL_TID;
-
 	if (conn->session_type == SESSION_NORMAL) {
 		if (!target_name) {
 			rsp->status_class = ISCSI_STATUS_CLS_INITIATOR_ERR;
@@ -486,19 +493,15 @@ static void login_start(struct iscsi_connection *conn)
 			conn->state = STATE_EXIT;
 			return;
 		}
-
-		conn->tid = target->tid;
-
-		if (target_redirected(target, conn)) {
-			char buf[NI_MAXHOST + NI_MAXSERV + 4];
-			snprintf(buf, sizeof(buf), "%s:%s", target->redirect_info.addr,
-				 target->redirect_info.port);
-			text_key_add(conn, "TargetAddress", buf);
-			rsp->status_class = ISCSI_STATUS_CLS_REDIRECT;
-			rsp->status_detail = target->redirect_info.reason;
+		if (target->rdma) {
+			eprintf("Target %s is RDMA, but conn cid:%d from %s is TCP\n",
+				target_name, conn->cid, conn->initiator);
+			rsp->status_class = ISCSI_STATUS_CLS_INITIATOR_ERR;
+			rsp->status_detail = ISCSI_LOGIN_STATUS_TGT_NOT_FOUND;
 			conn->state = STATE_EXIT;
 			return;
 		}
+		conn->tid = target->tid;
 
 		if (tgt_get_target_state(target->tid) != SCSI_TARGET_READY) {
 			rsp->status_class = ISCSI_STATUS_CLS_TARGET_ERR;
@@ -599,7 +602,9 @@ static int cmnd_exec_auth(struct iscsi_connection *conn)
 
         switch (conn->auth_method) {
         case AUTH_CHAP:
-                res = cmnd_exec_auth_chap(conn);
+		res = cmnd_exec_auth_chap(conn);
+		eprintf("CHAP currently unsupported\n");
+		res = -3;
                 break;
         case AUTH_NONE:
                 res = 0;
@@ -808,6 +813,7 @@ static void text_scan_text(struct iscsi_connection *conn)
 	data = conn->req.data;
 	datasize = conn->req.datasize;
 
+	dprintf("entry\n");
 	while ((key = next_key(&data, &datasize, &value))) {
 		if (!strcmp(key, "SendTargets")) {
 			struct sockaddr_storage ss;
@@ -822,7 +828,8 @@ static void text_scan_text(struct iscsi_connection *conn)
 			blen = sizeof(buf);
 
 			slen = sizeof(ss);
-			ret = conn->tp->ep_getsockname(conn,
+
+			ret = conn->op.conn_getsockname(conn,
 						       (struct sockaddr *)&ss,
 						       &slen);
 			if (ret) {
@@ -853,6 +860,7 @@ static void text_scan_text(struct iscsi_connection *conn)
 		} else
 			text_key_add(conn, key, "NotUnderstood");
 	}
+	dprintf("exit\n");
 }
 
 static void cmnd_exec_text(struct iscsi_connection *conn)
@@ -865,6 +873,8 @@ static void cmnd_exec_text(struct iscsi_connection *conn)
 
 	rsp->opcode = ISCSI_OP_TEXT_RSP;
 	rsp->itt = req->itt;
+	/* rsp->ttt = rsp->ttt; */
+	rsp->ttt = 0xffffffff;
 	conn->exp_cmd_sn = be32_to_cpu(req->cmdsn);
 	if (!(req->opcode & ISCSI_OP_IMMEDIATE))
 		conn->exp_cmd_sn++;
@@ -872,6 +882,7 @@ static void cmnd_exec_text(struct iscsi_connection *conn)
 	if (be32_to_cpu(req->ttt) == ISCSI_RESERVED_TAG) {
 		conn->text_datasize = 0;
 
+		dprintf("Text request: %d\n", conn->state);
 		text_scan_text(conn);
 
 		conn->text_rsp_buffer = conn->rsp_buffer;
@@ -2259,7 +2270,7 @@ out:
 	return ret;
 }
 
-static int iscsi_transportid(int tid, uint64_t itn_id, char *buf, int size)
+int iscsi_transportid(int tid, uint64_t itn_id, char *buf, int size)
 {
 	struct iscsi_session *session;
 	char *p;
@@ -2333,14 +2344,11 @@ static int iscsi_param_parser(char *p)
 			else
 				len = strlen(addr);
 
-			if (iscsi_portal_addr) {
-				free(iscsi_portal_addr);
-				iscsi_portal_addr = NULL;
-			}
-			if (len) {
-				iscsi_portal_addr = zalloc(len + 1);
-				memcpy(iscsi_portal_addr, addr, len);
-			}
+			iscsi_portal_addr = zalloc(len + 1);
+			memcpy(iscsi_portal_addr, addr, len);
+
+			eprintf("Listen port:%d Portal addr:%s\n",
+				iscsi_listen_port, iscsi_portal_addr);
 		}
 
 		p += strcspn(p, ",");
diff --git a/usr/iscsi/iscsid.h b/usr/iscsi/iscsid.h
index 35bb068..9a386e4 100644
--- a/usr/iscsi/iscsid.h
+++ b/usr/iscsi/iscsid.h
@@ -21,7 +21,6 @@
 
 #include <stdint.h>
 #include <inttypes.h>
-#include <netdb.h>
 
 #include "transport.h"
 #include "list.h"
@@ -132,16 +131,31 @@ struct iscsi_task {
 	unsigned long extdata[0];
 };
 
+struct iscsi_conn_ops {
+
+	int (*conn_show)(struct iscsi_connection *conn, char *buf, int rest);
+        int (*conn_getsockname)(struct iscsi_connection *conn,
+                              struct sockaddr *sa, socklen_t *len);
+        int (*conn_getpeername)(struct iscsi_connection *conn,
+                              struct sockaddr *sa, socklen_t *len);
+};
+
 struct iscsi_connection {
 	int state;
-
 	/* should be a new state */
 	int closed;
 
-	int rx_iostate;
-	int tx_iostate;
 	int refcount;
 
+	struct iscsi_conn_ops op;
+
+	uint32_t stat_sn;
+	uint32_t exp_stat_sn;
+
+	uint32_t cmd_sn;
+	uint32_t exp_cmd_sn;
+	uint32_t max_cmd_sn;
+
 	struct list_head clist;
 	struct iscsi_session *session;
 
@@ -155,12 +169,19 @@ struct iscsi_connection {
 	int session_type;
 	int auth_method;
 
-	uint32_t stat_sn;
-	uint32_t exp_stat_sn;
+	int auth_state;
+	union {
+		struct {
+			int digest_alg;
+			int id;
+			int challenge_size;
+			unsigned char *challenge;
+		} chap;
+	} auth;
 
-	uint32_t cmd_sn;
-	uint32_t exp_cmd_sn;
-	uint32_t max_cmd_sn;
+	/* From here iscsi_tcp specific */
+	int rx_iostate;
+	int tx_iostate;
 
 	struct iscsi_pdu req;
 	void *req_buffer;
@@ -186,16 +207,6 @@ struct iscsi_connection {
 	unsigned char rx_digest[4];
 	unsigned char tx_digest[4];
 
-	int auth_state;
-	union {
-		struct {
-			int digest_alg;
-			int id;
-			int challenge_size;
-			unsigned char *challenge;
-		} chap;
-	} auth;
-
 	struct iscsi_transport *tp;
 };
 
@@ -212,6 +223,9 @@ struct iscsi_connection {
 #define STATE_CLOSE		10
 #define STATE_EXIT		11
 #define STATE_SCSI		12
+#define STATE_INIT		13
+#define STATE_START		14
+#define STATE_READY		15
 
 #define AUTH_STATE_START	0
 #define AUTH_STATE_CHALLENGE	1
@@ -244,13 +258,9 @@ struct iscsi_target {
 	int max_nr_sessions;
 	int nr_sessions;
 
-	struct redirect_info {
-		char addr[NI_MAXHOST + 1];
-		char port[NI_MAXSERV + 1];
-		uint8_t reason;
-	} redirect_info;
-
 	struct list_head isns_list;
+
+	int rdma;
 };
 
 enum task_flags {
@@ -273,7 +283,7 @@ extern int lld_index;
 extern struct list_head iscsi_targets_list;
 
 /* chap.c */
-extern int cmnd_exec_auth_chap(struct iscsi_connection *conn);
+extern int cmnd_exec_auth_chap(struct iscsi_connection *conn_h);
 
 /* conn.c */
 extern int conn_init(struct iscsi_connection *conn);
@@ -287,6 +297,8 @@ extern void conn_add_to_session(struct iscsi_connection *conn, struct iscsi_sess
 extern int conn_close_force(uint32_t tid, uint64_t sid, uint32_t cid);
 
 /* iscsid.c */
+extern char *text_key_find_in_buf(char *data,unsigned int datasize, char *searchKey);
+extern void text_key_add_to_buf(char *data, unsigned int *datalen, char *key, char *value);
 extern char *text_key_find(struct iscsi_connection *conn, char *searchKey);
 extern void text_key_add(struct iscsi_connection *conn, char *key, char *value);
 extern void conn_read_pdu(struct iscsi_connection *conn);
@@ -306,17 +318,17 @@ extern void session_get(struct iscsi_session *session);
 extern void session_put(struct iscsi_session *session);
 
 /* target.c */
-struct iscsi_target * target_find_by_name(const char *name);
-struct iscsi_target * target_find_by_id(int tid);
+extern struct iscsi_target * target_find_by_name(const char *name);
+extern struct iscsi_target * target_find_by_id(int tid);
 extern void target_list_build(struct iscsi_connection *, char *, char *);
 extern int ip_acl(int tid, struct iscsi_connection *conn);
 extern int iscsi_target_create(struct target *);
 extern void iscsi_target_destroy(int);
 extern int iscsi_target_show(int mode, int tid, uint64_t sid, uint32_t cid,
 			     uint64_t lun, char *buf, int rest);
-int iscsi_target_update(int mode, int op, int tid, uint64_t sid, uint64_t lun,
-			uint32_t cid, char *name);
-int target_redirected(struct iscsi_target *target, struct iscsi_connection *conn);
+extern int iscsi_target_update(int mode, int op, int tid, uint64_t sid, uint64_t lun,
+			       uint32_t cid, char *name);
+extern int iscsi_transportid(int tid, uint64_t itn_id, char *buf, int size);
 
 /* param.c */
 int param_index_by_name(char *name, struct iscsi_key *keys);
diff --git a/usr/iscsi/isns.c b/usr/iscsi/isns.c
index cdc2ece..3bfc1fc 100644
--- a/usr/iscsi/isns.c
+++ b/usr/iscsi/isns.c
@@ -316,7 +316,7 @@ static int isns_attr_query(char *name)
 	tlv = (struct isns_tlv *) hdr->pdu;
 
 	if (name)
-		snprintf(mgmt->name, sizeof(mgmt->name), "%s", name);
+		snprintf(mgmt->name, sizeof(mgmt->name), name);
 	else {
 		mgmt->name[0] = '\0';
 		target = list_first_entry(&iscsi_targets_list,
@@ -460,7 +460,6 @@ static void free_all_acl(struct iscsi_target *target)
 	while (!list_empty(&target->isns_list)) {
 		ini = list_first_entry(&target->isns_list, typeof(*ini), ilist);
 		list_del(&ini->ilist);
-		free(ini);
 	}
 }
 
@@ -605,23 +604,17 @@ static char *print_scn_pdu(struct isns_hdr *hdr)
 	struct isns_tlv *tlv = (struct isns_tlv *) hdr->pdu;
 	uint16_t function, length, flags, transaction, sequence;
 	char *name = NULL;
-	static char iscsi_name[224];
 
 	get_hdr_param(hdr, function, length, flags, transaction, sequence);
 
 	while (length) {
 		uint32_t vlen = ntohl(tlv->length);
 
-		if (vlen + sizeof(*tlv) > length)
-			vlen = length - sizeof(*tlv);
-
 		switch (ntohl(tlv->tag)) {
 		case ISNS_ATTR_ISCSI_NAME:
 			eprintf("scn name: %u, %s\n", vlen, (char *) tlv->value);
-			if (!name) {
-				snprintf(iscsi_name, sizeof(iscsi_name), (char *)tlv->value);
-				name = iscsi_name;
-			}
+			if (!name)
+				name = (char *) tlv->value;
 			break;
 		case ISNS_ATTR_TIMESTAMP:
 /* 			log_error("%u : %u : %" PRIx64, ntohl(tlv->tag), vlen, */
@@ -682,17 +675,11 @@ found:
 
 	/* skip status */
 	tlv = (struct isns_tlv *) ((char *) hdr->pdu + 4);
-
-	if (length < 4)
-		goto free_qry_mgmt;
 	length -= 4;
 
 	while (length) {
 		uint32_t vlen = ntohl(tlv->length);
 
-		if (vlen + sizeof(*tlv) > length)
-			vlen = length - sizeof(*tlv);
-
 		switch (ntohl(tlv->tag)) {
 		case ISNS_ATTR_ISCSI_NAME:
 			name = (char *) tlv->value;
@@ -703,7 +690,7 @@ found:
 				ini = malloc(sizeof(*ini));
 				if (!ini)
 					goto free_qry_mgmt;
-				snprintf(ini->name, sizeof(ini->name), "%s", name);
+				snprintf(ini->name, sizeof(ini->name), name);
 				list_add(&ini->ilist, &target->isns_list);
 			} else
 				name = NULL;
@@ -925,7 +912,7 @@ int isns_init(void)
 		eprintf("getaddrinfo error %s\n", isns_addr);
 		return -1;
 	}
-	memcpy(&ss, res->ai_addr, sizeof(*res->ai_addr));
+	memcpy(&ss, res->ai_addr, sizeof(ss));
 	freeaddrinfo(res);
 
 	rxbuf = calloc(2, BUFSIZE);
@@ -1040,7 +1027,6 @@ int isns_update(char *params)
 		case Opt_port:
 			if (match_int(&args[0], &isns_port))
 				ret = TGTADM_INVALID_REQUEST;
-			break;
 		case Opt_ac:
 			match_strncpy(tmp, &args[0], sizeof(tmp));
 			use_isns_ac = !strcmp(tmp, "On");
diff --git a/usr/iscsi/session.c b/usr/iscsi/session.c
index 46864c7..e377c6e 100644
--- a/usr/iscsi/session.c
+++ b/usr/iscsi/session.c
@@ -70,7 +70,6 @@ int session_create(struct iscsi_connection *conn)
 	struct iscsi_target *target;
 	char addr[128];
 
-
 	target = target_find_by_id(conn->tid);
 	if (!target)
 		return -EINVAL;
@@ -103,7 +102,7 @@ int session_create(struct iscsi_connection *conn)
 	}
 
 	memset(addr, 0, sizeof(addr));
-	conn->tp->ep_show(conn, addr, sizeof(addr));
+	conn->op.conn_show(conn, addr, sizeof(addr));
 
 	snprintf(session->info, 1024, _TAB3 "Initiator: %s\n"
 		 _TAB3 "Connection: %u\n"
@@ -128,8 +127,6 @@ int session_create(struct iscsi_connection *conn)
 	memcpy(session->isid, conn->isid, sizeof(session->isid));
 	session->tsih = last_tsih = tsih;
 
-	session->rdma = conn->tp->rdma;
-
 	conn_add_to_session(conn, session);
 
 	dprintf("session_create: %#" PRIx64 "\n", sid64(conn->isid, session->tsih));
diff --git a/usr/iscsi/target.c b/usr/iscsi/target.c
index f3b1edd..841c912 100644
--- a/usr/iscsi/target.c
+++ b/usr/iscsi/target.c
@@ -123,7 +123,7 @@ static int ip_match(struct iscsi_connection *conn, char *address)
 	int err;
 
 	len = sizeof(from);
-	err = conn->tp->ep_getpeername(conn, (struct sockaddr *) &from, &len);
+	err = conn->op.conn_getpeername(conn, (struct sockaddr *) &from, &len);
 	if (err < 0)
 		return -EPERM;
 
@@ -189,57 +189,6 @@ int ip_acl(int tid, struct iscsi_connection *conn)
 	return -EPERM;
 }
 
-int target_redirected(struct iscsi_target *target, struct iscsi_connection *conn)
-{
-	struct sockaddr_storage from;
-	struct addrinfo hints, *res;
-	socklen_t len;
-	int ret;
-	char *p, *q, *str;
-
-	if (!strlen(target->redirect_info.addr))
-		return 0;
-
-	if (target->redirect_info.reason != ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP &&
-	    target->redirect_info.reason != ISCSI_LOGIN_STATUS_TGT_MOVED_PERM)
-		return 0;
-
-	len = sizeof(from);
-	ret = conn->tp->ep_getpeername(conn, (struct sockaddr *)&from, &len);
-	if (ret < 0)
-		return 0;
-
-	p = strdup(target->redirect_info.addr);
-	if (!p)
-		return 0;
-	str = p;
-
-	if (*p == '[') {
-		p++;
-		if (!(q = strchr(p, ']'))) {
-			free(str);
-			return 0;
-		}
-		*(q++) = '\0';
-	}
-
-	memset(&hints, 0, sizeof(hints));
-	hints.ai_socktype = SOCK_STREAM;
-	hints.ai_flags = AI_NUMERICHOST;
-
-	ret = getaddrinfo(p, NULL, &hints, &res);
-	if (ret < 0) {
-		free(str);
-		return 0;
-	}
-
-	ret = address_match(res->ai_addr, (struct sockaddr *)&from);
-	freeaddrinfo(res);
-	free(str);
-
-	return !ret;
-}
-
 void target_list_build(struct iscsi_connection *conn, char *addr, char *name)
 {
 	struct iscsi_target *target;
@@ -256,6 +205,8 @@ void target_list_build(struct iscsi_connection *conn, char *addr, char *name)
 
 		text_key_add(conn, "TargetName", tgt_targetname(target->tid));
 		text_key_add(conn, "TargetAddress", addr);
+		dprintf("added TargetName:%s TargetAddress:%s rdma:%d\n",
+			tgt_targetname(target->tid), addr, target->rdma);
 	}
 }
 
@@ -398,29 +349,6 @@ int iscsi_target_update(int mode, int op, int tid, uint64_t sid, uint64_t lun,
 
 		dprintf("%s:%s\n", name, str);
 
-		if (!strncmp(name, "RedirectAddress", 15)) {
-			snprintf(target->redirect_info.addr,
-				 sizeof(target->redirect_info.addr), "%s", str);
-			err = TGTADM_SUCCESS;
-			break;
-		} else if (!strncmp(name, "RedirectPort", 12)) {
-			snprintf(target->redirect_info.port,
-				 sizeof(target->redirect_info.port), "%s", str);
-			err = TGTADM_SUCCESS;
-			break;
-		} else if (!strncmp(name, "RedirectReason", 14)) {
-			if (!strncmp(str, "Temporary", 9)) {
-				target->redirect_info.reason =
-					ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP;
-				err = TGTADM_SUCCESS;
-			} else if (!strncmp(str, "Permanent", 9)) {
-				target->redirect_info.reason =
-					ISCSI_LOGIN_STATUS_TGT_MOVED_PERM;
-				err = TGTADM_SUCCESS;
-			} else
-				break;
-		}
-
 		idx = param_index_by_name(name, session_keys);
 		if (idx >= 0) {
 			err = iscsi_session_param_update(target, idx, str);
@@ -468,37 +396,6 @@ static int iscsi_target_show_session(struct iscsi_target* target, uint64_t sid,
 	return total;
 }
 
-#define __buffer_check(buf, total, len, rest)	\
-({						\
-	buf += len;				\
-	total += len;				\
-	rest -= len;				\
-	if (!rest)				\
-		return total;			\
-})
-
-static int show_redirect_info(struct iscsi_target* target, char *buf, int rest)
-{
-	int len, total = 0;
-
-	len = snprintf(buf, rest, "RedirectAddress=%s\n", target->redirect_info.addr);
-	__buffer_check(buf, total, len, rest);
-	len = snprintf(buf, rest, "RedirectPort=%s\n", target->redirect_info.port);
-	__buffer_check(buf, total, len, rest);
-	if (target->redirect_info.reason == ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP) {
-		len = snprintf(buf, rest, "RedirectReason=Temporary\n");
-		__buffer_check(buf, total, len, rest);
-	} else if (target->redirect_info.reason == ISCSI_LOGIN_STATUS_TGT_MOVED_PERM) {
-		len = snprintf(buf, rest, "RedirectReason=Permanent\n");
-		__buffer_check(buf, total, len, rest);
-	} else {
-		len = snprintf(buf, rest, "RedirectReason=Unknown\n");
-		__buffer_check(buf, total, len, rest);
-	}
-
-	return total;
-}
-
 int iscsi_target_show(int mode, int tid, uint64_t sid, uint32_t cid, uint64_t lun,
 		      char *buf, int rest)
 {
@@ -516,10 +413,7 @@ int iscsi_target_show(int mode, int tid, uint64_t sid, uint32_t cid, uint64_t lu
 		total = isns_show(buf, rest);
 		break;
 	case MODE_TARGET:
-		if (strlen(target->redirect_info.addr))
-			len = show_redirect_info(target, buf, rest);
-		else
-			len = show_iscsi_param(buf, target->session_param, rest);
+		len = show_iscsi_param(buf, target->session_param, rest);
 		total += len;
 		break;
 	case MODE_SESSION:
diff --git a/usr/list.h b/usr/list.h
index f66ff36..2f80a56 100644
--- a/usr/list.h
+++ b/usr/list.h
@@ -43,6 +43,9 @@ static inline int list_empty(const struct list_head *head)
 #define list_for_each(pos, head) \
 	for (pos = (head)->next; pos != (head); pos = pos->next)
 
+#define list_for_each_prev(pos, head) \
+	for (pos = (head)->prev; pos != (head); pos = pos->prev)
+
 #define list_for_each_entry(pos, head, member)				\
 	for (pos = list_entry((head)->next, typeof(*pos), member);	\
 	     &pos->member != (head);				 	\
--
1.6.5
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list