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