diff options
-rw-r--r-- | source3/smbd/globals.h | 1 | ||||
-rw-r--r-- | source3/smbd/msdfs.c | 12 | ||||
-rw-r--r-- | source3/smbd/process.c | 16 |
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) { |