diff options
-rw-r--r-- | etc/systemd/iscsi-init.service | 8 | ||||
-rw-r--r-- | etc/systemd/iscsi.service | 6 | ||||
-rw-r--r-- | include/iscsi_if.h | 4 | ||||
-rw-r--r-- | iscsiuio/src/uip/ipv6.c | 2 | ||||
-rw-r--r-- | iscsiuio/src/unix/nic_utils.c | 20 | ||||
-rw-r--r-- | usr/initiator.c | 6 | ||||
-rw-r--r-- | usr/iscsid.c | 7 | ||||
-rw-r--r-- | utils/fwparam_ibft/fwparam_ibft.c | 1 | ||||
-rw-r--r-- | utils/fwparam_ibft/fwparam_sysfs.c | 5 |
9 files changed, 41 insertions, 18 deletions
diff --git a/etc/systemd/iscsi-init.service b/etc/systemd/iscsi-init.service new file mode 100644 index 0000000..e058ff0 --- /dev/null +++ b/etc/systemd/iscsi-init.service @@ -0,0 +1,8 @@ +[Unit] +Description=One time configuration for iscsi.service +ConditionPathExists=!/etc/iscsi/initiatorname.iscsi + +[Service] +Type=oneshot +RemainAfterExit=no +ExecStart=/usr/bin/sh -c 'echo "InitiatorName=`/usr/sbin/iscsi-iname`" > /etc/iscsi/initiatorname.iscsi' diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service index 1c286d1..2f2bf81 100644 --- a/etc/systemd/iscsi.service +++ b/etc/systemd/iscsi.service @@ -2,9 +2,9 @@ Description=Login and scanning of iSCSI devices Documentation=man:iscsiadm(8) man:iscsid(8) Before=remote-fs.target -After=network.target network-online.target iscsid.service -Requires=iscsid.socket -ConditionPathExists=/etc/iscsi/initiatorname.iscsi +After=network.target network-online.target +After=iscsid.service iscsi-init.service +Requires=iscsid.socket iscsi-init.service [Service] Type=oneshot diff --git a/include/iscsi_if.h b/include/iscsi_if.h index 2d46214..5a1c614 100644 --- a/include/iscsi_if.h +++ b/include/iscsi_if.h @@ -841,7 +841,7 @@ struct iscsi_stats { * up to ISCSI_STATS_CUSTOM_MAX */ uint32_t custom_length; - struct iscsi_stats_custom custom[0] + struct iscsi_stats_custom custom[] __attribute__ ((aligned (sizeof(uint64_t)))); }; @@ -972,7 +972,7 @@ struct iscsi_offload_host_stats { * up to ISCSI_HOST_STATS_CUSTOM_MAX */ uint32_t custom_length; - struct iscsi_host_stats_custom custom[0] + struct iscsi_host_stats_custom custom[] __attribute__ ((aligned (sizeof(uint64_t)))); }; diff --git a/iscsiuio/src/uip/ipv6.c b/iscsiuio/src/uip/ipv6.c index 05efa73..11cb4e9 100644 --- a/iscsiuio/src/uip/ipv6.c +++ b/iscsiuio/src/uip/ipv6.c @@ -519,7 +519,7 @@ static void ipv6_insert_protocol_chksum(struct ipv6_hdr *ipv6) * SRC IP, DST IP, Protocol Data Length, and Next Header. */ sum = 0; - ptr = (u16_t *)&ipv6->ipv6_src; + ptr = (u16_t *)&ipv6->ipv6_src.addr16[0]; for (i = 0; i < sizeof(struct ipv6_addr); i++) { sum += HOST_TO_NET16(*ptr); diff --git a/iscsiuio/src/unix/nic_utils.c b/iscsiuio/src/unix/nic_utils.c index ec3b915..ec4535d 100644 --- a/iscsiuio/src/unix/nic_utils.c +++ b/iscsiuio/src/unix/nic_utils.c @@ -603,7 +603,10 @@ static int from_uio_find_associated_host(nic_t *nic, int uio_minor, search_filters[path_iterator], alphasort); switch (count) { - case 1: + case 1: { + char *parsed_src; + size_t parsed_size; + parsed_name = (*extract_name[path_iterator]) (files); if (!parsed_name) { LOG_WARN(PFX "Couldn't find delimiter in: %s", @@ -612,15 +615,22 @@ static int from_uio_find_associated_host(nic_t *nic, int uio_minor, break; } - strncpy(name, - parsed_name + - extract_name_offset[path_iterator], name_size); + parsed_src = parsed_name + extract_name_offset[path_iterator]; + parsed_size = strlen(parsed_src); + if (parsed_size >= name_size) { + LOG_WARN(PFX "uio device name too long: %s (max %d)", + parsed_src, (int)name_size - 1); + rc = -EINVAL; + } else { + strncpy(name, parsed_src, name_size); + rc = 0; + } free(files[0]); free(files); - rc = 0; break; + } case 0: rc = -EINVAL; diff --git a/usr/initiator.c b/usr/initiator.c index a07f9aa..5f4bdca 100644 --- a/usr/initiator.c +++ b/usr/initiator.c @@ -711,11 +711,7 @@ static void iscsi_login_eh(struct iscsi_conn *conn, struct queue_task *qtask, !iscsi_retry_initial_login(conn)) session_conn_shutdown(conn, qtask, err); else { - session->reopen_cnt++; - session->t->template->ep_disconnect(conn); - if (iscsi_conn_connect(conn, qtask)) - queue_delayed_reopen(qtask, - ISCSI_CONN_ERR_REOPEN_DELAY); + session_conn_reopen(conn, qtask, STOP_CONN_TERM); } break; case R_STAGE_SESSION_REDIRECT: diff --git a/usr/iscsid.c b/usr/iscsid.c index 99d27ab..e501498 100644 --- a/usr/iscsid.c +++ b/usr/iscsid.c @@ -310,7 +310,12 @@ static void iscsid_shutdown(void) static void catch_signal(int signo) { - log_debug(1, "pid %d caught signal %d", getpid(), signo); + /* + * Do not try to call log_debug() if there is a PIPE error + * because we can get caught in a PIPE error loop. + */ + if (signo != SIGPIPE) + log_debug(1, "pid %d caught signal %d", getpid(), signo); /* In foreground mode, treat SIGINT like SIGTERM */ if (!daemonize && signo == SIGINT) diff --git a/utils/fwparam_ibft/fwparam_ibft.c b/utils/fwparam_ibft/fwparam_ibft.c index 52edac1..e68e503 100644 --- a/utils/fwparam_ibft/fwparam_ibft.c +++ b/utils/fwparam_ibft/fwparam_ibft.c @@ -463,6 +463,7 @@ fwparam_ibft(struct boot_context *context, const char *filepath) if (stat(filename, &buf)!=0) { fprintf(stderr, "Could not stat file %s: %s (%d)\n", filename, strerror(errno), errno); + close(fd); return -1; } /* And if not zero use that size */ diff --git a/utils/fwparam_ibft/fwparam_sysfs.c b/utils/fwparam_ibft/fwparam_sysfs.c index a0cd1c7..87fd6d4 100644 --- a/utils/fwparam_ibft/fwparam_sysfs.c +++ b/utils/fwparam_ibft/fwparam_sysfs.c @@ -115,8 +115,11 @@ static int get_iface_from_device(char *id, struct boot_context *context) break; } - if (sscanf(dent->d_name, "net:%s", context->iface) != 1) + if (sscanf(dent->d_name, "net:%s", context->iface) != 1) { rc = EINVAL; + break; + } + rc = 0; break; } else { |