summaryrefslogtreecommitdiff
path: root/usr/src/uts/common
diff options
context:
space:
mode:
authorGordon Ross <gwr@racktopsystems.com>2022-06-04 19:56:17 -0400
committerGordon Ross <gwr@racktopsystems.com>2022-06-09 11:00:11 -0400
commit61b20185b3a9f12c5f69672abe47b79dfb002cab (patch)
tree0e9f1db3049638a81fba669e175f0217bea076d4 /usr/src/uts/common
parent2514b110a74b7a0ce021feff362fe3c4c2352b43 (diff)
downloadillumos-joyent-61b20185b3a9f12c5f69672abe47b79dfb002cab.tar.gz
14142 kernel SMB spams log when it hits max_connections
Reviewed by: Garrett D'Amore <garrett@damore.org> Reviewed by: Albert Lee <alee@racktopsystems.com> Reviewed by: Toomas Soome <tsoome@me.com> Reviewed by: Matt Barden <mbarden@tintri.com> Approved by: Joshua M. Clulow <josh@sysmgr.org>
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_server.c45
-rw-r--r--usr/src/uts/common/smbsrv/smb_ktypes.h3
2 files changed, 41 insertions, 7 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_server.c b/usr/src/uts/common/fs/smbsrv/smb_server.c
index 2f360f03e6..9d5fec78a1 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_server.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_server.c
@@ -22,7 +22,7 @@
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017 by Delphix. All rights reserved.
* Copyright 2019 Nexenta by DDN, Inc. All rights reserved.
- * Copyright 2020 RackTop Systems, Inc.
+ * Copyright 2022 RackTop Systems, Inc.
*/
/*
@@ -2462,15 +2462,17 @@ smb_spool_add_doc(smb_tree_t *tree, smb_kspooldoc_t *sp)
static void
smb_server_create_session(smb_listener_daemon_t *ld, ksocket_t s_so)
{
+ smb_server_t *sv = ld->ld_sv;
smb_session_t *session;
- taskqid_t tqid;
smb_llist_t *sl;
- smb_server_t *sv = ld->ld_sv;
+ taskqid_t tqid;
+ clock_t now;
session = smb_session_create(s_so, ld->ld_port, sv,
ld->ld_family);
if (session == NULL) {
+ /* This should be rare (create sleeps) */
smb_soshutdown(s_so);
smb_sodestroy(s_so);
cmn_err(CE_WARN, "SMB Session: alloc failed");
@@ -2479,6 +2481,17 @@ smb_server_create_session(smb_listener_daemon_t *ld, ksocket_t s_so)
sl = &sv->sv_session_list;
smb_llist_enter(sl, RW_WRITER);
+ if (smb_llist_get_count(sl) >= sv->sv_cfg.skc_maxconnections) {
+ /*
+ * New session not in sv_session_list, so we can just
+ * delete it directly.
+ */
+ smb_llist_exit(sl);
+ DTRACE_PROBE1(maxconn, smb_session_t *, session);
+ smb_soshutdown(session->sock);
+ smb_session_delete(session);
+ goto logmaxconn;
+ }
smb_llist_insert_tail(sl, session);
smb_llist_exit(sl);
@@ -2489,13 +2502,33 @@ smb_server_create_session(smb_listener_daemon_t *ld, ksocket_t s_so)
tqid = taskq_dispatch(sv->sv_receiver_pool,
smb_server_receiver, session, TQ_NOQUEUE | TQ_SLEEP);
if (tqid == TASKQID_INVALID) {
+ /*
+ * We never entered smb_server_receiver()
+ * so need to do it's return cleanup
+ */
+ DTRACE_PROBE1(maxconn, smb_session_t *, session);
smb_session_disconnect(session);
+ smb_session_logoff(session);
smb_server_destroy_session(session);
- cmn_err(CE_WARN, "SMB Session: taskq_dispatch failed");
- return;
+ goto logmaxconn;
}
- /* handy for debugging */
+
+ /* Success */
session->s_receiver_tqid = tqid;
+ return;
+
+logmaxconn:
+ /*
+ * If we hit max_connections, log something so an admin
+ * can find out why new connections are failing, but
+ * log this no more than once a minute.
+ */
+ now = ddi_get_lbolt();
+ if (now > ld->ld_quiet) {
+ ld->ld_quiet = now + SEC_TO_TICK(60);
+ cmn_err(CE_WARN, "SMB can't create session: "
+ "Would exceed max_connections.");
+ }
}
static void
diff --git a/usr/src/uts/common/smbsrv/smb_ktypes.h b/usr/src/uts/common/smbsrv/smb_ktypes.h
index 1b596dbb9f..9d63d4c4b4 100644
--- a/usr/src/uts/common/smbsrv/smb_ktypes.h
+++ b/usr/src/uts/common/smbsrv/smb_ktypes.h
@@ -20,8 +20,8 @@
*/
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2020 RackTop Systems, Inc.
* Copyright 2020 Tintri by DDN, Inc. All rights reserved.
+ * Copyright 2022 RackTop Systems, Inc.
*/
/*
@@ -2063,6 +2063,7 @@ typedef struct {
int ld_family;
struct sockaddr_in ld_sin;
struct sockaddr_in6 ld_sin6;
+ clock_t ld_quiet;
} smb_listener_daemon_t;
#define SMB_SSETUP_CMD "authentication"