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 <wubo40@huawei.com>
(cherry picked from commit 36cc8318bb8cb23d09d8a68795f1e97ea0268ffc)
This commit is contained in:
Wu Bo 2022-02-18 13:14:36 +08:00 committed by openeuler-sync-bot
parent 720db26e2f
commit d53ca47385
7 changed files with 342 additions and 1 deletions

View File

@ -0,0 +1,75 @@
From 245a547c61a9356cdb7dba0032c09ad58c17143b Mon Sep 17 00:00:00 2001
From: Mike Christie <michael.christie@oracle.com>
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 <rbharath@google.com>
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

View File

@ -0,0 +1,38 @@
From 6c54bf1ee7cd3f31cd0f55459809e739fe9a85de Mon Sep 17 00:00:00 2001
From: Wenchao Hao <haowenchao@huawei.com>
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 <haowenchao@huawei.com>
---
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

View File

@ -0,0 +1,98 @@
From 151e701d08e16dce545d017e57c3d5ac957b7c1e Mon Sep 17 00:00:00 2001
From: Lee Duncan <lduncan@suse.com>
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

View File

@ -0,0 +1,44 @@
From 1cab1efc813f750f9fa68e35dc16e8e54a1ba1e8 Mon Sep 17 00:00:00 2001
From: Lee Duncan <lduncan@suse.com>
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

View File

@ -0,0 +1,31 @@
From 0b9675a2263174060b11e459fcfd554b10f9ca1e Mon Sep 17 00:00:00 2001
From: Wenchao Hao <haowenchao@huawei.com>
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 <haowenchao@huawei.com>
---
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

View File

@ -0,0 +1,46 @@
From d4a13200efd215d5b115db60f075921c5e67cc57 Mon Sep 17 00:00:00 2001
From: Wenchao Hao <haowenchao@huawei.com>
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 <haowenchao@huawei.com>
---
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

View File

@ -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 <wubo40@huawei.com> - 2.1.5-7
- Backport bugfix patches
* Tue Feb 8 2022 haowenchao <haowenchao@huawei.com> - 2.1.5-6
- Remove useless patch