diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index b162d21aa0..51f8b0cc74 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -429,24 +429,12 @@ static int manager_connect_rtnl(Manager *m, int fd) { return manager_setup_rtnl_filter(m); } -static int manager_dirty_handler(sd_event_source *s, void *userdata) { - Manager *m = ASSERT_PTR(userdata); - Link *link; - int r; +static int manager_post_handler(sd_event_source *s, void *userdata) { + Manager *manager = ASSERT_PTR(userdata); - if (m->dirty) { - r = manager_save(m); - if (r < 0) - log_warning_errno(r, "Failed to update state file %s, ignoring: %m", m->state_file); - } - - SET_FOREACH(link, m->dirty_links) { - r = link_save_and_clean(link); - if (r < 0) - log_link_warning_errno(link, r, "Failed to update link state file %s, ignoring: %m", link->state_file); - } - - return 1; + (void) manager_process_requests(manager); + (void) manager_clean_all(manager); + return 0; } static int signal_terminate_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) { @@ -522,11 +510,7 @@ int manager_setup(Manager *m) { if (r < 0) log_debug_errno(r, "Failed allocate memory pressure event source, ignoring: %m"); - r = sd_event_add_post(m->event, NULL, manager_dirty_handler, m); - if (r < 0) - return r; - - r = sd_event_add_post(m->event, NULL, manager_process_requests, m); + r = sd_event_add_post(m->event, NULL, manager_post_handler, m); if (r < 0) return r; diff --git a/src/network/networkd-queue.c b/src/network/networkd-queue.c index a88418e28e..91e874c6fa 100644 --- a/src/network/networkd-queue.c +++ b/src/network/networkd-queue.c @@ -210,10 +210,11 @@ int link_queue_request_full( process, counter, netlink_handler, ret); } -int manager_process_requests(sd_event_source *s, void *userdata) { - Manager *manager = ASSERT_PTR(userdata); +int manager_process_requests(Manager *manager) { int r; + assert(manager); + for (;;) { bool processed = false; Request *req; diff --git a/src/network/networkd-queue.h b/src/network/networkd-queue.h index d6f5de421e..21fa7d9453 100644 --- a/src/network/networkd-queue.h +++ b/src/network/networkd-queue.h @@ -1,7 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include "sd-event.h" #include "sd-netlink.h" #include "alloc-util.h" @@ -136,7 +135,7 @@ static inline int link_queue_request( ret); \ }) -int manager_process_requests(sd_event_source *s, void *userdata); +int manager_process_requests(Manager *manager); int request_call_netlink_async(sd_netlink *nl, sd_netlink_message *m, Request *req); const char* request_type_to_string(RequestType t) _const_; diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index 3a95ba8d8b..9f0e365c22 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -861,3 +861,26 @@ int link_save_and_clean_full(Link *link, bool also_save_manager) { link_clean(link); return k; } + +int manager_clean_all(Manager *manager) { + int r, ret = 0; + + assert(manager); + + if (manager->dirty) { + r = manager_save(manager); + if (r < 0) + log_warning_errno(r, "Failed to update state file %s, ignoring: %m", manager->state_file); + RET_GATHER(ret, r); + } + + Link *link; + SET_FOREACH(link, manager->dirty_links) { + r = link_save_and_clean(link); + if (r < 0) + log_link_warning_errno(link, r, "Failed to update link state file %s, ignoring: %m", link->state_file); + RET_GATHER(ret, r); + } + + return ret; +} diff --git a/src/network/networkd-state-file.h b/src/network/networkd-state-file.h index 684f0d154e..7efd1578da 100644 --- a/src/network/networkd-state-file.h +++ b/src/network/networkd-state-file.h @@ -12,3 +12,4 @@ static inline int link_save_and_clean(Link *link) { } int manager_save(Manager *m); +int manager_clean_all(Manager *manager);