From: Lennart Poettering Date: Thu, 17 Oct 2024 07:43:37 +0000 (+0200) Subject: fdset: optionally, close remaining fds asynchronously X-Git-Tag: v257-rc1~193^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=33dd8945461f8d0ae10d11801fd517d4ea299591;p=thirdparty%2Fsystemd.git fdset: optionally, close remaining fds asynchronously --- diff --git a/src/core/bpf-restrict-ifaces.c b/src/core/bpf-restrict-ifaces.c index a39f4895f2b..af49abd677b 100644 --- a/src/core/bpf-restrict-ifaces.c +++ b/src/core/bpf-restrict-ifaces.c @@ -159,7 +159,7 @@ int bpf_restrict_ifaces_install(Unit *u) { return 0; r = restrict_ifaces_install_impl(u); - fdset_close(crt->initial_restrict_ifaces_link_fds); + fdset_close(crt->initial_restrict_ifaces_link_fds, /* async= */ false); return r; } diff --git a/src/core/bpf-socket-bind.c b/src/core/bpf-socket-bind.c index 2a1a0278d5a..8853f3eecc9 100644 --- a/src/core/bpf-socket-bind.c +++ b/src/core/bpf-socket-bind.c @@ -229,7 +229,7 @@ int bpf_socket_bind_install(Unit *u) { return 0; r = socket_bind_install_impl(u); - fdset_close(crt->initial_socket_bind_link_fds); + fdset_close(crt->initial_socket_bind_link_fds, /* async= */ false); return r; } diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 70ce4e6d796..8fc58665e4d 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -5267,7 +5267,7 @@ static int run_container( barrier_set_role(&barrier, BARRIER_PARENT); - fdset_close(fds); + fdset_close(fds, /* async= */ false); fd_inner_socket_pair[1] = safe_close(fd_inner_socket_pair[1]); fd_outer_socket_pair[1] = safe_close(fd_outer_socket_pair[1]); diff --git a/src/shared/fdset.c b/src/shared/fdset.c index cb5a69ef224..b3d3cfa784d 100644 --- a/src/shared/fdset.c +++ b/src/shared/fdset.c @@ -8,6 +8,7 @@ #include "sd-daemon.h" #include "alloc-util.h" +#include "async.h" #include "dirent-util.h" #include "fd-util.h" #include "fdset.h" @@ -51,7 +52,7 @@ int fdset_new_array(FDSet **ret, const int fds[], size_t n_fds) { return 0; } -void fdset_close(FDSet *s) { +void fdset_close(FDSet *s, bool async) { void *p; while ((p = set_steal_first(MAKE_SET(s)))) { @@ -72,12 +73,21 @@ void fdset_close(FDSet *s) { log_debug("Closing set fd %i (%s)", fd, strna(path)); } - (void) close(fd); + if (async) + (void) asynchronous_close(fd); + else + (void) close(fd); } } FDSet* fdset_free(FDSet *s) { - fdset_close(s); + fdset_close(s, /* async= */ false); + set_free(MAKE_SET(s)); + return NULL; +} + +FDSet* fdset_free_async(FDSet *s) { + fdset_close(s, /* async= */ true); set_free(MAKE_SET(s)); return NULL; } diff --git a/src/shared/fdset.h b/src/shared/fdset.h index 70a764fb4d3..3e69d32146c 100644 --- a/src/shared/fdset.h +++ b/src/shared/fdset.h @@ -11,6 +11,7 @@ typedef struct FDSet FDSet; FDSet* fdset_new(void); FDSet* fdset_free(FDSet *s); +FDSet* fdset_free_async(FDSet *s); int fdset_put(FDSet *s, int fd); int fdset_consume(FDSet *s, int fd); @@ -36,7 +37,7 @@ int fdset_iterate(FDSet *s, Iterator *i); int fdset_steal_first(FDSet *fds); -void fdset_close(FDSet *fds); +void fdset_close(FDSet *fds, bool async); #define _FDSET_FOREACH(fd, fds, i) \ for (Iterator i = ITERATOR_FIRST; ((fd) = fdset_iterate((fds), &i)) >= 0; ) @@ -45,3 +46,5 @@ void fdset_close(FDSet *fds); DEFINE_TRIVIAL_CLEANUP_FUNC(FDSet*, fdset_free); #define _cleanup_fdset_free_ _cleanup_(fdset_freep) + +DEFINE_TRIVIAL_CLEANUP_FUNC(FDSet*, fdset_free_async);