]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: use destroy callback to unref netdev attached to event source
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 3 Nov 2018 16:59:46 +0000 (01:59 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 5 Nov 2018 04:19:02 +0000 (13:19 +0900)
src/network/netdev/bridge.c
src/network/netdev/geneve.c
src/network/netdev/netdev.c
src/network/netdev/netdev.h
src/network/netdev/wireguard.c
src/network/netdev/wireguard.h

index 5a462f83764002e11abe3c1fdcea0531b82ea6b7..cb00780b8a08b85133408d3530f5abd04b925400 100644 (file)
@@ -130,7 +130,7 @@ static int netdev_bridge_post_create(NetDev *netdev, Link *link, sd_netlink_mess
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_INFO_DATA attribute: %m");
 
         r = sd_netlink_call_async(netdev->manager->rtnl, NULL, req, netdev_bridge_set_handler,
-                                  netdev_netlink_destroy_callback, netdev, 0, __func__);
+                                  netdev_destroy_callback, netdev, 0, __func__);
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
 
index e407a8fc5c07b9a36d51722b28a0bda54beafd6d..1742e399b8953cf7c691b2595e41e19256276e9f 100644 (file)
@@ -137,7 +137,7 @@ static int netdev_geneve_create(NetDev *netdev) {
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
 
         r = sd_netlink_call_async(netdev->manager->rtnl, NULL, m, geneve_netdev_create_handler,
-                                  netdev_netlink_destroy_callback, netdev, 0, __func__);
+                                  netdev_destroy_callback, netdev, 0, __func__);
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
 
index 06709679a03af7065185d01eea938d08e0e4f5fb..52b40dd68e296682fee8f3a7778b28484c97aa7c 100644 (file)
@@ -155,7 +155,7 @@ static NetDev *netdev_free(NetDev *netdev) {
 
 DEFINE_TRIVIAL_REF_UNREF_FUNC(NetDev, netdev, netdev_free);
 
-void netdev_netlink_destroy_callback(void *userdata) {
+void netdev_destroy_callback(void *userdata) {
         NetDev *netdev = userdata;
 
         assert(userdata);
@@ -550,7 +550,7 @@ static int netdev_create(NetDev *netdev, Link *link,
                         link_ref(link);
                 } else {
                         r = sd_netlink_call_async(netdev->manager->rtnl, NULL, m, netdev_create_handler,
-                                                  netdev_netlink_destroy_callback, netdev, 0, __func__);
+                                                  netdev_destroy_callback, netdev, 0, __func__);
                         if (r < 0)
                                 return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
 
index 2c1a59f2c479c6a8a59cecfd37795243e1457048..8c884bb124a44ccbab9d781420b4512dfec96d5c 100644 (file)
@@ -150,7 +150,7 @@ void netdev_drop(NetDev *netdev);
 
 NetDev *netdev_unref(NetDev *netdev);
 NetDev *netdev_ref(NetDev *netdev);
-void netdev_netlink_destroy_callback(void *userdata);
+void netdev_destroy_callback(void *userdata);
 DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
 
 int netdev_get(Manager *manager, const char *name, NetDev **ret);
index de685157efde81f1d39b90ec122b319818f96dba..2f4e7bdd9173e8f472cd7761a1b358768bdb992b 100644 (file)
@@ -222,8 +222,11 @@ static int on_resolve_retry(sd_event_source *s, usec_t usec, void *userdata) {
         w = WIREGUARD(netdev);
         assert(w);
 
-        w->resolve_retry_event_source = sd_event_source_unref(w->resolve_retry_event_source);
+        if (!netdev->manager)
+                /* The netdev is detached. */
+                return 0;
 
+        assert(!w->unresolved_endpoints);
         w->unresolved_endpoints = TAKE_PTR(w->failed_endpoints);
 
         resolve_endpoints(netdev);
@@ -279,16 +282,29 @@ static int wireguard_resolve_handler(sd_resolve_query *q,
 
         set_wireguard_interface(netdev);
         if (w->failed_endpoints) {
+                _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
+
                 w->n_retries++;
                 r = sd_event_add_time(netdev->manager->event,
-                                      &w->resolve_retry_event_source,
+                                      &s,
                                       CLOCK_MONOTONIC,
                                       now(CLOCK_MONOTONIC) + exponential_backoff_milliseconds(w->n_retries),
                                       0,
                                       on_resolve_retry,
                                       netdev);
-                if (r < 0)
+                if (r < 0) {
                         log_netdev_warning_errno(netdev, r, "Could not arm resolve retry handler: %m");
+                        return 0;
+                }
+
+                r = sd_event_source_set_destroy_callback(s, netdev_destroy_callback);
+                if (r < 0) {
+                        log_netdev_warning_errno(netdev, r, "Failed to set destroy callback to event source: %m");
+                        return 0;
+                }
+
+                (void) sd_event_source_set_floating(s, true);
+                netdev_ref(netdev);
         }
 
         return 0;
@@ -705,7 +721,6 @@ static void wireguard_done(NetDev *netdev) {
         assert(netdev);
         w = WIREGUARD(netdev);
         assert(!w->unresolved_endpoints);
-        w->resolve_retry_event_source = sd_event_source_unref(w->resolve_retry_event_source);
 
         while ((peer = w->peers)) {
                 LIST_REMOVE(peers, w->peers, peer);
index 7e6feb298b191042b7967b4f81cca73fb3c1af7d..361b381a0e60ed611f51b87aa92966525323a3c4 100644 (file)
@@ -58,7 +58,6 @@ struct Wireguard {
 
         LIST_HEAD(WireguardPeer, peers);
         size_t allocation_size;
-        sd_event_source *resolve_retry_event_source;
 
         LIST_HEAD(WireguardEndpoint, unresolved_endpoints);
         LIST_HEAD(WireguardEndpoint, failed_endpoints);