89 lines
2.8 KiB
Diff
89 lines
2.8 KiB
Diff
From cf5a4c1792a25e0eed4627640d7db0ab1eb949e3 Mon Sep 17 00:00:00 2001
|
|
From: Wouter Verhelst <w@uter.be>
|
|
Date: Thu, 27 Apr 2023 15:35:40 +0200
|
|
Subject: [PATCH 1/1] nbd-server: do not straddle uses of GThreadPool across a
|
|
fork()
|
|
|
|
We created the thread pool at the main initialization, before forking
|
|
off a child. This used to work just fine, but as of GLib 2.76, this no
|
|
longer works due to changes internal to the implementation of
|
|
GThreadPool.
|
|
|
|
Since we don't need to use the thread pool before the fork() call
|
|
anyway, stop trying to do so and avoid the problem altogether.
|
|
|
|
Closes: gh-146
|
|
---
|
|
nbd-server.c | 18 ++++++------------
|
|
1 file changed, 6 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/nbd-server.c b/nbd-server.c
|
|
index fe97ca7..aec2b28 100644
|
|
--- a/nbd-server.c
|
|
+++ b/nbd-server.c
|
|
@@ -200,7 +200,7 @@ char default_authname[] = SYSCONFDIR "/nbd-server/allow"; /**< default name of a
|
|
#include <nbdsrv.h>
|
|
|
|
/* Our thread pool */
|
|
-GThreadPool *tpool;
|
|
+GThreadPool *tpool = NULL;
|
|
|
|
/* A work package for the thread pool functions */
|
|
struct work_package {
|
|
@@ -2895,7 +2895,6 @@ static int mainloop_threaded(CLIENT* client) {
|
|
req->type = ntohl(req->type);
|
|
req->len = ntohl(req->len);
|
|
|
|
-
|
|
if(req->magic != htonl(NBD_REQUEST_MAGIC))
|
|
err("Protocol error: not enough magic.");
|
|
|
|
@@ -2934,9 +2933,7 @@ void destroy_pid_t(gpointer data) {
|
|
g_free(data);
|
|
}
|
|
|
|
-static pid_t
|
|
-spawn_child(int* socket)
|
|
-{
|
|
+static pid_t spawn_child(int* socket) {
|
|
pid_t pid;
|
|
sigset_t newset;
|
|
sigset_t oldset;
|
|
@@ -3019,6 +3016,7 @@ handle_modern_connection(GArray *const servers, const int sock, struct generic_c
|
|
}
|
|
/* Child just continues. */
|
|
}
|
|
+ tpool = g_thread_pool_new(handle_request, NULL, genconf->threads, FALSE, NULL);
|
|
|
|
sock_flags_old = fcntl(net, F_GETFL, 0);
|
|
if (sock_flags_old == -1) {
|
|
@@ -3151,11 +3149,11 @@ static int append_new_servers(GArray *const servers, struct generic_conf *gencon
|
|
int retval = -1;
|
|
|
|
new_servers = parse_cfile(config_file_pos, genconf, true, gerror);
|
|
- g_thread_pool_set_max_threads(tpool, genconf->threads, NULL);
|
|
- if (!new_servers)
|
|
+ if(tpool) g_thread_pool_set_max_threads(tpool, genconf->threads, NULL);
|
|
+ if(!new_servers)
|
|
goto out;
|
|
|
|
- for (i = 0; i < new_servers->len; ++i) {
|
|
+ for(i = 0; i < new_servers->len; ++i) {
|
|
SERVER *new_server = g_array_index(new_servers, SERVER*, i);
|
|
|
|
if (new_server->servename
|
|
@@ -3701,10 +3699,6 @@ int main(int argc, char *argv[]) {
|
|
}
|
|
if (!dontfork)
|
|
daemonize();
|
|
-#if HAVE_OLD_GLIB
|
|
- g_thread_init(NULL);
|
|
-#endif
|
|
- tpool = g_thread_pool_new(handle_request, NULL, genconf.threads, FALSE, NULL);
|
|
|
|
setup_servers(servers, genconf.modernaddr, genconf.modernport,
|
|
genconf.unixsock, genconf.flags);
|
|
--
|
|
2.40.1
|
|
|