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;
 }

Reply via email to