summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/smbd/globals.h1
-rw-r--r--source3/smbd/msdfs.c12
-rw-r--r--source3/smbd/process.c16
3 files changed, 28 insertions, 1 deletions
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index e75ec5408f3..19a130e64f6 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -939,6 +939,7 @@ struct smbd_server_connection {
} locks;
} smb2;
+ struct pthreadpool_tevent *sync_thread_pool;
struct pthreadpool_tevent *raw_thread_pool;
struct smbXsrv_client *client;
diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c
index c74de7acf88..bf9b3abee4a 100644
--- a/source3/smbd/msdfs.c
+++ b/source3/smbd/msdfs.c
@@ -32,6 +32,7 @@
#include "libcli/security/security.h"
#include "librpc/gen_ndr/ndr_dfsblobs.h"
#include "lib/tsocket/tsocket.h"
+#include "lib/pthreadpool/pthreadpool_tevent.h"
/**********************************************************************
Parse a DFS pathname of the form \hostname\service\reqpath
@@ -251,6 +252,7 @@ static NTSTATUS create_conn_struct_as_root(TALLOC_CTX *ctx,
const char *vfs_user;
struct smbd_server_connection *sconn;
const char *servicename = lp_const_servicename(snum);
+ int ret;
sconn = talloc_zero(ctx, struct smbd_server_connection);
if (sconn == NULL) {
@@ -274,6 +276,16 @@ static NTSTATUS create_conn_struct_as_root(TALLOC_CTX *ctx,
return NT_STATUS_NO_MEMORY;
}
+ /*
+ * We only provide sync threadpools.
+ */
+ ret = pthreadpool_tevent_init(sconn, 0, &sconn->sync_thread_pool);
+ if (ret != 0) {
+ TALLOC_FREE(sconn);
+ return NT_STATUS_NO_MEMORY;
+ }
+ sconn->raw_thread_pool = sconn->sync_thread_pool;
+
sconn->msg_ctx = msg;
conn = conn_new(sconn);
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 8e1fceab0aa..35b5f4df385 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -3907,6 +3907,7 @@ void smbd_process(struct tevent_context *ev_ctx,
const char *locaddr = NULL;
const char *remaddr = NULL;
int ret;
+ size_t max_threads;
NTSTATUS status;
struct timeval tv = timeval_current();
NTTIME now = timeval_to_nttime(&tv);
@@ -3952,7 +3953,20 @@ void smbd_process(struct tevent_context *ev_ctx,
ret = pthreadpool_tevent_init(sconn, lp_aio_max_threads(),
&sconn->raw_thread_pool);
if (ret != 0) {
- exit_server("pthreadpool_tevent_init() failed.");
+ exit_server("pthreadpool_tevent_init(raw) failed.");
+ }
+
+ max_threads = pthreadpool_tevent_max_threads(sconn->raw_thread_pool);
+ if (max_threads == 0) {
+ /*
+ * We only have a sync pool, no need to create a 2nd one.
+ */
+ sconn->sync_thread_pool = sconn->raw_thread_pool;
+ } else {
+ ret = pthreadpool_tevent_init(sconn, 0, &sconn->sync_thread_pool);
+ if (ret != 0) {
+ exit_server("pthreadpool_tevent_init(sync) failed.");
+ }
}
if (lp_server_max_protocol() >= PROTOCOL_SMB2_02) {