Module Name:    src
Committed By:   sborrill
Date:           Thu Oct  6 13:05:29 UTC 2011

Modified Files:
        src/external/bsd/iscsi/dist/include: initiator.h
        src/external/bsd/iscsi/dist/src/initiator: iscsi-initiator.c
        src/external/bsd/iscsi/dist/src/lib: initiator.c

Log Message:
Provide function in libiscsi to return the compile-time limit on number of
targets. Use this function in the initiator, to ensure that the same limit
is used throughout (i.e. stop you attempting to compile the initiator with a
different limit to the library - the initiator uses the library for most of
its functionality).

If truncating the number of targets in the initiator, truncate it to the
correct amount, not half of what it should be.

Obey RFC3720 when determining targets. SendTargets=All MUST be supported
on a discovery session, and MUST NOT be supported on an operational session.
Previously, SendTargets=All was used both in the initial discovery session
and the later session. (from Daisuke Aoyama - author of istgt).


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/external/bsd/iscsi/dist/include/initiator.h
cvs rdiff -u -r1.8 -r1.9 \
    src/external/bsd/iscsi/dist/src/initiator/iscsi-initiator.c
cvs rdiff -u -r1.5 -r1.6 src/external/bsd/iscsi/dist/src/lib/initiator.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/iscsi/dist/include/initiator.h
diff -u src/external/bsd/iscsi/dist/include/initiator.h:1.3 src/external/bsd/iscsi/dist/include/initiator.h:1.4
--- src/external/bsd/iscsi/dist/include/initiator.h:1.3	Tue Jun 30 02:44:52 2009
+++ src/external/bsd/iscsi/dist/include/initiator.h	Thu Oct  6 13:05:28 2011
@@ -45,7 +45,9 @@
 #include "parameters.h"
 #include "defs.h"
 
+#ifndef CONFIG_INITIATOR_NUM_TARGETS
 #define CONFIG_INITIATOR_NUM_TARGETS 16
+#endif
 
 /***********
  * Private *
@@ -113,6 +115,8 @@ typedef struct initiator_cmd_t {
 	char            targetname[TARGET_HOSTNAME_SIZE];
 } initiator_cmd_t;
 
+DEFINE_ARRAY(strv_t, char *);
+
 typedef struct initiator_target_t {
 	char            name[TARGET_HOSTNAME_SIZE];
 	char            ip[TARGET_IP_SIZE];
@@ -121,10 +125,9 @@ typedef struct initiator_target_t {
 	initiator_session_t *sess;
 	int             has_session;
 	char		iqnwanted[TARGET_NAME_SIZE];
+	strv_t		all_targets;
 } initiator_target_t;
 
-DEFINE_ARRAY(strv_t, char *);
-
 
 /**********
  * Public *
@@ -140,5 +143,6 @@ int		ii_initiator_init(const char *, int
 
 int		iscsi_initiator_get_targets(int, strv_t *);
 int		initiator_set_target_name(int, char *);
+int		iscsi_initiator_get_max_targets(void);
 
 #endif				/* _INITIATOR_H_ */

Index: src/external/bsd/iscsi/dist/src/initiator/iscsi-initiator.c
diff -u src/external/bsd/iscsi/dist/src/initiator/iscsi-initiator.c:1.8 src/external/bsd/iscsi/dist/src/initiator/iscsi-initiator.c:1.9
--- src/external/bsd/iscsi/dist/src/initiator/iscsi-initiator.c:1.8	Wed Aug 17 09:24:23 2011
+++ src/external/bsd/iscsi/dist/src/initiator/iscsi-initiator.c	Thu Oct  6 13:05:28 2011
@@ -548,6 +548,7 @@ main(int argc, char **argv)
 	int			discover;
 	int			cc;
 	int			i;
+	uint32_t		max_targets;
 
 	(void) memset(&tinfo, 0x0, sizeof(tinfo));
 	iscsi_initiator_set_defaults(&ini);
@@ -557,6 +558,8 @@ main(int argc, char **argv)
 	(void) stat("/etc/hosts", &sti.st);
 	devtype = 'f';
 	iscsi_initiator_setvar(&ini, "address family", "4");
