summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2018-07-24 10:56:34 +0200
committerStefan Metzmacher <metze@samba.org>2018-07-25 17:49:06 +0200
commit0c97226356f2ba5f01a58d361371055caf11e2a7 (patch)
treed2017285c42f119516b553d96877bf817890c985
parent2be7518ae5a3c046f5fca04ecc83f9f7044eac74 (diff)
downloadsamba-0c97226356f2ba5f01a58d361371055caf11e2a7.tar.gz
smbd: introduce sconn->sync_thread_pool
This just simulates a threadpool, but executes the job functions inline (blocking) in the main thread. This will be used to work arround some OS limitations, e.g. if per thread credentials or per thread working directory are not supported. Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
-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) {