From d53ca4738543b1a5df8a3aef523e5ba2cc70a297 Mon Sep 17 00:00:00 2001 From: Wu Bo Date: Fri, 18 Feb 2022 13:14:36 +0800 Subject: [PATCH] Backport bugfix patches Following patches are added: 0017-iscsi-sysfs-check-state-before-onlining-devs.patch 0018-iscsiadm-Call-log_init-first-to-fix-a-segmentation-f.patch 0019-Fix-issues-discovered-by-gcc12.patch 0020-Fix-more-issues-discovered-by-gcc12.patch 0021-actor-enhanced-print-error-log-when-init-a-initilize.patch 0022-initiator_common-make-set-operational-parameter-log-.patch Signed-off-by: Wu Bo (cherry picked from commit 36cc8318bb8cb23d09d8a68795f1e97ea0268ffc) --- ...sfs-check-state-before-onlining-devs.patch | 75 ++++++++++++++ ...g_init-first-to-fix-a-segmentation-f.patch | 38 +++++++ 0019-Fix-issues-discovered-by-gcc12.patch | 98 +++++++++++++++++++ ...-Fix-more-issues-discovered-by-gcc12.patch | 44 +++++++++ ...rint-error-log-when-init-a-initilize.patch | 31 ++++++ ...-make-set-operational-parameter-log-.patch | 46 +++++++++ open-iscsi.spec | 11 ++- 7 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 0017-iscsi-sysfs-check-state-before-onlining-devs.patch create mode 100644 0018-iscsiadm-Call-log_init-first-to-fix-a-segmentation-f.patch create mode 100644 0019-Fix-issues-discovered-by-gcc12.patch create mode 100644 0020-Fix-more-issues-discovered-by-gcc12.patch create mode 100644 0021-actor-enhanced-print-error-log-when-init-a-initilize.patch create mode 100644 0022-initiator_common-make-set-operational-parameter-log-.patch diff --git a/0017-iscsi-sysfs-check-state-before-onlining-devs.patch b/0017-iscsi-sysfs-check-state-before-onlining-devs.patch new file mode 100644 index 0000000..d053652 --- /dev/null +++ b/0017-iscsi-sysfs-check-state-before-onlining-devs.patch @@ -0,0 +1,75 @@ +From 245a547c61a9356cdb7dba0032c09ad58c17143b Mon Sep 17 00:00:00 2001 +From: Mike Christie +Date: Fri, 5 Nov 2021 16:33:20 -0500 +Subject: [PATCH] iscsi sysfs: check state before onlining devs + +In 5.6, the commit: + +commit 0ab710458da113a71c461c4df27e7f1353d9f864 +Author: Bharath Ravi +Date: Sat Jan 25 01:19:25 2020 -0500 + + scsi: iscsi: Perform connection failure entirely in kernel space + +made it so the kernel can start the recovery process. This means that +after the start conn operation the kernel could set the device into the +block stated. We can then hit a race where iscsid has done start conn, +and is calling session_online_devs but the kernel has hit an issue and is +now setting the device's to blocked. + +This adds a check for if the device is in the offline state before trying +to set the state to running. +--- + usr/iscsi_sysfs.c | 25 ++++++++++++++++++++++++- + 1 file changed, 24 insertions(+), 1 deletion(-) + +diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c +index abefde2..7bb834a 100644 +--- a/usr/iscsi_sysfs.c ++++ b/usr/iscsi_sysfs.c +@@ -1929,18 +1929,41 @@ void iscsi_sysfs_set_queue_depth(void *data, int hostno, int target, int lun) + void iscsi_sysfs_set_device_online(__attribute__((unused))void *data, + int hostno, int target, int lun) + { +- char *write_buf = "running\n"; ++ char *write_buf = "running\n", *state; + char id[NAME_SIZE]; + int err; + + snprintf(id, sizeof(id), "%d:0:%d:%d", hostno, target, lun); + log_debug(4, "online device %s", id); + ++ state = sysfs_get_value(id, SCSI_SUBSYS, "state"); ++ if (!state) { ++ log_error("Could not read state for LUN %s\n", id); ++ goto set_state; ++ } ++ ++ if (!strcmp(state, "running")) ++ goto done; ++ /* ++ * The kernel can start to perform session level recovery cleanup ++ * any time after the conn start call, so we only want to change the ++ * state if we are in one of the offline states. ++ */ ++ if (strcmp(state, "offline") && strcmp(state, "transport-offline")) { ++ log_debug(4, "Dev not offline. Skip onlining %s", id); ++ goto done; ++ } ++ ++set_state: + err = sysfs_set_param(id, SCSI_SUBSYS, "state", write_buf, + strlen(write_buf)); + if (err && err != EINVAL) + /* we should read the state */ + log_error("Could not online LUN %d err %d.", lun, err); ++ ++done: ++ if (state) ++ free(state); + } + + void iscsi_sysfs_rescan_device(__attribute__((unused))void *data, +-- +2.27.0 + diff --git a/0018-iscsiadm-Call-log_init-first-to-fix-a-segmentation-f.patch b/0018-iscsiadm-Call-log_init-first-to-fix-a-segmentation-f.patch new file mode 100644 index 0000000..7319a49 --- /dev/null +++ b/0018-iscsiadm-Call-log_init-first-to-fix-a-segmentation-f.patch @@ -0,0 +1,38 @@ +From 6c54bf1ee7cd3f31cd0f55459809e739fe9a85de Mon Sep 17 00:00:00 2001 +From: Wenchao Hao +Date: Fri, 19 Nov 2021 22:21:58 +0800 +Subject: [PATCH] iscsiadm: Call log_init() first to fix a segmentation fault + +log_init() should be called before log_error() + +Signed-off-by: Wenchao Hao +--- + usr/iscsiadm.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c +index 192da66..0467db5 100644 +--- a/usr/iscsiadm.c ++++ b/usr/iscsiadm.c +@@ -3599,6 +3599,9 @@ main(int argc, char **argv) + struct iscsi_session *se = NULL; + bool wait = true; + ++ /* enable stdout logging */ ++ log_init(program_name, 1024, log_do_log_std, NULL); ++ + ctx = iscsi_context_new(); + if (ctx == NULL) { + log_error("No memory"); +@@ -3616,8 +3619,6 @@ main(int argc, char **argv) + + umask(0077); + +- /* enable stdout logging */ +- log_init(program_name, 1024, log_do_log_std, NULL); + sysfs_init(); + + optopt = 0; +-- +2.27.0 + diff --git a/0019-Fix-issues-discovered-by-gcc12.patch b/0019-Fix-issues-discovered-by-gcc12.patch new file mode 100644 index 0000000..f41f296 --- /dev/null +++ b/0019-Fix-issues-discovered-by-gcc12.patch @@ -0,0 +1,98 @@ +From 151e701d08e16dce545d017e57c3d5ac957b7c1e Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Tue, 25 Jan 2022 10:11:58 -0800 +Subject: [PATCH] Fix issues discovered by gcc12 + +Gcc-12 caught a few errors in the code where we were checking +for an array being empty incorrectly, so this commit fixes those. +--- + usr/auth.c | 3 +-- + usr/login.c | 18 +++++++++--------- + 2 files changed, 10 insertions(+), 11 deletions(-) + +diff --git a/usr/auth.c b/usr/auth.c +index 2f7506f..46c328e 100644 +--- a/usr/auth.c ++++ b/usr/auth.c +@@ -109,7 +109,7 @@ acl_chap_auth_request(struct iscsi_acl *client, char *username, unsigned int id, + unsigned char verify_data[client->chap_challenge_len]; + + /* the expected credentials are in the session */ +- if (session->username_in == NULL) { ++ if (session->username_in[0] == '\0') { + log_error("failing authentication, no incoming username " + "configured to authenticate target %s", + session->target_name); +@@ -122,7 +122,6 @@ acl_chap_auth_request(struct iscsi_acl *client, char *username, unsigned int id, + } + + if ((session->password_in_length < 1) || +- (session->password_in == NULL) || + (session->password_in[0] == '\0')) { + log_error("failing authentication, no incoming password " + "configured to authenticate target %s", +diff --git a/usr/login.c b/usr/login.c +index 8af8756..096deda 100644 +--- a/usr/login.c ++++ b/usr/login.c +@@ -657,7 +657,7 @@ iscsi_process_login_response(iscsi_session_t *session, int cid, + struct iscsi_acl *auth_client; + iscsi_conn_t *conn = &session->conn[cid]; + +- auth_client = (session->auth_buffers && session->num_auth_buffers) ? ++ auth_client = (session->num_auth_buffers > 0) ? + (struct iscsi_acl *)session->auth_buffers[0].address : NULL; + + end = text + ntoh24(login_rsp->dlength) + 1; +@@ -1135,7 +1135,7 @@ iscsi_make_login_pdu(iscsi_session_t *session, int cid, struct iscsi_hdr *hdr, + struct iscsi_acl *auth_client; + iscsi_conn_t *conn = &session->conn[cid]; + +- auth_client = (session->auth_buffers && session->num_auth_buffers) ? ++ auth_client = (session->num_auth_buffers > 0) ? + (struct iscsi_acl *)session->auth_buffers[0].address : NULL; + + /* initialize the PDU header */ +@@ -1170,7 +1170,7 @@ iscsi_make_login_pdu(iscsi_session_t *session, int cid, struct iscsi_hdr *hdr, + return 0; + } + +- if ((session->target_name && session->target_name[0]) && ++ if ((session->target_name[0] != '\0') && + (session->type == ISCSI_SESSION_TYPE_NORMAL)) { + if (!iscsi_add_text(hdr, data, max_data_length, + "TargetName", session->target_name)) +@@ -1248,16 +1248,16 @@ check_for_authentication(iscsi_session_t *session, + return LOGIN_FAILED; + } + +- if (session->username && ++ if ((session->username[0] != '\0') && + (acl_set_user_name(auth_client, session->username) != +- AUTH_STATUS_NO_ERROR)) { ++ AUTH_STATUS_NO_ERROR)) { + log_error("Couldn't set username"); + goto end; + } + +- if (session->password && (acl_set_passwd(auth_client, +- session->password, session->password_length) != +- AUTH_STATUS_NO_ERROR)) { ++ if ((session->password[0] != '\0') && ++ (acl_set_passwd(auth_client, session->password, session->password_length) != ++ AUTH_STATUS_NO_ERROR)) { + log_error("Couldn't set password"); + goto end; + } +@@ -1366,7 +1366,7 @@ iscsi_login_begin(iscsi_session_t *session, iscsi_login_context_t *c) + conn->current_stage = ISCSI_INITIAL_LOGIN_STAGE; + conn->partial_response = 0; + +- if (session->auth_buffers && session->num_auth_buffers) { ++ if (session->num_auth_buffers > 0) { + c->ret = check_for_authentication(session, c->auth_client); + if (c->ret != LOGIN_OK) + return 1; +-- +2.27.0 + diff --git a/0020-Fix-more-issues-discovered-by-gcc12.patch b/0020-Fix-more-issues-discovered-by-gcc12.patch new file mode 100644 index 0000000..dc83a25 --- /dev/null +++ b/0020-Fix-more-issues-discovered-by-gcc12.patch @@ -0,0 +1,44 @@ +From 1cab1efc813f750f9fa68e35dc16e8e54a1ba1e8 Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Wed, 26 Jan 2022 11:44:09 -0800 +Subject: [PATCH] Fix more issues discovered by gcc12 + +Gcc-12 caught a few more errors in the code, where we are +still checking an array address for NULL, which will never +happen. +--- + usr/discovery.c | 2 +- + usr/iscsi_sysfs.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/usr/discovery.c b/usr/discovery.c +index 7dec696..587af6d 100644 +--- a/usr/discovery.c ++++ b/usr/discovery.c +@@ -623,7 +623,7 @@ add_target_record(char *name, char *end, discovery_rec_t *drec, + + /* if no address is provided, use the default */ + if (text >= end) { +- if (drec->address == NULL) { ++ if (drec->address[0] == '\0') { + log_error("no default address known for target %s", + name); + return 0; +diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c +index 7bb834a..9a591be 100644 +--- a/usr/iscsi_sysfs.c ++++ b/usr/iscsi_sysfs.c +@@ -1416,8 +1416,8 @@ int iscsi_sysfs_get_sessioninfo_by_id(struct session_info *info, char *session) + log_debug(7, "found targetname %s address %s pers address %s port %d " + "pers port %d driver %s iface name %s ipaddress %s " + "netdev %s hwaddress %s iname %s", +- info->targetname, info->address ? info->address : "NA", +- info->persistent_address ? info->persistent_address : "NA", ++ info->targetname, info->address[0] ? info->address : "NA", ++ info->persistent_address[0] ? info->persistent_address : "NA", + info->port, info->persistent_port, info->iface.transport_name, + info->iface.name, info->iface.ipaddress, + info->iface.netdev, info->iface.hwaddress, +-- +2.27.0 + diff --git a/0021-actor-enhanced-print-error-log-when-init-a-initilize.patch b/0021-actor-enhanced-print-error-log-when-init-a-initilize.patch new file mode 100644 index 0000000..9e02dc4 --- /dev/null +++ b/0021-actor-enhanced-print-error-log-when-init-a-initilize.patch @@ -0,0 +1,31 @@ +From 0b9675a2263174060b11e459fcfd554b10f9ca1e Mon Sep 17 00:00:00 2001 +From: Wenchao Hao +Date: Wed, 2 Feb 2022 12:13:16 +0800 +Subject: [PATCH] actor: enhanced: print error log when init a initilized + thread + +This is only a enhance, do not change origin logic + +Signed-off-by: Wenchao Hao +--- + usr/actor.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/usr/actor.c b/usr/actor.c +index dc008a7..a6bb02f 100644 +--- a/usr/actor.c ++++ b/usr/actor.c +@@ -45,6 +45,10 @@ actor_time_left(actor_t *thread, time_t current_time) + void + actor_init(actor_t *thread, void (*callback)(void *), void *data) + { ++ if (thread->state != ACTOR_INVALID) ++ log_error("bug:thread %p has already been initialized", ++ thread); ++ + INIT_LIST_HEAD(&thread->list); + thread->state = ACTOR_NOTSCHEDULED; + thread->callback = callback; +-- +2.27.0 + diff --git a/0022-initiator_common-make-set-operational-parameter-log-.patch b/0022-initiator_common-make-set-operational-parameter-log-.patch new file mode 100644 index 0000000..ca3db5e --- /dev/null +++ b/0022-initiator_common-make-set-operational-parameter-log-.patch @@ -0,0 +1,46 @@ +From d4a13200efd215d5b115db60f075921c5e67cc57 Mon Sep 17 00:00:00 2001 +From: Wenchao Hao +Date: Wed, 2 Feb 2022 16:09:05 +0800 +Subject: [PATCH] initiator_common: make set operational parameter log easy to + read + +iscsid would print log like following if debug level is larger than 3: + +iscsid: set operational parameter 35 to: +iscsid: 30 +iscsid: set operational parameter 30 to: +iscsid: 5 + +which is not friendly to read, this commit makes it easy to read, +like this: + +iscsid: set operational parameter 35 to: 30 +iscsid: set operational parameter 30 to: 5 + +Signed-off-by: Wenchao Hao +--- + usr/initiator_common.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/usr/initiator_common.c b/usr/initiator_common.c +index 6cf26c1..bc69fbd 100644 +--- a/usr/initiator_common.c ++++ b/usr/initiator_common.c +@@ -273,12 +273,10 @@ static int host_set_param(struct iscsi_transport *t, + + static void print_param_value(enum iscsi_param param, void *value, int type) + { +- log_debug(3, "set operational parameter %d to:", param); +- + if (type == ISCSI_STRING) +- log_debug(3, "%s", value ? (char *)value : "NULL"); ++ log_debug(3, "set operational parameter %d to %s", param, value ? (char *)value : "NULL"); + else +- log_debug(3, "%u", *(uint32_t *)value); ++ log_debug(3, "set operational parameter %d to %u", param, *(uint32_t *)value); + } + + #define MAX_HOST_PARAMS 2 +-- +2.27.0 + diff --git a/open-iscsi.spec b/open-iscsi.spec index 1691cf9..70f446f 100644 --- a/open-iscsi.spec +++ b/open-iscsi.spec @@ -4,7 +4,7 @@ Name: open-iscsi Version: 2.1.5 -Release: 6 +Release: 7 Summary: ISCSI software initiator daemon and utility programs License: GPLv2+ and BSD URL: http://www.open-iscsi.com @@ -25,6 +25,12 @@ patch13: 0013-Remove-iscsiuio-from-build-and-install-recipe.patch patch14: 0014-Remove-iscsiuio-source-code.patch patch15: 0015-Remove-iscsiuio-from-config-and-service-file.patch patch16: 0016-Remove-iscsi-init.service-from-iscsi-and-iscsid-serv.patch +patch17: 0017-iscsi-sysfs-check-state-before-onlining-devs.patch +patch18: 0018-iscsiadm-Call-log_init-first-to-fix-a-segmentation-f.patch +patch19: 0019-Fix-issues-discovered-by-gcc12.patch +patch20: 0020-Fix-more-issues-discovered-by-gcc12.patch +patch21: 0021-actor-enhanced-print-error-log-when-init-a-initilize.patch +patch22: 0022-initiator_common-make-set-operational-parameter-log-.patch BuildRequires: flex bison doxygen kmod-devel systemd-units gcc git isns-utils-devel systemd-devel BuildRequires: autoconf automake libtool libmount-devel openssl-devel pkg-config @@ -151,6 +157,9 @@ fi %{_mandir}/man8/* %changelog +* Fri Feb 18 2022 wubo - 2.1.5-7 +- Backport bugfix patches + * Tue Feb 8 2022 haowenchao - 2.1.5-6 - Remove useless patch