+	max_targets = iscsi_initiator_get_max_targets();
+	
 	while ((i = getopt(argc, argv, "46a:bcd:Dfh:p:t:u:v:V")) != -1) {
 		switch(i) {
 		case '4':
@@ -663,16 +666,19 @@ main(int argc, char **argv)
                 exit(EXIT_SUCCESS);
         }
 
-	if (all_targets.c/2 > CONFIG_INITIATOR_NUM_TARGETS) {
+	if (all_targets.c/2 > max_targets) {
 		(void) fprintf(stderr,
 			"CONFIG_INITIATOR_NUM_TARGETS in initiator.h "
 			"is too small.  %d targets available, "
 			"only %d configurable.\n",
-			all_targets.c/2, CONFIG_INITIATOR_NUM_TARGETS);
+			all_targets.c/2, max_targets);
+		(void) fprintf(stderr,
+			"To increase this value, libiscsi will have be "
+			"recompiled.\n");
 		(void) fprintf(stderr,
 			"Truncating number of targets to %d.\n",
-			CONFIG_INITIATOR_NUM_TARGETS);
-		all_targets.c = CONFIG_INITIATOR_NUM_TARGETS;
+			max_targets);
+		all_targets.c = 2 * max_targets;
 	}
 
 	sti.st.st_ino = 0x15c51;

Index: src/external/bsd/iscsi/dist/src/lib/initiator.c
diff -u src/external/bsd/iscsi/dist/src/lib/initiator.c:1.5 src/external/bsd/iscsi/dist/src/lib/initiator.c:1.6
--- src/external/bsd/iscsi/dist/src/lib/initiator.c:1.5	Tue Feb 22 13:10:55 2011
+++ src/external/bsd/iscsi/dist/src/lib/initiator.c	Thu Oct  6 13:05:29 2011
@@ -155,7 +155,6 @@ static int      session_destroy_i(initia
 static int      wait_callback_i(void *);
 static int      discovery_phase(int, strv_t *);
 
-
 /*
  * Private Functions
  */
@@ -623,6 +622,13 @@ initiator_set_target_name(int target, ch
 
 
 int
+iscsi_initiator_get_max_targets(void)
+{
+	return CONFIG_INITIATOR_NUM_TARGETS;
+}
+
+#if 0
+int
 iscsi_initiator_get_targets(int target, strv_t *svp)
 {
         initiator_session_t	*sess = g_target[target].sess;
@@ -675,6 +681,27 @@ iscsi_initiator_get_targets(int target, 
 
 	return 1;
 }
+#else
+/* SendTargets=All must be sent in discovery session. */
+int
+iscsi_initiator_get_targets(int target, strv_t *svp)
+{
+	initiator_session_t	*sess = g_target[target].sess;
+	strv_t *tp = &g_target[target].all_targets;
+	uint32_t i;
+
+	if (sess == NULL)
+		return -1;
+
+	for (i = 0; i < tp->c; i++) {
+		ALLOC(char *, svp->v, svp->size, svp->c, 10,
+			10, "igt", return -1);
+		svp->v[svp->c++] = strdup(tp->v[i]);
+	}
+
+	return 1;
+}
+#endif
 
 static int 
 discovery_phase(int target, strv_t *svp)
@@ -1209,7 +1236,6 @@ enqueue_worker_proc(void *arg)
 	iscsi_worker_t *me = (iscsi_worker_t *) arg;
 	uint64_t	target;
 	uint32_t        tag;
-	strv_t		sv;
 	int             rc;
 
 
@@ -1273,7 +1299,7 @@ initialize:
 
 			if (strlen(g_target[(int)target].TargetName) == 0) {
 				iscsi_trace(TRACE_ISCSI_DEBUG, "enqueue_worker: entering Discovery phase with target %llu\n", target);
-				rc = discovery_phase((int)target, &sv);
+				rc = discovery_phase((int)target, &g_target[(int)target].all_targets);
 				iscsi_trace(TRACE_ISCSI_DEBUG, "enqueue_worker: Discovery phase complete\n");
 
 				/* Destroy session */

Reply via email to