Module Name: src
Committed By: mlelstv
Date: Sun Nov 3 10:50:21 UTC 2024
Modified Files:
src/sys/dev/iscsi: iscsi_ioctl.c iscsi_rcv.c
Log Message:
Take lock when updating conn state.
To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/sys/dev/iscsi/iscsi_ioctl.c
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/iscsi/iscsi_rcv.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/iscsi/iscsi_ioctl.c
diff -u src/sys/dev/iscsi/iscsi_ioctl.c:1.35 src/sys/dev/iscsi/iscsi_ioctl.c:1.36
--- src/sys/dev/iscsi/iscsi_ioctl.c:1.35 Sat Aug 24 09:39:44 2024
+++ src/sys/dev/iscsi/iscsi_ioctl.c Sun Nov 3 10:50:21 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsi_ioctl.c,v 1.35 2024/08/24 09:39:44 mlelstv Exp $ */
+/* $NetBSD: iscsi_ioctl.c,v 1.36 2024/11/03 10:50:21 mlelstv Exp $ */
/*-
* Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc.
@@ -513,9 +513,11 @@ kill_connection(connection_t *conn, uint
}
}
+ mutex_enter(&conn->c_lock);
terminating = conn->c_terminating;
if (!terminating)
conn->c_terminating = status;
+ mutex_exit(&conn->c_lock);
/* Don't recurse */
if (terminating) {
@@ -545,6 +547,12 @@ kill_connection(connection_t *conn, uint
logout == LOGOUT_CONNECTION) {
logout = LOGOUT_SESSION;
}
+
+ /* connection is terminating, prevent cleanup */
+ mutex_enter(&conn->c_lock);
+ conn->c_usecount++;
+ mutex_exit(&conn->c_lock);
+
mutex_exit(&iscsi_cleanup_mtx);
DEBC(conn, 1, ("Send_logout for reason %d\n", logout));
@@ -552,7 +560,10 @@ kill_connection(connection_t *conn, uint
connection_timeout_start(conn, CONNECTION_TIMEOUT);
if (!send_logout(conn, conn, logout, FALSE)) {
+ mutex_enter(&conn->c_lock);
+ conn->c_usecount--;
conn->c_terminating = ISCSI_STATUS_SUCCESS;
+ mutex_exit(&conn->c_lock);
return;
}
/*
@@ -564,6 +575,11 @@ kill_connection(connection_t *conn, uint
*/
mutex_enter(&iscsi_cleanup_mtx);
+
+ /* release connection */
+ mutex_enter(&conn->c_lock);
+ conn->c_usecount--;
+ mutex_exit(&conn->c_lock);
}
}
Index: src/sys/dev/iscsi/iscsi_rcv.c
diff -u src/sys/dev/iscsi/iscsi_rcv.c:1.26 src/sys/dev/iscsi/iscsi_rcv.c:1.27
--- src/sys/dev/iscsi/iscsi_rcv.c:1.26 Tue Sep 13 13:09:16 2022
+++ src/sys/dev/iscsi/iscsi_rcv.c Sun Nov 3 10:50:21 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsi_rcv.c,v 1.26 2022/09/13 13:09:16 mlelstv Exp $ */
+/* $NetBSD: iscsi_rcv.c,v 1.27 2024/11/03 10:50:21 mlelstv Exp $ */
/*-
* Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc.
@@ -582,18 +582,20 @@ receive_logout_pdu(connection_t *conn, p
wake_ccb(req_ccb, status);
+ mutex_enter(&conn->c_lock);
if (!otherconn && conn->c_state == ST_LOGOUT_SENT) {
conn->c_terminating = ISCSI_STATUS_LOGOUT;
conn->c_state = ST_SETTLING;
conn->c_loggedout = (response) ? LOGOUT_FAILED : LOGOUT_SUCCESS;
+ mutex_exit(&conn->c_lock);
connection_timeout_stop(conn);
/* let send thread take over next step of cleanup */
mutex_enter(&conn->c_lock);
cv_broadcast(&conn->c_conn_cv);
- mutex_exit(&conn->c_lock);
}
+ mutex_exit(&conn->c_lock);
return !otherconn;
}