[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