[iscsi-initiator-utils: 45/109] Resolves: #570664

Chris Leech cleech at fedoraproject.org
Tue Dec 10 21:23:09 UTC 2013


commit e81a583416631e20d2072109fc3a652c0b825737
Author: mchristi <mchristi at redhat.com>
Date:   Wed May 19 10:38:36 2010 +0000

    Resolves: #570664

 iscsi-initiator-utils-fix-dd-stop.patch        |  289 ++++++++++++++++++++++++
 iscsi-initiator-utils-fix-lib-sysfs-init.patch |   49 ++++
 iscsi-initiator-utils-fix-uip-init-race.patch  |  236 +++++++++++++++++++
 iscsi-initiator-utils-fw-boot.patch            |    4 +-
 iscsi-initiator-utils-log-info.patch           |  127 +++++++++++
 iscsi-initiator-utils.spec                     |   29 ++-
 iscsid.init                                    |   44 +++-
 iscsidevs.init                                 |    2 +-
 sources                                        |    2 +-
 9 files changed, 763 insertions(+), 19 deletions(-)
---
diff --git a/iscsi-initiator-utils-fix-dd-stop.patch b/iscsi-initiator-utils-fix-dd-stop.patch
new file mode 100644
index 0000000..8aaafeb
--- /dev/null
+++ b/iscsi-initiator-utils-fix-dd-stop.patch
@@ -0,0 +1,289 @@
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i.base/usr/discoveryd.c open-iscsi-2.0-872-rc1-bnx2i.work/usr/discoveryd.c
+--- open-iscsi-2.0-872-rc1-bnx2i.base/usr/discoveryd.c	2010-05-18 17:58:00.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/discoveryd.c	2010-05-19 03:09:54.000000000 -0500
+@@ -54,6 +54,7 @@
+ #define DISC_DEF_POLL_INVL	30
+ 
+ static LIST_HEAD(iscsi_targets);
++static int stop_discoveryd;
+ 
+ static LIST_HEAD(isns_initiators);
+ static LIST_HEAD(isns_refresh_list);
+@@ -66,27 +67,64 @@ static void isns_reg_refresh_by_eid_qry(
+ typedef void (do_disc_and_login_fn)(const char *def_iname, char *addr,
+ 				    int port, int poll_inval);
+ 
+-static int logout_stale_session(void *data, struct list_head *list,
+-				struct session_info *info)
++static int logout_session(void *data, struct list_head *list,
++			  struct session_info *info)
+ {
+-	struct list_head *stale_rec_list = data;
++	struct list_head *rec_list = data;
+ 	struct node_rec *rec;
+ 
+-	list_for_each_entry(rec, stale_rec_list, list) {
++	list_for_each_entry(rec, rec_list, list) {
+ 		if (iscsi_match_session(rec, info))
+ 			return iscsi_logout_portal(info, list);
+ 	}
+ 	return -1;
+ }
+ 
+-static void free_curr_targets(void)
++static void discoveryd_stop(void)
+ {
+ 	struct node_rec *rec, *tmp_rec;
++	int nr_found = 0;
+ 
++	if (list_empty(&iscsi_targets))
++		goto done;
++
++	/*
++	 * User requested to just login and exit.
++	 */
++	if (!stop_discoveryd)
++		goto done;
++
++	iscsi_logout_portals(&iscsi_targets, &nr_found, 1, logout_session);
+ 	list_for_each_entry_safe(rec, tmp_rec, &iscsi_targets, list) {
+ 		list_del(&rec->list);
+ 		free(rec);
+ 	}
++
++done:
++	exit(0);
++}
++
++static void catch_signal(int signo)
++{
++	log_debug(1, "%d caught signal -%d...", signo, getpid());
++	switch (signo) {
++	case SIGTERM:
++		stop_discoveryd = 1;
++		break;
++	default:
++		break;
++	}
++}
++
++static void setup_signal_handler(void)
++{
++	struct sigaction sa_old;
++	struct sigaction sa_new;
++
++	sa_new.sa_handler = catch_signal;
++	sigemptyset(&sa_new.sa_mask);
++	sa_new.sa_flags = 0;
++	sigaction(SIGTERM, &sa_new, &sa_old );
+ }
+ 
+ /*
+@@ -158,7 +196,7 @@ static void update_sessions(struct list_
+ 
+ 	if (!list_empty(&stale_rec_list)) {
+ 		iscsi_logout_portals(&stale_rec_list, &nr_found, 0,
+-				     logout_stale_session);
++				     logout_session);
+ 		list_for_each_entry_safe(rec, tmp_rec, &stale_rec_list, list) {
+ 			list_del(&rec->list);
+ 			free(rec);
+@@ -194,6 +232,7 @@ static void do_disc_to_addrs(const char 
+ 
+ 		pid = fork();
+ 		if (pid == 0) {
++			setup_signal_handler();
+ 			do_disc_and_login(def_iname, ip_str, portn, poll_inval);
+ 			exit(0);
+ 		} else if (pid < 0)
+@@ -201,6 +240,7 @@ static void do_disc_to_addrs(const char 
+ 				   "to perform discovery to %s.\n",
+ 				   errno, strerror(errno), ip_str);
+ 		else {
++			shutdown_callback(pid);
+ 			log_debug(1, "iSCSI disc and login helper pid=%d", pid);
+ 			reap_inc();
+ 		}
+@@ -872,8 +912,7 @@ static int isns_scn_recv(isns_server_t *
+ 
+ 	log_debug(1, "isns_scn_recv");
+ 
+-	while (1) {
+-
++	while (!stop_discoveryd) {
+ 		/* reap disc/login procs */
+ 		reap_proc();
+ 		/*
+@@ -999,7 +1038,6 @@ static int isns_eventd(const char *def_i
+ 	isns_cancel_refresh_timers();
+ fail:
+ 	isns_clear_refresh_list();
+-	free_curr_targets();
+ 
+ 	list_for_each_entry_safe(node, tmp_node, &isns_initiators, list) {
+ 		list_del(&node->list);
+@@ -1028,6 +1066,7 @@ static void start_isns(const char *def_i
+ 
+ 	rc = isns_eventd(def_iname, disc_addr, port, poll_inval);
+ 	log_debug(1, "start isns done %d.", rc);
++	discoveryd_stop();
+ }
+ 
+ /* SendTargets */
+@@ -1087,9 +1126,9 @@ static void do_st_disc_and_login(const c
+ 		__do_st_disc_and_login(disc_addr, port);
+ 		if (!poll_inval)
+ 			break;
+-	} while (!sleep(poll_inval));
++	} while (!stop_discoveryd && !sleep(poll_inval));
+ 
+-	free_curr_targets();
++	discoveryd_stop();
+ }
+ 
+ void discoveryd_start(const char *def_iname)
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i.base/usr/event_poll.c open-iscsi-2.0-872-rc1-bnx2i.work/usr/event_poll.c
+--- open-iscsi-2.0-872-rc1-bnx2i.base/usr/event_poll.c	2010-05-18 17:58:00.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/event_poll.c	2010-05-19 04:26:20.000000000 -0500
+@@ -62,21 +62,75 @@ void reap_proc(void)
+ 	}
+ }
+ 
++static LIST_HEAD(shutdown_callbacks);
++
++struct shutdown_callback {
++	struct list_head list;
++	pid_t pid;
++};
++
++int shutdown_callback(pid_t pid)
++{
++	struct shutdown_callback *cb;
++
++	cb = calloc(1, sizeof(*cb));
++	if (!cb)
++		return ENOMEM;
++
++	INIT_LIST_HEAD(&cb->list);
++	cb->pid = pid;
++	log_debug(1, "adding %d for shutdown cb\n", pid);
++	list_add_tail(&cb->list, &shutdown_callbacks);
++	return 0;
++}
++
++static void shutdown_notify_pids(void)
++{
++	struct shutdown_callback *cb;
++
++	list_for_each_entry(cb, &shutdown_callbacks, list) {
++		log_debug(1, "Killing %d\n", cb->pid);
++		kill(cb->pid, SIGTERM);
++	}
++}
++
++static int shutdown_wait_pids(void)
++{
++	struct shutdown_callback *cb, *tmp;
++
++	list_for_each_entry_safe(cb, tmp, &shutdown_callbacks, list) {
++		/*
++		 * the proc reaper could clean it up, so wait for any
++		 * sign that it is gone.
++		 */
++		if (waitpid(cb->pid, NULL, WNOHANG)) {
++			log_debug(1, "%d done\n", cb->pid);
++			list_del(&cb->list);
++			free(cb);
++		}
++	}
++
++	return list_empty(&shutdown_callbacks);
++}
++
+ #define POLL_CTRL	0
+ #define POLL_IPC	1
+ #define POLL_MAX	2
+ 
+ static int event_loop_stop;
++static queue_task_t *shutdown_qtask; 
++
+ 
+-void event_loop_exit(void)
++void event_loop_exit(queue_task_t *qtask)
+ {
++	shutdown_qtask = qtask;
+ 	event_loop_stop = 1;
+ }
+ 
+ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd)
+ {
+ 	struct pollfd poll_array[POLL_MAX];
+-	int res;
++	int res, has_shutdown_children = 0;
+ 
+ 	poll_array[POLL_CTRL].fd = control_fd;
+ 	poll_array[POLL_CTRL].events = POLLIN;
+@@ -84,7 +138,16 @@ void event_loop(struct iscsi_ipc *ipc, i
+ 	poll_array[POLL_IPC].events = POLLIN;
+ 
+ 	event_loop_stop = 0;
+-	while (!event_loop_stop) {
++	while (1) {
++		if (event_loop_stop) {
++			if (!has_shutdown_children) {
++				has_shutdown_children = 1;
++				shutdown_notify_pids();
++			}
++			if (shutdown_wait_pids())
++				break;
++		}
++
+ 		res = poll(poll_array, POLL_MAX, ACTOR_RESOLUTION);
+ 		if (res > 0) {
+ 			log_debug(6, "poll result %d", res);
+@@ -110,4 +173,6 @@ void event_loop(struct iscsi_ipc *ipc, i
+ 		 */
+ 		sysfs_cleanup();
+ 	}
++	if (shutdown_qtask)
++		mgmt_ipc_write_rsp(shutdown_qtask, MGMT_IPC_OK);
+ }
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i.base/usr/event_poll.h open-iscsi-2.0-872-rc1-bnx2i.work/usr/event_poll.h
+--- open-iscsi-2.0-872-rc1-bnx2i.base/usr/event_poll.h	2010-05-18 17:58:00.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/event_poll.h	2010-05-19 03:24:24.000000000 -0500
+@@ -20,10 +20,12 @@
+ #define EVENT_POLL_H
+ 
+ struct iscsi_ipc;
++struct queue_task;
+ 
++int shutdown_callback(pid_t pid);
+ void reap_proc(void);
+ void reap_inc(void);
+ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd);
+-void event_loop_exit(void);
++void event_loop_exit(struct queue_task *qtask);
+ 
+ #endif
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i.base/usr/mgmt_ipc.c open-iscsi-2.0-872-rc1-bnx2i.work/usr/mgmt_ipc.c
+--- open-iscsi-2.0-872-rc1-bnx2i.base/usr/mgmt_ipc.c	2010-05-18 17:58:00.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/mgmt_ipc.c	2010-05-19 03:24:33.000000000 -0500
+@@ -74,7 +74,7 @@ mgmt_ipc_listen(void)
+ void
+ mgmt_ipc_close(int fd)
+ {
+-	event_loop_exit();
++	event_loop_exit(NULL);
+ 	if (fd >= 0)
+ 		close(fd);
+ }
+@@ -190,8 +190,7 @@ mgmt_ipc_conn_add(queue_task_t *qtask)
+ static mgmt_ipc_err_e
+ mgmt_ipc_immediate_stop(queue_task_t *qtask)
+ {
+-	event_loop_exit();
+-	mgmt_ipc_write_rsp(qtask, MGMT_IPC_OK);
++	event_loop_exit(qtask);
+ 	return MGMT_IPC_OK;
+ }
+ 
diff --git a/iscsi-initiator-utils-fix-lib-sysfs-init.patch b/iscsi-initiator-utils-fix-lib-sysfs-init.patch
new file mode 100644
index 0000000..7b67f66
--- /dev/null
+++ b/iscsi-initiator-utils-fix-lib-sysfs-init.patch
@@ -0,0 +1,49 @@
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i/libiscsi/libiscsi.c open-iscsi-2.0-872-rc1-bnx2i.work/libiscsi/libiscsi.c
+--- open-iscsi-2.0-872-rc1-bnx2i/libiscsi/libiscsi.c	2010-05-18 17:57:59.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/libiscsi/libiscsi.c	2010-05-18 17:58:43.000000000 -0500
+@@ -40,6 +40,9 @@
+ 
+ #define CHECK(a) { context->error_str[0] = 0; rc = a; if (rc) goto leave; }
+ 
++/* UGLY, not thread safe :( */
++static int sysfs_initialized = 0;
++
+ struct libiscsi_context {
+ 	char error_str[256];
+ 	/* For get_parameter_helper() */
+@@ -66,7 +69,10 @@ struct libiscsi_context *libiscsi_init(v
+ 		return NULL;
+ 
+ 	log_init("libiscsi", 1024, libiscsi_log, context);
+-	sysfs_init();
++	if (!sysfs_initialized) {
++		sysfs_init();
++		sysfs_initialized = 1;
++	}
+ 	increase_max_files();
+ 	if (idbm_init(NULL)) {
+ 		sysfs_cleanup();
+@@ -529,6 +535,11 @@ int libiscsi_get_firmware_network_config
+ {
+ 	struct boot_context fw_entry;
+ 
++	if (!sysfs_initialized) {
++		sysfs_init();
++		sysfs_initialized = 1;
++	}
++
+ 	memset(config, 0, sizeof *config);
+ 	memset(&fw_entry, 0, sizeof fw_entry);
+ 	if (fw_get_entry(&fw_entry))
+@@ -551,6 +562,11 @@ int libiscsi_get_firmware_initiator_name
+ {
+ 	struct boot_context fw_entry;
+ 
++	if (!sysfs_initialized) {
++		sysfs_init();
++		sysfs_initialized = 1;
++	}
++
+ 	memset(initiatorname, 0, LIBISCSI_VALUE_MAXLEN);
+ 	memset(&fw_entry, 0, sizeof fw_entry);
+ 	if (fw_get_entry(&fw_entry))
diff --git a/iscsi-initiator-utils-fix-uip-init-race.patch b/iscsi-initiator-utils-fix-uip-init-race.patch
new file mode 100644
index 0000000..99ec6b7
--- /dev/null
+++ b/iscsi-initiator-utils-fix-uip-init-race.patch
@@ -0,0 +1,236 @@
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i/usr/initiator.c open-iscsi-2.0-872-rc1-bnx2i.work/usr/initiator.c
+--- open-iscsi-2.0-872-rc1-bnx2i/usr/initiator.c	2010-05-18 17:58:00.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/initiator.c	2010-05-18 21:40:44.000000000 -0500
+@@ -1096,6 +1096,18 @@ static void iscsi_login_timedout(void *d
+ 	}
+ }
+ 
++static void iscsi_uio_poll_login_timedout(void *data)
++{
++	struct queue_task *qtask = data;
++	struct iscsi_conn *conn = qtask->conn;
++	iscsi_session_t *session = conn->session;
++
++	log_debug(3, "timeout waiting for UIO ...\n");
++	mgmt_ipc_write_rsp(qtask, MGMT_IPC_ERR_TRANS_TIMEOUT);
++	conn_delete_timers(conn);
++	__session_destroy(session);
++}
++
+ static void iscsi_login_redirect(iscsi_conn_t *conn)
+ {
+ 	iscsi_session_t *session = conn->session;
+@@ -2049,6 +2061,52 @@ cleanup:
+ 	session_conn_shutdown(conn, qtask, err);
+ }
+ 
++static void session_conn_uio_poll(void *data)
++{
++	struct iscsi_conn_context *conn_context = data;
++	iscsi_conn_t *conn = conn_context->conn;
++	struct iscsi_session *session = conn->session;
++	queue_task_t *qtask = conn_context->data;
++	int rc;
++
++	log_debug(4, "retrying uio poll");
++	rc = __set_net_config(session->t, session, &conn->session->nrec.iface);
++	if (rc != 0) {
++		if (rc == -EAGAIN) {
++			conn_context->data = qtask;
++			iscsi_sched_conn_context(conn_context, conn, 2,
++						 EV_UIO_POLL);
++			return;
++		} else {
++			log_error("session_conn_uio_poll() "
++				  "connection failure [0x%x]", rc);
++			actor_delete(&conn->login_timer);
++			iscsi_login_eh(conn, qtask, MGMT_IPC_ERR_INTERNAL);
++			iscsi_conn_context_put(conn_context);
++			return;
++		}
++	}
++	iscsi_conn_context_put(conn_context);
++
++	actor_delete(&conn->login_timer);
++	log_debug(4, "UIO ready trying connect");
++
++	/*  uIP is ready try to connect */
++	if (gettimeofday(&conn->initial_connect_time, NULL))
++		log_error("Could not get initial connect time. If "
++			  "login errors iscsid may give up the initial "
++			  "login early. You should manually login.");
++
++        conn->state = STATE_XPT_WAIT;
++        if (iscsi_conn_connect(conn, qtask)) {
++		int delay = ISCSI_CONN_ERR_REOPEN_DELAY;
++		log_debug(4, "Waiting %u seconds before trying to reconnect.\n",
++			  delay);
++		queue_delayed_reopen(qtask, delay);
++        }
++}
++
++
+ void iscsi_sched_conn_context(struct iscsi_conn_context *conn_context,
+ 			      struct iscsi_conn *conn, unsigned long tmo,
+ 			      int event)
+@@ -2085,6 +2143,11 @@ void iscsi_sched_conn_context(struct isc
+ 			  conn_context);
+ 		actor_schedule(&conn_context->actor);
+ 		break;
++	case EV_UIO_POLL:
++		actor_new(&conn_context->actor, session_conn_uio_poll,
++			  conn_context);
++		actor_schedule(&conn_context->actor);
++		break;
+ 	case EV_CONN_LOGOUT_TIMER:
+ 		actor_timer(&conn_context->actor, tmo * 1000,
+ 			    iscsi_logout_timedout, conn_context);
+@@ -2150,8 +2213,10 @@ static int session_is_running(node_rec_t
+ }
+ 
+ static int iface_set_param(struct iscsi_transport *t, struct iface_rec *iface,
+-			   struct iscsi_session *session)
++			   queue_task_t *qtask)
+ {
++	struct iscsi_conn *conn = qtask->conn;
++	struct iscsi_session *session = conn->session;
+ 	int rc = 0;
+ 
+ 	log_debug(3, "setting iface %s, dev %s, set ip %s, hw %s, "
+@@ -2170,6 +2235,29 @@ static int iface_set_param(struct iscsi_
+ 	}
+ 
+ 	rc = __set_net_config(t, session, iface);
++	if (rc == -EAGAIN && t->template->set_net_config) {
++		struct iscsi_conn_context *conn_context;
++
++		conn_context = iscsi_conn_context_get(conn, 0);
++		if (!conn_context) {
++			/* while reopening the recv pool should be full */
++			log_error("BUG: __session_conn_reopen could "
++				  "not get conn context for recv.");
++			return ENOMEM;
++		}
++		conn_context->data = qtask;
++		conn->state = STATE_XPT_WAIT;
++
++		iscsi_sched_conn_context(conn_context, conn, 0, EV_UIO_POLL);
++
++		log_debug(3, "Setting login UIO poll timer "
++			     "%p timeout %d", &conn->login_timer,
++			  conn->login_timeout);
++		actor_timer(&conn->login_timer, conn->login_timeout * 1000,
++	 		    iscsi_uio_poll_login_timedout, qtask);
++
++		return EAGAIN;
++	}
+ 	if (rc != 0)
+ 		return rc;
+ 
+@@ -2203,6 +2291,7 @@ session_login_task(node_rec_t *rec, queu
+ 	iscsi_session_t *session;
+ 	iscsi_conn_t *conn;
+ 	struct iscsi_transport *t;
++	int rc;
+ 
+ 	if (session_is_running(rec))
+ 		return MGMT_IPC_ERR_EXISTS;
+@@ -2276,7 +2365,16 @@ session_login_task(node_rec_t *rec, queu
+ 	conn = &session->conn[0];
+ 	qtask->conn = conn;
+ 
+-	if (iface_set_param(t, &rec->iface, session)) {
++	rc =  iface_set_param(t, &rec->iface, qtask);
++	if (rc == EAGAIN)  {
++		/*
++		 * Cannot block iscsid, so caller is going to internally
++		 * retry the operation.
++		 */
++		qtask->rsp.command = MGMT_IPC_SESSION_LOGIN;
++		qtask->rsp.err = MGMT_IPC_OK;
++		return MGMT_IPC_OK;
++	} else if (rc) {
+ 		__session_destroy(session);
+ 		return MGMT_IPC_ERR_LOGIN_FAILURE;
+ 	}
+Only in open-iscsi-2.0-872-rc1-bnx2i.work/usr/: initiator.c.orig
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i/usr/initiator.h open-iscsi-2.0-872-rc1-bnx2i.work/usr/initiator.h
+--- open-iscsi-2.0-872-rc1-bnx2i/usr/initiator.h	2010-05-18 17:58:00.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/initiator.h	2010-05-18 18:13:12.000000000 -0500
+@@ -88,6 +88,7 @@ typedef enum iscsi_event_e {
+ 	EV_CONN_ERROR,
+ 	EV_CONN_LOGOUT_TIMER,
+ 	EV_CONN_STOP,
++	EV_UIO_POLL,
+ } iscsi_event_e;
+ 
+ struct queue_task;
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i/usr/iscsid_req.c open-iscsi-2.0-872-rc1-bnx2i.work/usr/iscsid_req.c
+--- open-iscsi-2.0-872-rc1-bnx2i/usr/iscsid_req.c	2010-05-18 17:58:00.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/iscsid_req.c	2010-05-18 21:16:21.000000000 -0500
+@@ -217,6 +217,8 @@ int uip_broadcast(void *buf, size_t buf_
+ 		return err;
+ 	}
+ 
++	log_debug(3, "connected to uIP daemon");
++
+ 	/*  Send the data to uIP */
+ 	if ((err = write(fd, buf, buf_len)) != buf_len) {
+ 		log_error("got write error (%d/%d), daemon died?",
+@@ -225,6 +227,8 @@ int uip_broadcast(void *buf, size_t buf_
+ 		return -EIO;
+ 	}
+ 
++	log_debug(3, "send iface config to uIP daemon");
++
+ 	/*  Set the socket to a non-blocking read, this way if there are
+ 	 *  problems waiting for uIP, iscsid can bailout early */
+ 	flags = fcntl(fd, F_GETFL, 0);
+@@ -243,8 +247,10 @@ int uip_broadcast(void *buf, size_t buf_
+ 		/*  Wait for the response */
+ 		err = read(fd, &rsp, sizeof(rsp));
+ 		if (err == sizeof(rsp)) {
+-			log_debug(3, "Broadcasted to uIP with length: %ld\n",
+-				  buf_len);
++			log_debug(3, "Broadcasted to uIP with length: %ld "
++				     "cmd: 0x%x rsp: 0x%x\n", buf_len,
++				     rsp.command, rsp.err);
++			err = 0;
+ 			break;
+ 		} else if((err == -1) && (errno == EAGAIN)) {
+ 			usleep(250000);
+@@ -256,12 +262,17 @@ int uip_broadcast(void *buf, size_t buf_
+ 		}
+ 	}
+ 
+-	if(count == MAX_UIP_BROADCAST_READ_TRIES)
+-		log_error("Could not broadcast to uIP");
++	if (count == MAX_UIP_BROADCAST_READ_TRIES) {
++		log_error("Could not broadcast to uIP after %d tries",
++			  count);
++		err = -EAGAIN;
++	} else if (rsp.err != ISCISD_UIP_MGMT_IPC_DEVICE_UP) {
++		log_debug(3, "Device is not ready\n");
++		err = -EAGAIN;
++	}
+ 
+ 	close(fd);
+-
+-	return 0;
++	return err;
+ }
+ 
+ void iscsid_handle_error(mgmt_ipc_err_e err)
+Only in open-iscsi-2.0-872-rc1-bnx2i.work/usr/: iscsid_req.c.orig
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i/usr/uip_mgmt_ipc.h open-iscsi-2.0-872-rc1-bnx2i.work/usr/uip_mgmt_ipc.h
+--- open-iscsi-2.0-872-rc1-bnx2i/usr/uip_mgmt_ipc.h	2010-05-18 17:58:00.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/uip_mgmt_ipc.h	2010-05-18 18:13:12.000000000 -0500
+@@ -55,6 +55,8 @@ typedef enum iscsid_uip_mgmt_ipc_err {
+         ISCISD_UIP_MGMT_IPC_ERR                    = 1,
+         ISCISD_UIP_MGMT_IPC_ERR_NOT_FOUND          = 2,
+         ISCISD_UIP_MGMT_IPC_ERR_NOMEM              = 3,
++	ISCISD_UIP_MGMT_IPC_DEVICE_UP              = 4,
++	ISCISD_UIP_MGMT_IPC_DEVICE_INITIALIZING    = 5,
+ } iscsid_uip_mgmt_ipc_err_e;
+ 
+ /* IPC Response */
diff --git a/iscsi-initiator-utils-fw-boot.patch b/iscsi-initiator-utils-fw-boot.patch
index e48ac26..ed43881 100644
--- a/iscsi-initiator-utils-fw-boot.patch
+++ b/iscsi-initiator-utils-fw-boot.patch
@@ -53,7 +53,7 @@ index 27b59d0..9c74117 100644
 +		struct iscsi_transport *t;
 +		uint32_t hostno;
 +
-+		if (sscanf(context->scsi_host_name, "iscsi_host%u", &hostno) != 		    1) {
++		if (sscanf(context->scsi_host_name, "iscsi_boot%u", &hostno) != 		    1) {
 +			log_error("Could not parse %s's host no.",
 +				  context->scsi_host_name);
 +			return 0;
@@ -251,7 +251,7 @@ index 0000000..9b73d1a
 +#define IBFT_SUBSYS		"ibft"
 +
 +#define ISCSI_LLD_ROOT		"/sys/firmware/"
-+#define ISCSI_LLD_SUBSYS_PREFIX	"iscsi_host"
++#define ISCSI_LLD_SUBSYS_PREFIX	"iscsi_boot"
 +
 +static char *target_list[ISCSI_BOOT_MAX];
 +static char *nic_list[ISCSI_BOOT_MAX];
diff --git a/iscsi-initiator-utils-log-info.patch b/iscsi-initiator-utils-log-info.patch
new file mode 100644
index 0000000..938f493
--- /dev/null
+++ b/iscsi-initiator-utils-log-info.patch
@@ -0,0 +1,127 @@
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i/usr/log.c open-iscsi-2.0-872-rc1-bnx2i.work/usr/log.c
+--- open-iscsi-2.0-872-rc1-bnx2i/usr/log.c	2010-05-06 15:26:01.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/log.c	2010-05-06 15:51:47.000000000 -0500
+@@ -281,10 +281,15 @@ void log_do_log_daemon(int prio, void *p
+ 
+ void log_do_log_stderr(int prio, void *priv, const char *fmt, va_list ap)
+ {
+-	fprintf(stderr, "%s: ", log_name);
+-	vfprintf(stderr, fmt, ap);
+-	fprintf(stderr, "\n");
+-	fflush(stderr);
++	if (prio == LOG_INFO) {
++		vfprintf(stdout, fmt, ap);
++		fprintf(stdout, "\n");
++	} else {
++		fprintf(stderr, "%s: ", log_name);
++		vfprintf(stderr, fmt, ap);
++		fprintf(stderr, "\n");
++		fflush(stderr);
++	}
+ }
+ 
+ void log_warning(const char *fmt, ...)
+@@ -313,6 +318,14 @@ void log_debug(int level, const char *fm
+ 	}
+ }
+ 
++void log_info(const char *fmt, ...)
++{
++	va_list ap;
++	va_start(ap, fmt);
++	log_func(LOG_INFO, log_func_priv, fmt, ap);
++	va_end(ap);
++}
++
+ static void __dump_line(int level, unsigned char *buf, int *cp)
+ {
+ 	char line[16*3+5], *lp = line;
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i/usr/log.h open-iscsi-2.0-872-rc1-bnx2i.work/usr/log.h
+--- open-iscsi-2.0-872-rc1-bnx2i/usr/log.h	2010-05-06 15:26:01.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/log.h	2010-05-06 15:39:58.000000000 -0500
+@@ -71,6 +71,8 @@ extern int log_init(char *program_name, 
+ 	void *priv);
+ extern void log_close (pid_t pid);
+ extern void dump_logmsg (void *);
++extern void log_info(const char *fmt, ...)
++	__attribute__ ((format (printf, 1, 2)));
+ extern void log_warning(const char *fmt, ...)
+ 	__attribute__ ((format (printf, 1, 2)));
+ extern void log_error(const char *fmt, ...)
+diff -aurp open-iscsi-2.0-872-rc1-bnx2i/usr/session_mgmt.c open-iscsi-2.0-872-rc1-bnx2i.work/usr/session_mgmt.c
+--- open-iscsi-2.0-872-rc1-bnx2i/usr/session_mgmt.c	2010-05-06 15:26:01.000000000 -0500
++++ open-iscsi-2.0-872-rc1-bnx2i.work/usr/session_mgmt.c	2010-05-06 15:43:28.000000000 -0500
+@@ -42,10 +42,10 @@ static void log_login_msg(struct node_re
+ 			  rec->conn[0].port);
+ 		iscsid_handle_error(rc);
+ 	} else
+-		log_warning("Login to [iface: %s, target: %s, portal: "
+-			    "%s,%d] successful.", rec->iface.name,
+-			    rec->name, rec->conn[0].address,
+-			    rec->conn[0].port);
++		log_info("Login to [iface: %s, target: %s, portal: "
++			 "%s,%d] successful.", rec->iface.name,
++			 rec->name, rec->conn[0].address,
++			 rec->conn[0].port);
+ }
+ 
+ struct iscsid_async_req {
+@@ -100,15 +100,15 @@ int iscsi_login_portal(void *data, struc
+ 	struct iscsid_async_req *async_req = NULL;
+ 	int rc = 0, fd;
+ 
+-	log_warning("Logging in to [iface: %s, target: %s, portal: %s,%d]",
+-		    rec->iface.name, rec->name, rec->conn[0].address,
+-		    rec->conn[0].port);
++	log_info("Logging in to [iface: %s, target: %s, portal: %s,%d]",
++		 rec->iface.name, rec->name, rec->conn[0].address,
++		 rec->conn[0].port);
+ 
+ 	if (list) {
+ 		async_req = calloc(1, sizeof(*async_req));
+ 		if (!async_req)
+-			log_error("Could not allocate memory for async login "
+-				  "handling. Using sequential login instead.");
++			log_info("Could not allocate memory for async login "
++				 "handling. Using sequential login instead.");
+ 		else
+ 			INIT_LIST_HEAD(&async_req->list);
+ 	}
+@@ -215,10 +215,10 @@ static void log_logout_msg(struct sessio
+ 			  info->persistent_address, info->port);
+ 		iscsid_handle_error(rc);
+ 	} else
+-		log_warning("Logout of [sid: %d, target: %s, "
+-			    "portal: %s,%d] successful.",
+-			    info->sid, info->targetname,
+-			    info->persistent_address, info->port);
++		log_info("Logout of [sid: %d, target: %s, "
++			 "portal: %s,%d] successful.",
++			 info->sid, info->targetname,
++			 info->persistent_address, info->port);
+ }
+ 
+ static int iscsid_logout_reqs_wait(struct list_head *list)
+@@ -252,16 +252,16 @@ int iscsi_logout_portal(struct session_i
+ 	int fd, rc;
+ 
+ 	/* TODO: add fn to add session prefix info like dev_printk */
+-	log_warning("Logging out of session [sid: %d, target: %s, portal: "
+-		    "%s,%d]",
+-		    info->sid, info->targetname, info->persistent_address,
+-		    info->port);
++	log_info("Logging out of session [sid: %d, target: %s, portal: "
++		 "%s,%d]",
++		 info->sid, info->targetname, info->persistent_address,
++		 info->port);
+ 
+ 	if (list) {
+ 		async_req = calloc(1, sizeof(*async_req));
+ 		if (!async_req)
+-			log_error("Could not allocate memory for async logout "
+-				  "handling. Using sequential logout instead.");
++			log_info("Could not allocate memory for async logout "
++				 "handling. Using sequential logout instead.");
+ 	}
+ 
+ 	if (!async_req)
diff --git a/iscsi-initiator-utils.spec b/iscsi-initiator-utils.spec
index 0584fad..96fa476 100644
--- a/iscsi-initiator-utils.spec
+++ b/iscsi-initiator-utils.spec
@@ -3,7 +3,7 @@
 Summary: iSCSI daemon and utility programs
 Name: iscsi-initiator-utils
 Version: 6.2.0.872
-Release: 3%{?dist}
+Release: 4%{?dist}
 Source0: http://people.redhat.com/mchristi/iscsi/rhel6.0/source/open-iscsi-2.0-872-rc1-bnx2i.tar.gz
 Source1: iscsid.init
 Source2: iscsidevs.init
@@ -26,6 +26,15 @@ Patch6: iscsi-initiator-utils-disable-isns-for-lib.patch
 Patch7: iscsi-initiator-utils-fix-zero-MaxXmitDataSegmentLength.patch
 # fix initial r2t handling for be2iscsi
 Patch8: iscsi-initiator-utils-be2iscsi-fix-init-r2t.patch
+# do not send informational msgs to stderr
+Patch9: iscsi-initiator-utils-log-info.patch
+# fix libiscsi get firmware sysfs init
+Patch10: iscsi-initiator-utils-fix-lib-sysfs-init.patch
+# fix race between uip and iscsid startup
+Patch11: iscsi-initiator-utils-fix-uip-init-race.patch
+# Fix discovery daemon iscsid shutdown
+Patch12: iscsi-initiator-utils-fix-dd-stop.patch
+
 
 Group: System Environment/Daemons
 License: GPLv2+
@@ -61,7 +70,10 @@ developing applications that use %{name}.
 %patch6 -p1 -b .disable-isns-for-lib
 %patch7 -p1 -b .fix-zero-MaxXmitDataSegmentLength
 %patch8 -p1 -b .be2iscsi-fix-init-r2t
-
+%patch9 -p1 -b .log-info
+%patch10 -p1 -b .fix-lib-sysfs-init
+%patch11 -p1 -b .fix-uip-init-race
+%patch12 -p1 -b .fix-dd-stop
 
 %build
 cd utils/open-isns
@@ -75,7 +87,7 @@ make OPTFLAGS="%{optflags}" -C utils
 make OPTFLAGS="%{optflags}" -C libiscsi
 
 cd brcm_iscsi_uio
-./configure
+./configure --enable-debug
 make OPTFLAGS="%{optflags}"
 cd ..
 
@@ -180,6 +192,17 @@ fi
 %{_includedir}/libiscsi.h
 
 %changelog
+* Tue May 18 2010 Mike Christie <mchristi at redhat.com> 6.2.0.872.4
+- 590580 libiscsi get_firmware_foo does not work without first creating a
+  libiscsi context
+- 588931 Fix uip and iscsid initialization race
+- 570664 Add basic vlan support for bnx2i's brcm uip daemon
+- 589761 Fix multiple init script bugs: rh_status does not detect offload,
+  start/stop does not work due to iscsiadm output being directed to stderr,
+  discovery daemon does not get auto started/stopped, iscsid restart does
+  not restart daemon if force-start was used.
+- 585649 Fix iscsid "-eq: unary operator expected" bug.
+
 * Wed May 5 2010 Mike Christie <mchristi at redhat.com> 6.2.0.872.3
 - 578455 Fix initial R2T=0 handling for be2iscsi
 
diff --git a/iscsid.init b/iscsid.init
index 5b7e709..7095a37 100755
--- a/iscsid.init
+++ b/iscsid.init
@@ -48,13 +48,22 @@ force_start() {
     return $retval
 }
 
+use_discoveryd() {
+    if [ -z "grep "discovery.daemon" $config | sed '/^ *#/d'" ] ; then
+	return 1
+    fi
+
+    return 0
+}
+
 start() {
     [ -x $exec ] || exit 5
     [ -f $config ] || exit 6
 
-    # only start if nodes are setup to startup automatically or root is iscsi
+    # only start if nodes are setup to startup automatically, root is iscsi,
+    # or if iscsid is managing the sessions.
     grep -qrs "node.startup = automatic" /var/lib/iscsi/nodes
-    if [ $? -eq 0 ] || root_is_iscsi; then
+    if [ $? -eq 0 ] || root_is_iscsi || use_discoveryd ; then
         force_start
         return $?
     fi
@@ -63,7 +72,11 @@ start() {
 }
 
 stop() {
-    declare -a iparams=( $(iscsiadm -m session 2>/dev/null | egrep "tcp|iser") )
+    if use_discoveryd ; then
+	iscsiadm -k 0 2>/dev/null
+    fi
+
+    declare -a iparams=( $(iscsiadm -m session 2>/dev/null | egrep "tcp|iser|bnx2i|cxgb3i|be2iscsi") )
     if [[ -n "${iparams[*]}" ]]; then
         # We have active sessions, so don't stop iscsid!!
         echo -n $"Not stopping $prog: iscsi sessions still active"
@@ -74,7 +87,7 @@ stop() {
 
     echo -n $"Stopping $prog: "
  
-    iscsiadm -k 0
+    iscsiadm -k 0 2>/dev/null
     echo
 
     killproc brcm_iscsiuio
@@ -91,13 +104,25 @@ stop() {
     modprobe -r ib_iser 2>/dev/null
     modprobe -r iscsi_tcp 2>/dev/null
 
-    [ $retval -eq 0 ] && rm -f $lockfile
-    return $retval
+    rm -f $lockfile
+    return 0
+}
+
+rh_status_q() {
+    rh_status >/dev/null 2>&1
 }
 
 restart() {
+    rh_status_q
+    use_force_start=$?
+
     stop
-    start
+    # if iscsid was running then make sure it starts up
+    if [ "$use_force_start" -eq 0 ] ; then
+	force_start
+    else
+	start
+    fi
 }
 
 reload() {
@@ -112,11 +137,6 @@ rh_status() {
     status $prog
 }
 
-rh_status_q() {
-    rh_status >/dev/null 2>&1
-}
-
-
 case "$1" in
     start)
         rh_status_q && exit 0
diff --git a/iscsidevs.init b/iscsidevs.init
index 2728b8d..731755a 100755
--- a/iscsidevs.init
+++ b/iscsidevs.init
@@ -98,7 +98,7 @@ force_reload() {
 rh_status() {
     [ -f $lockfile ] || return 3
 
-    declare -a iparams=( $(iscsiadm -m session 2>/dev/null | egrep "tcp|iser") )
+    declare -a iparams=( $(iscsiadm -m session 2>/dev/null | egrep "tcp|iser|bnx2i|be2iscsi|cxgb3i") )
     if [[ -z "${iparams[*]}" ]]; then
         # no sessions
         return 2
diff --git a/sources b/sources
index 596c1e6..bf470f3 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-05e667ff053169d7e8a620a517448cb7  open-iscsi-2.0-872-rc1-bnx2i.tar.gz
+47b83f17310664cda129045596f9058c  open-iscsi-2.0-872-rc1-bnx2i.tar.gz


More information about the scm-commits mailing list