Print this page
12976 system panics with error in IP module
Reviewed by: Andy Fiddaman <andy@omniosce.org>
Reviewed by: Paul Winder <p.winder@me.com>
*** 19,32 ****
* CDDL HEADER END
*/
/*
* Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2019 Joyent, Inc.
* Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2013, 2017 by Delphix. All rights reserved.
* Copyright 2014, OmniTI Computer Consulting, Inc. All rights reserved.
*/
/* Copyright (c) 1990 Mentat Inc. */
#include <sys/types.h>
#include <sys/stream.h>
--- 19,32 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2013, 2017 by Delphix. All rights reserved.
* Copyright 2014, OmniTI Computer Consulting, Inc. All rights reserved.
+ * Copyright 2020 Joyent, Inc.
*/
/* Copyright (c) 1990 Mentat Inc. */
#include <sys/types.h>
#include <sys/stream.h>
*** 1017,1030 ****
cv_signal(&tcp->tcp_closecv);
mutex_exit(&tcp->tcp_closelock);
/* If we have an upper handle (socket), release it */
if (IPCL_IS_NONSTR(connp)) {
! ASSERT(connp->conn_upper_handle != NULL);
! (*connp->conn_upcalls->su_closed)(connp->conn_upper_handle);
connp->conn_upper_handle = NULL;
connp->conn_upcalls = NULL;
}
}
void
tcp_close_common(conn_t *connp, int flags)
--- 1017,1043 ----
cv_signal(&tcp->tcp_closecv);
mutex_exit(&tcp->tcp_closelock);
/* If we have an upper handle (socket), release it */
if (IPCL_IS_NONSTR(connp)) {
! sock_upcalls_t *upcalls = connp->conn_upcalls;
! sock_upper_handle_t handle = connp->conn_upper_handle;
!
! ASSERT(upcalls != NULL);
! ASSERT(upcalls->su_closed != NULL);
! ASSERT(handle != NULL);
! /*
! * Set these to NULL first because closed() will free upper
! * structures. Acquire conn_lock because an external caller
! * like conn_get_socket_info() will upcall if these are
! * non-NULL.
! */
! mutex_enter(&connp->conn_lock);
connp->conn_upper_handle = NULL;
connp->conn_upcalls = NULL;
+ mutex_exit(&connp->conn_lock);
+ upcalls->su_closed(handle);
}
}
void
tcp_close_common(conn_t *connp, int flags)
*** 1419,1435 ****
* handle, release it. As a result of fallback we might also see
* STREAMS based conns with upper handles, in which case there is
* nothing to do other than clearing the field.
*/
if (connp->conn_upper_handle != NULL) {
if (IPCL_IS_NONSTR(connp)) {
! (*connp->conn_upcalls->su_closed)(
! connp->conn_upper_handle);
tcp->tcp_detached = B_TRUE;
}
- connp->conn_upper_handle = NULL;
- connp->conn_upcalls = NULL;
}
}
/*
* tcp_get_conn/tcp_free_conn
--- 1432,1461 ----
* handle, release it. As a result of fallback we might also see
* STREAMS based conns with upper handles, in which case there is
* nothing to do other than clearing the field.
*/
if (connp->conn_upper_handle != NULL) {
+ sock_upcalls_t *upcalls = connp->conn_upcalls;
+ sock_upper_handle_t handle = connp->conn_upper_handle;
+
+ /*
+ * Set these to NULL first because closed() will free upper
+ * structures. Acquire conn_lock because an external caller
+ * like conn_get_socket_info() will upcall if these are
+ * non-NULL.
+ */
+ mutex_enter(&connp->conn_lock);
+ connp->conn_upper_handle = NULL;
+ connp->conn_upcalls = NULL;
+ mutex_exit(&connp->conn_lock);
if (IPCL_IS_NONSTR(connp)) {
! ASSERT(upcalls != NULL);
! ASSERT(upcalls->su_closed != NULL);
! ASSERT(handle != NULL);
! upcalls->su_closed(handle);
tcp->tcp_detached = B_TRUE;
}
}
}
/*
* tcp_get_conn/tcp_free_conn