diff --git a/0025-iscsid-stop-connection-for-recovery-if-error-is-not-.patch b/0025-iscsid-stop-connection-for-recovery-if-error-is-not-.patch new file mode 100644 index 0000000000000000000000000000000000000000..baba8cc4d23ef98f2d50d5d97e8a969f09590fc7 --- /dev/null +++ b/0025-iscsid-stop-connection-for-recovery-if-error-is-not-.patch @@ -0,0 +1,70 @@ +From 9f2074568e6c39f85c9d948cb3b869f4fc774695 Mon Sep 17 00:00:00 2001 +From: Wenchao Hao <73930449+wenchao-hao@users.noreply.github.com> +Date: Thu, 12 Jan 2023 11:10:05 +0800 +Subject: [PATCH] iscsid: stop connection for recovery if error is not timeout + in iscsi_login_eh (#388) + +When iscsid is reopening a connection, and the reopen process has succeed +to call bind_conn and comes to iscsi_session_set_params() to set +parameters. If the iscsi target trigger another error event(such as +close the socket connection between initiator and target) at this time, +kernel would perform the error handler and set connection's state to +ISCSI_CONN_FAILED, and set kernel iscsi_cls_conn->flags' +ISCSI_CLS_CONN_BIT_CLEANUP bit. Which would make iscsid's +iscsi_session_set_params() failed with ENOTCONN, so iscsi_login_eh() +would be called by iscsid to handle this error. + +Now iscsid see conn->state is ISCSI_CONN_STATE_XPT_WAIT and +session->r_stage is R_STAGE_SESSION_REOPEN, so it would call +session_conn_reopen() with do_stop set to 0, which would not trigger +kernel to call iscsi_if_stop_conn() to clear kernel data struct +iscsi_cls_conn->flags' ISCSI_CLS_CONN_BIT_CLEANUP bit. + +The reopen would fall into an infinite cycle which looks like +following: + +iscsi_conn_connect -> bind_conn(failed with ENOTCONN) + + ^ | + | | + | v + + session_conn_reopwn(with do_stop set to 0) + +The phenomenon is iscsid would always report log "can't bind conn x:0 +to session x, retcode -107 (115)" and the session would not recovery. + +Fix this issue by checking error type in iscsi_login_eh(), if the error +type is not timeout, make sure we would call session_conn_reopen() with +do_stop set to STOP_CONN_RECOVER. + +Signed-off-by: Wenchao Hao + +Signed-off-by: Wenchao Hao +--- + usr/initiator.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/usr/initiator.c b/usr/initiator.c +index 56bf38b..9c48dd5 100644 +--- a/usr/initiator.c ++++ b/usr/initiator.c +@@ -735,8 +735,13 @@ static void iscsi_login_eh(struct iscsi_conn *conn, struct queue_task *qtask, + session_conn_shutdown(conn, qtask, err); + break; + } +- /* timeout during reopen connect. try again */ +- session_conn_reopen(conn, qtask, 0); ++ /* ++ * stop connection for recovery if error is not ++ * timeout ++ */ ++ if (err != ISCSI_ERR_TRANS_TIMEOUT) ++ stop_flag = STOP_CONN_RECOVER; ++ session_conn_reopen(conn, qtask, stop_flag); + break; + case R_STAGE_SESSION_CLEANUP: + session_conn_shutdown(conn, qtask, err); +-- +2.39.3 + diff --git a/iscsi-initiator-utils.spec b/iscsi-initiator-utils.spec index 2386f3ed64ffe630028a359733e4d53cbd7cdc7a..c15d88254fbe6dd4154c0817624a5bbd3e0b5ed9 100644 --- a/iscsi-initiator-utils.spec +++ b/iscsi-initiator-utils.spec @@ -1,4 +1,4 @@ -%define anolis_release .0.1 +%define anolis_release .0.2 %global open_iscsi_version 2.1 %global open_iscsi_build 4 %global commit0 095f59ca464220eae285de6b5f2ee31185a6a84c @@ -46,6 +46,7 @@ Patch0021: 0021-use-Red-Hat-version-string-to-match-RPM-package-vers.patch Patch0022: 0022-iscsi_if.h-replace-zero-length-array-with-flexible-a.patch Patch0023: 0023-stop-using-Werror-for-now.patch Patch0024: 0024-iscsistart-fix-null-pointer-deref-before-exit.patch +Patch0025: 0025-iscsid-stop-connection-for-recovery-if-error-is-not-.patch BuildRequires: flex bison doxygen kmod-devel systemd-units BuildRequires: autoconf automake libtool libmount-devel openssl-devel @@ -365,6 +366,9 @@ fi %{python3_sitearch}/* %changelog +* Mon Aug 12 2024 Kaiqiang Wang - 6.2.1.4-8.git095f59c.0.2 +- fix https://bugzilla.openanolis.cn/show_bug.cgi?id=9729 + * Fri Sep 01 2023 lihaipeng - 6.2.1.4-8.git095f59c.0.1 - Use anolis for iqn name