mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-23 17:34:00 +03:00
Merge pull request #18320 from yuwata/network-reduce-trigger-network-events
network: do not trigger unnecessary network events
This commit is contained in:
commit
ea3640ac96
@ -1614,7 +1614,7 @@ int path_is_encrypted(const char *path) {
|
|||||||
return blockdev_is_encrypted(p, 10 /* safety net: maximum recursion depth */);
|
return blockdev_is_encrypted(p, 10 /* safety net: maximum recursion depth */);
|
||||||
}
|
}
|
||||||
|
|
||||||
int conservative_rename(
|
int conservative_renameat(
|
||||||
int olddirfd, const char *oldpath,
|
int olddirfd, const char *oldpath,
|
||||||
int newdirfd, const char *newpath) {
|
int newdirfd, const char *newpath) {
|
||||||
|
|
||||||
|
@ -143,4 +143,7 @@ int open_parent(const char *path, int flags, mode_t mode);
|
|||||||
|
|
||||||
int path_is_encrypted(const char *path);
|
int path_is_encrypted(const char *path);
|
||||||
|
|
||||||
int conservative_rename(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
|
int conservative_renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
|
||||||
|
static inline int conservative_rename(const char *oldpath, const char *newpath) {
|
||||||
|
return conservative_renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath);
|
||||||
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "env-file.h"
|
#include "env-file.h"
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
|
#include "fs-util.h"
|
||||||
#include "hexdecoct.h"
|
#include "hexdecoct.h"
|
||||||
#include "hostname-util.h"
|
#include "hostname-util.h"
|
||||||
#include "in-addr-util.h"
|
#include "in-addr-util.h"
|
||||||
@ -1023,10 +1024,9 @@ int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (rename(temp_path, lease_file) < 0) {
|
r = conservative_rename(temp_path, lease_file);
|
||||||
r = -errno;
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -36,8 +36,6 @@ static int dhcp4_release_old_lease(Link *link) {
|
|||||||
|
|
||||||
log_link_debug(link, "Removing old DHCPv4 address and routes.");
|
log_link_debug(link, "Removing old DHCPv4 address and routes.");
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
SET_FOREACH(route, link->dhcp_routes_old) {
|
SET_FOREACH(route, link->dhcp_routes_old) {
|
||||||
k = route_remove(route, NULL, link, NULL);
|
k = route_remove(route, NULL, link, NULL);
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
|
@ -160,8 +160,6 @@ static int dhcp6_pd_remove_old(Link *link, bool force) {
|
|||||||
|
|
||||||
log_link_debug(link, "Removing old DHCPv6 Prefix Delegation addresses and routes.");
|
log_link_debug(link, "Removing old DHCPv6 Prefix Delegation addresses and routes.");
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
SET_FOREACH(route, link->dhcp6_pd_routes_old) {
|
SET_FOREACH(route, link->dhcp6_pd_routes_old) {
|
||||||
k = route_remove(route, NULL, link, NULL);
|
k = route_remove(route, NULL, link, NULL);
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
@ -204,8 +202,6 @@ int dhcp6_pd_remove(Link *link) {
|
|||||||
|
|
||||||
log_link_debug(link, "Removing DHCPv6 Prefix Delegation addresses and routes.");
|
log_link_debug(link, "Removing DHCPv6 Prefix Delegation addresses and routes.");
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
SET_FOREACH(route, link->dhcp6_pd_routes) {
|
SET_FOREACH(route, link->dhcp6_pd_routes) {
|
||||||
k = route_remove(route, NULL, link, NULL);
|
k = route_remove(route, NULL, link, NULL);
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
@ -352,12 +348,6 @@ static int dhcp6_pd_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Lin
|
|||||||
link_enter_failed(link);
|
link_enter_failed(link);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = link_set_routes(link);
|
|
||||||
if (r < 0) {
|
|
||||||
link_enter_failed(link);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -585,8 +575,6 @@ static int dhcp6_pd_prepare(Link *link) {
|
|||||||
if (!link_dhcp6_pd_is_enabled(link))
|
if (!link_dhcp6_pd_is_enabled(link))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
link->dhcp6_pd_address_configured = false;
|
link->dhcp6_pd_address_configured = false;
|
||||||
link->dhcp6_pd_route_configured = false;
|
link->dhcp6_pd_route_configured = false;
|
||||||
link->dhcp6_pd_prefixes_assigned = true;
|
link->dhcp6_pd_prefixes_assigned = true;
|
||||||
@ -618,14 +606,8 @@ static int dhcp6_pd_finalize(Link *link) {
|
|||||||
if (link->dhcp6_pd_address_messages == 0) {
|
if (link->dhcp6_pd_address_messages == 0) {
|
||||||
if (link->dhcp6_pd_prefixes_assigned)
|
if (link->dhcp6_pd_prefixes_assigned)
|
||||||
link->dhcp6_pd_address_configured = true;
|
link->dhcp6_pd_address_configured = true;
|
||||||
} else {
|
} else
|
||||||
log_link_debug(link, "Setting DHCPv6 PD addresses");
|
log_link_debug(link, "Setting DHCPv6 PD addresses");
|
||||||
/* address_handler calls link_set_routes() and link_set_nexthop(). Before they are
|
|
||||||
* called, the related flags must be cleared. Otherwise, the link becomes configured
|
|
||||||
* state before routes are configured. */
|
|
||||||
link->static_routes_configured = false;
|
|
||||||
link->static_nexthops_configured = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (link->dhcp6_pd_route_messages == 0) {
|
if (link->dhcp6_pd_route_messages == 0) {
|
||||||
if (link->dhcp6_pd_prefixes_assigned)
|
if (link->dhcp6_pd_prefixes_assigned)
|
||||||
@ -708,8 +690,6 @@ static int dhcp6_remove_old(Link *link, bool force) {
|
|||||||
|
|
||||||
log_link_debug(link, "Removing old DHCPv6 addresses and routes.");
|
log_link_debug(link, "Removing old DHCPv6 addresses and routes.");
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
SET_FOREACH(route, link->dhcp6_routes_old) {
|
SET_FOREACH(route, link->dhcp6_routes_old) {
|
||||||
k = route_remove(route, NULL, link, NULL);
|
k = route_remove(route, NULL, link, NULL);
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
@ -744,8 +724,6 @@ static int dhcp6_remove(Link *link) {
|
|||||||
|
|
||||||
log_link_debug(link, "Removing DHCPv6 addresses and routes.");
|
log_link_debug(link, "Removing DHCPv6 addresses and routes.");
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
SET_FOREACH(route, link->dhcp6_routes) {
|
SET_FOREACH(route, link->dhcp6_routes) {
|
||||||
k = route_remove(route, NULL, link, NULL);
|
k = route_remove(route, NULL, link, NULL);
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
@ -962,12 +940,6 @@ static int dhcp6_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *
|
|||||||
link_enter_failed(link);
|
link_enter_failed(link);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = link_set_routes(link);
|
|
||||||
if (r < 0) {
|
|
||||||
link_enter_failed(link);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -1114,8 +1086,6 @@ static int dhcp6_lease_ip_acquired(sd_dhcp6_client *client, Link *link) {
|
|||||||
link->dhcp6_address_configured = false;
|
link->dhcp6_address_configured = false;
|
||||||
link->dhcp6_route_configured = false;
|
link->dhcp6_route_configured = false;
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
while ((a = set_steal_first(link->dhcp6_addresses))) {
|
while ((a = set_steal_first(link->dhcp6_addresses))) {
|
||||||
r = set_ensure_put(&link->dhcp6_addresses_old, &address_hash_ops, a);
|
r = set_ensure_put(&link->dhcp6_addresses_old, &address_hash_ops, a);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -1149,14 +1119,8 @@ static int dhcp6_lease_ip_acquired(sd_dhcp6_client *client, Link *link) {
|
|||||||
|
|
||||||
if (link->dhcp6_address_messages == 0)
|
if (link->dhcp6_address_messages == 0)
|
||||||
link->dhcp6_address_configured = true;
|
link->dhcp6_address_configured = true;
|
||||||
else {
|
else
|
||||||
log_link_debug(link, "Setting DHCPv6 addresses");
|
log_link_debug(link, "Setting DHCPv6 addresses");
|
||||||
/* address_handler calls link_set_routes() and link_set_nexthop(). Before they are
|
|
||||||
* called, the related flags must be cleared. Otherwise, the link becomes configured
|
|
||||||
* state before routes are configured. */
|
|
||||||
link->static_routes_configured = false;
|
|
||||||
link->static_nexthops_configured = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (link->dhcp6_route_messages == 0)
|
if (link->dhcp6_route_messages == 0)
|
||||||
link->dhcp6_route_configured = true;
|
link->dhcp6_route_configured = true;
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "ethtool-util.h"
|
#include "ethtool-util.h"
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
|
#include "fs-util.h"
|
||||||
#include "ipvlan.h"
|
#include "ipvlan.h"
|
||||||
#include "missing_network.h"
|
#include "missing_network.h"
|
||||||
#include "netlink-util.h"
|
#include "netlink-util.h"
|
||||||
@ -596,14 +597,13 @@ void link_set_state(Link *link, LinkState state) {
|
|||||||
link->state = state;
|
link->state = state;
|
||||||
|
|
||||||
link_send_changed(link, "AdministrativeState", NULL);
|
link_send_changed(link, "AdministrativeState", NULL);
|
||||||
|
link_dirty(link);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void link_enter_unmanaged(Link *link) {
|
static void link_enter_unmanaged(Link *link) {
|
||||||
assert(link);
|
assert(link);
|
||||||
|
|
||||||
link_set_state(link, LINK_STATE_UNMANAGED);
|
link_set_state(link, LINK_STATE_UNMANAGED);
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int link_stop_engines(Link *link, bool may_keep_dhcp) {
|
int link_stop_engines(Link *link, bool may_keep_dhcp) {
|
||||||
@ -675,8 +675,6 @@ void link_enter_failed(Link *link) {
|
|||||||
link_set_state(link, LINK_STATE_FAILED);
|
link_set_state(link, LINK_STATE_FAILED);
|
||||||
|
|
||||||
(void) link_stop_engines(link, false);
|
(void) link_stop_engines(link, false);
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int link_join_netdevs_after_configured(Link *link) {
|
static int link_join_netdevs_after_configured(Link *link) {
|
||||||
@ -717,8 +715,6 @@ static void link_enter_configured(Link *link) {
|
|||||||
link_set_state(link, LINK_STATE_CONFIGURED);
|
link_set_state(link, LINK_STATE_CONFIGURED);
|
||||||
|
|
||||||
(void) link_join_netdevs_after_configured(link);
|
(void) link_join_netdevs_after_configured(link);
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void link_check_ready(Link *link) {
|
void link_check_ready(Link *link) {
|
||||||
@ -1605,6 +1601,8 @@ static int link_put_carrier(Link *link, Link *carrier, Hashmap **h) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
link_dirty(link);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1612,7 +1610,6 @@ static int link_new_bound_by_list(Link *link) {
|
|||||||
Manager *m;
|
Manager *m;
|
||||||
Link *carrier;
|
Link *carrier;
|
||||||
int r;
|
int r;
|
||||||
bool list_updated = false;
|
|
||||||
|
|
||||||
assert(link);
|
assert(link);
|
||||||
assert(link->manager);
|
assert(link->manager);
|
||||||
@ -1630,20 +1627,13 @@ static int link_new_bound_by_list(Link *link) {
|
|||||||
r = link_put_carrier(link, carrier, &link->bound_by_links);
|
r = link_put_carrier(link, carrier, &link->bound_by_links);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
list_updated = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list_updated)
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
HASHMAP_FOREACH(carrier, link->bound_by_links) {
|
HASHMAP_FOREACH(carrier, link->bound_by_links) {
|
||||||
r = link_put_carrier(carrier, link, &carrier->bound_to_links);
|
r = link_put_carrier(carrier, link, &carrier->bound_to_links);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
link_dirty(carrier);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1653,7 +1643,6 @@ static int link_new_bound_to_list(Link *link) {
|
|||||||
Manager *m;
|
Manager *m;
|
||||||
Link *carrier;
|
Link *carrier;
|
||||||
int r;
|
int r;
|
||||||
bool list_updated = false;
|
|
||||||
|
|
||||||
assert(link);
|
assert(link);
|
||||||
assert(link->manager);
|
assert(link->manager);
|
||||||
@ -1671,20 +1660,13 @@ static int link_new_bound_to_list(Link *link) {
|
|||||||
r = link_put_carrier(link, carrier, &link->bound_to_links);
|
r = link_put_carrier(link, carrier, &link->bound_to_links);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
list_updated = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list_updated)
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
HASHMAP_FOREACH (carrier, link->bound_to_links) {
|
HASHMAP_FOREACH (carrier, link->bound_to_links) {
|
||||||
r = link_put_carrier(carrier, link, &carrier->bound_by_links);
|
r = link_put_carrier(carrier, link, &carrier->bound_by_links);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
link_dirty(carrier);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1713,23 +1695,32 @@ static int link_new_carrier_maps(Link *link) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void link_free_bound_to_list(Link *link) {
|
static void link_free_bound_to_list(Link *link) {
|
||||||
|
bool updated = false;
|
||||||
Link *bound_to;
|
Link *bound_to;
|
||||||
|
|
||||||
HASHMAP_FOREACH (bound_to, link->bound_to_links) {
|
assert(link);
|
||||||
hashmap_remove(link->bound_to_links, INT_TO_PTR(bound_to->ifindex));
|
|
||||||
|
while ((bound_to = hashmap_steal_first(link->bound_to_links))) {
|
||||||
|
updated = true;
|
||||||
|
|
||||||
if (hashmap_remove(bound_to->bound_by_links, INT_TO_PTR(link->ifindex)))
|
if (hashmap_remove(bound_to->bound_by_links, INT_TO_PTR(link->ifindex)))
|
||||||
link_dirty(bound_to);
|
link_dirty(bound_to);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updated)
|
||||||
|
link_dirty(link);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void link_free_bound_by_list(Link *link) {
|
static void link_free_bound_by_list(Link *link) {
|
||||||
|
bool updated = false;
|
||||||
Link *bound_by;
|
Link *bound_by;
|
||||||
|
|
||||||
HASHMAP_FOREACH (bound_by, link->bound_by_links) {
|
assert(link);
|
||||||
hashmap_remove(link->bound_by_links, INT_TO_PTR(bound_by->ifindex));
|
|
||||||
|
while ((bound_by = hashmap_steal_first(link->bound_by_links))) {
|
||||||
|
updated = true;
|
||||||
|
|
||||||
if (hashmap_remove(bound_by->bound_to_links, INT_TO_PTR(link->ifindex))) {
|
if (hashmap_remove(bound_by->bound_to_links, INT_TO_PTR(link->ifindex))) {
|
||||||
link_dirty(bound_by);
|
link_dirty(bound_by);
|
||||||
@ -1737,26 +1728,17 @@ static void link_free_bound_by_list(Link *link) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updated)
|
||||||
|
link_dirty(link);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void link_free_carrier_maps(Link *link) {
|
static void link_free_carrier_maps(Link *link) {
|
||||||
bool list_updated = false;
|
|
||||||
|
|
||||||
assert(link);
|
assert(link);
|
||||||
|
|
||||||
if (!hashmap_isempty(link->bound_to_links)) {
|
link_free_bound_to_list(link);
|
||||||
link_free_bound_to_list(link);
|
link_free_bound_by_list(link);
|
||||||
list_updated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hashmap_isempty(link->bound_by_links)) {
|
|
||||||
link_free_bound_by_list(link);
|
|
||||||
list_updated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list_updated)
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1943,7 +1925,6 @@ static int link_enter_join_netdev(Link *link) {
|
|||||||
|
|
||||||
link_set_state(link, LINK_STATE_CONFIGURING);
|
link_set_state(link, LINK_STATE_CONFIGURING);
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
link->enslaving = 0;
|
link->enslaving = 0;
|
||||||
|
|
||||||
if (link->network->bond) {
|
if (link->network->bond) {
|
||||||
@ -2266,9 +2247,8 @@ static int link_reconfigure_internal(Link *link, sd_netlink_message *m, bool for
|
|||||||
link_unref(set_remove(link->manager->links_requesting_uuid, link));
|
link_unref(set_remove(link->manager->links_requesting_uuid, link));
|
||||||
|
|
||||||
/* Then, apply new .network file */
|
/* Then, apply new .network file */
|
||||||
r = network_apply(network, link);
|
link->network = network_ref(network);
|
||||||
if (r < 0)
|
link_dirty(link);
|
||||||
return r;
|
|
||||||
|
|
||||||
r = link_new_carrier_maps(link);
|
r = link_new_carrier_maps(link);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -2276,7 +2256,6 @@ static int link_reconfigure_internal(Link *link, sd_netlink_message *m, bool for
|
|||||||
|
|
||||||
link_set_state(link, LINK_STATE_INITIALIZED);
|
link_set_state(link, LINK_STATE_INITIALIZED);
|
||||||
link->activated = false;
|
link->activated = false;
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
/* link_configure_duid() returns 0 if it requests product UUID. In that case,
|
/* link_configure_duid() returns 0 if it requests product UUID. In that case,
|
||||||
* link_configure() is called later asynchronously. */
|
* link_configure() is called later asynchronously. */
|
||||||
@ -2390,9 +2369,8 @@ static int link_initialized_and_synced(Link *link) {
|
|||||||
log_link_debug(link, "Ignoring DHCP server for loopback link");
|
log_link_debug(link, "Ignoring DHCP server for loopback link");
|
||||||
}
|
}
|
||||||
|
|
||||||
r = network_apply(network, link);
|
link->network = network_ref(network);
|
||||||
if (r < 0)
|
link_dirty(link);
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
r = link_new_bound_to_list(link);
|
r = link_new_bound_to_list(link);
|
||||||
@ -3198,10 +3176,9 @@ int link_save(Link *link) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (rename(temp_path, link->state_file) < 0) {
|
r = conservative_rename(temp_path, link->state_file);
|
||||||
r = -errno;
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "firewall-util.h"
|
#include "firewall-util.h"
|
||||||
|
#include "fs-util.h"
|
||||||
#include "local-addresses.h"
|
#include "local-addresses.h"
|
||||||
#include "netlink-util.h"
|
#include "netlink-util.h"
|
||||||
#include "network-internal.h"
|
#include "network-internal.h"
|
||||||
@ -709,10 +710,9 @@ static int manager_save(Manager *m) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (rename(temp_path, m->state_file) < 0) {
|
r = conservative_rename(temp_path, m->state_file);
|
||||||
r = -errno;
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
|
|
||||||
if (m->operational_state != operstate) {
|
if (m->operational_state != operstate) {
|
||||||
m->operational_state = operstate;
|
m->operational_state = operstate;
|
||||||
|
@ -118,6 +118,7 @@ static int ndisc_remove_old_one(Link *link, const struct in6_addr *router, bool
|
|||||||
NDiscDNSSL *dnssl;
|
NDiscDNSSL *dnssl;
|
||||||
NDiscRDNSS *rdnss;
|
NDiscRDNSS *rdnss;
|
||||||
int k, r = 0;
|
int k, r = 0;
|
||||||
|
bool updated = false;
|
||||||
|
|
||||||
assert(link);
|
assert(link);
|
||||||
assert(router);
|
assert(router);
|
||||||
@ -182,12 +183,19 @@ static int ndisc_remove_old_one(Link *link, const struct in6_addr *router, bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
SET_FOREACH(rdnss, link->ndisc_rdnss)
|
SET_FOREACH(rdnss, link->ndisc_rdnss)
|
||||||
if (rdnss->marked && IN6_ARE_ADDR_EQUAL(&rdnss->router, router))
|
if (rdnss->marked && IN6_ARE_ADDR_EQUAL(&rdnss->router, router)) {
|
||||||
free(set_remove(link->ndisc_rdnss, rdnss));
|
free(set_remove(link->ndisc_rdnss, rdnss));
|
||||||
|
updated = true;
|
||||||
|
}
|
||||||
|
|
||||||
SET_FOREACH(dnssl, link->ndisc_dnssl)
|
SET_FOREACH(dnssl, link->ndisc_dnssl)
|
||||||
if (dnssl->marked && IN6_ARE_ADDR_EQUAL(&dnssl->router, router))
|
if (dnssl->marked && IN6_ARE_ADDR_EQUAL(&dnssl->router, router)) {
|
||||||
free(set_remove(link->ndisc_dnssl, dnssl));
|
free(set_remove(link->ndisc_dnssl, dnssl));
|
||||||
|
updated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (updated)
|
||||||
|
link_dirty(link);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -412,12 +420,6 @@ static int ndisc_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *
|
|||||||
link_enter_failed(link);
|
link_enter_failed(link);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = link_set_routes(link);
|
|
||||||
if (r < 0) {
|
|
||||||
link_enter_failed(link);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -932,6 +934,7 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
|
|||||||
struct in6_addr router;
|
struct in6_addr router;
|
||||||
NDiscRDNSS *rdnss;
|
NDiscRDNSS *rdnss;
|
||||||
usec_t time_now;
|
usec_t time_now;
|
||||||
|
bool updated = false;
|
||||||
int n, r;
|
int n, r;
|
||||||
|
|
||||||
assert(link);
|
assert(link);
|
||||||
@ -993,8 +996,13 @@ static int ndisc_router_process_rdnss(Link *link, sd_ndisc_router *rt) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
assert(r > 0);
|
assert(r > 0);
|
||||||
|
|
||||||
|
updated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updated)
|
||||||
|
link_dirty(link);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1019,6 +1027,7 @@ static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) {
|
|||||||
uint32_t lifetime;
|
uint32_t lifetime;
|
||||||
usec_t time_now;
|
usec_t time_now;
|
||||||
NDiscDNSSL *dnssl;
|
NDiscDNSSL *dnssl;
|
||||||
|
bool updated = false;
|
||||||
char **j;
|
char **j;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
@ -1078,8 +1087,13 @@ static int ndisc_router_process_dnssl(Link *link, sd_ndisc_router *rt) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
assert(r > 0);
|
assert(r > 0);
|
||||||
|
|
||||||
|
updated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updated)
|
||||||
|
link_dirty(link);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1204,8 +1218,6 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
|
|||||||
link->ndisc_addresses_configured = false;
|
link->ndisc_addresses_configured = false;
|
||||||
link->ndisc_routes_configured = false;
|
link->ndisc_routes_configured = false;
|
||||||
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
SET_FOREACH(na, link->ndisc_addresses)
|
SET_FOREACH(na, link->ndisc_addresses)
|
||||||
if (IN6_ARE_ADDR_EQUAL(&na->router, &router.in6))
|
if (IN6_ARE_ADDR_EQUAL(&na->router, &router.in6))
|
||||||
na->marked = true;
|
na->marked = true;
|
||||||
@ -1244,16 +1256,9 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
|
|||||||
|
|
||||||
if (link->ndisc_addresses_messages == 0)
|
if (link->ndisc_addresses_messages == 0)
|
||||||
link->ndisc_addresses_configured = true;
|
link->ndisc_addresses_configured = true;
|
||||||
else {
|
else
|
||||||
log_link_debug(link, "Setting SLAAC addresses.");
|
log_link_debug(link, "Setting SLAAC addresses.");
|
||||||
|
|
||||||
/* address_handler calls link_set_routes() and link_set_nexthop(). Before they are
|
|
||||||
* called, the related flags must be cleared. Otherwise, the link becomes configured
|
|
||||||
* state before routes are configured. */
|
|
||||||
link->static_routes_configured = false;
|
|
||||||
link->static_nexthops_configured = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (link->ndisc_routes_messages == 0)
|
if (link->ndisc_routes_messages == 0)
|
||||||
link->ndisc_routes_configured = true;
|
link->ndisc_routes_configured = true;
|
||||||
else
|
else
|
||||||
@ -1340,7 +1345,6 @@ void ndisc_vacuum(Link *link) {
|
|||||||
NDiscRDNSS *r;
|
NDiscRDNSS *r;
|
||||||
NDiscDNSSL *d;
|
NDiscDNSSL *d;
|
||||||
usec_t time_now;
|
usec_t time_now;
|
||||||
bool updated = false;
|
|
||||||
|
|
||||||
assert(link);
|
assert(link);
|
||||||
|
|
||||||
@ -1349,19 +1353,12 @@ void ndisc_vacuum(Link *link) {
|
|||||||
time_now = now(clock_boottime_or_monotonic());
|
time_now = now(clock_boottime_or_monotonic());
|
||||||
|
|
||||||
SET_FOREACH(r, link->ndisc_rdnss)
|
SET_FOREACH(r, link->ndisc_rdnss)
|
||||||
if (r->valid_until < time_now) {
|
if (r->valid_until < time_now)
|
||||||
free(set_remove(link->ndisc_rdnss, r));
|
free(set_remove(link->ndisc_rdnss, r));
|
||||||
updated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
SET_FOREACH(d, link->ndisc_dnssl)
|
SET_FOREACH(d, link->ndisc_dnssl)
|
||||||
if (d->valid_until < time_now) {
|
if (d->valid_until < time_now)
|
||||||
free(set_remove(link->ndisc_dnssl, d));
|
free(set_remove(link->ndisc_dnssl, d));
|
||||||
updated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (updated)
|
|
||||||
link_dirty(link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ndisc_flush(Link *link) {
|
void ndisc_flush(Link *link) {
|
||||||
|
@ -736,21 +736,6 @@ int network_get(Manager *manager, unsigned short iftype, sd_device *device,
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
int network_apply(Network *network, Link *link) {
|
|
||||||
assert(network);
|
|
||||||
assert(link);
|
|
||||||
|
|
||||||
link->network = network_ref(network);
|
|
||||||
|
|
||||||
if (network->n_dns > 0 ||
|
|
||||||
!strv_isempty(network->ntp) ||
|
|
||||||
!ordered_set_isempty(network->search_domains) ||
|
|
||||||
!ordered_set_isempty(network->route_domains))
|
|
||||||
link_dirty(link);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool network_has_static_ipv6_configurations(Network *network) {
|
bool network_has_static_ipv6_configurations(Network *network) {
|
||||||
Address *address;
|
Address *address;
|
||||||
Route *route;
|
Route *route;
|
||||||
|
@ -329,7 +329,6 @@ int network_get(Manager *manager, unsigned short iftype, sd_device *device,
|
|||||||
const struct ether_addr *mac, const struct ether_addr *permanent_mac,
|
const struct ether_addr *mac, const struct ether_addr *permanent_mac,
|
||||||
enum nl80211_iftype wlan_iftype, const char *ssid, const struct ether_addr *bssid,
|
enum nl80211_iftype wlan_iftype, const char *ssid, const struct ether_addr *bssid,
|
||||||
Network **ret);
|
Network **ret);
|
||||||
int network_apply(Network *network, Link *link);
|
|
||||||
void network_apply_anonymize_if_set(Network *network);
|
void network_apply_anonymize_if_set(Network *network);
|
||||||
|
|
||||||
bool network_has_static_ipv6_configurations(Network *network);
|
bool network_has_static_ipv6_configurations(Network *network);
|
||||||
|
@ -360,7 +360,7 @@ int manager_write_resolv_conf(Manager *m) {
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = conservative_rename(AT_FDCWD, temp_path_stub, AT_FDCWD, PRIVATE_STUB_RESOLV_CONF);
|
r = conservative_rename(temp_path_stub, PRIVATE_STUB_RESOLV_CONF);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_error_errno(r, "Failed to move new %s into place: %m", PRIVATE_STUB_RESOLV_CONF);
|
log_error_errno(r, "Failed to move new %s into place: %m", PRIVATE_STUB_RESOLV_CONF);
|
||||||
|
|
||||||
@ -370,7 +370,7 @@ int manager_write_resolv_conf(Manager *m) {
|
|||||||
log_error_errno(r, "Failed to symlink %s: %m", PRIVATE_STUB_RESOLV_CONF);
|
log_error_errno(r, "Failed to symlink %s: %m", PRIVATE_STUB_RESOLV_CONF);
|
||||||
}
|
}
|
||||||
|
|
||||||
r = conservative_rename(AT_FDCWD, temp_path_uplink, AT_FDCWD, PRIVATE_UPLINK_RESOLV_CONF);
|
r = conservative_rename(temp_path_uplink, PRIVATE_UPLINK_RESOLV_CONF);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_error_errno(r, "Failed to move new %s into place: %m", PRIVATE_UPLINK_RESOLV_CONF);
|
log_error_errno(r, "Failed to move new %s into place: %m", PRIVATE_UPLINK_RESOLV_CONF);
|
||||||
|
|
||||||
|
@ -847,37 +847,37 @@ static void test_conservative_rename(void) {
|
|||||||
|
|
||||||
/* Check that the hardlinked "copy" is detected */
|
/* Check that the hardlinked "copy" is detected */
|
||||||
assert_se(link(p, q) >= 0);
|
assert_se(link(p, q) >= 0);
|
||||||
assert_se(conservative_rename(AT_FDCWD, q, AT_FDCWD, p) == 0);
|
assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) == 0);
|
||||||
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
||||||
|
|
||||||
/* Check that a manual copy is detected */
|
/* Check that a manual copy is detected */
|
||||||
assert_se(copy_file(p, q, 0, (mode_t) -1, 0, 0, COPY_REFLINK) >= 0);
|
assert_se(copy_file(p, q, 0, (mode_t) -1, 0, 0, COPY_REFLINK) >= 0);
|
||||||
assert_se(conservative_rename(AT_FDCWD, q, AT_FDCWD, p) == 0);
|
assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) == 0);
|
||||||
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
||||||
|
|
||||||
/* Check that a manual new writeout is also detected */
|
/* Check that a manual new writeout is also detected */
|
||||||
assert_se(write_string_file(q, "this is a test", WRITE_STRING_FILE_CREATE) >= 0);
|
assert_se(write_string_file(q, "this is a test", WRITE_STRING_FILE_CREATE) >= 0);
|
||||||
assert_se(conservative_rename(AT_FDCWD, q, AT_FDCWD, p) == 0);
|
assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) == 0);
|
||||||
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
||||||
|
|
||||||
/* Check that a minimally changed version is detected */
|
/* Check that a minimally changed version is detected */
|
||||||
assert_se(write_string_file(q, "this is a_test", WRITE_STRING_FILE_CREATE) >= 0);
|
assert_se(write_string_file(q, "this is a_test", WRITE_STRING_FILE_CREATE) >= 0);
|
||||||
assert_se(conservative_rename(AT_FDCWD, q, AT_FDCWD, p) > 0);
|
assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) > 0);
|
||||||
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
||||||
|
|
||||||
/* Check that this really is new updated version */
|
/* Check that this really is new updated version */
|
||||||
assert_se(write_string_file(q, "this is a_test", WRITE_STRING_FILE_CREATE) >= 0);
|
assert_se(write_string_file(q, "this is a_test", WRITE_STRING_FILE_CREATE) >= 0);
|
||||||
assert_se(conservative_rename(AT_FDCWD, q, AT_FDCWD, p) == 0);
|
assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) == 0);
|
||||||
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
||||||
|
|
||||||
/* Make sure we detect extended files */
|
/* Make sure we detect extended files */
|
||||||
assert_se(write_string_file(q, "this is a_testx", WRITE_STRING_FILE_CREATE) >= 0);
|
assert_se(write_string_file(q, "this is a_testx", WRITE_STRING_FILE_CREATE) >= 0);
|
||||||
assert_se(conservative_rename(AT_FDCWD, q, AT_FDCWD, p) > 0);
|
assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) > 0);
|
||||||
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
||||||
|
|
||||||
/* Make sure we detect truncated files */
|
/* Make sure we detect truncated files */
|
||||||
assert_se(write_string_file(q, "this is a_test", WRITE_STRING_FILE_CREATE) >= 0);
|
assert_se(write_string_file(q, "this is a_test", WRITE_STRING_FILE_CREATE) >= 0);
|
||||||
assert_se(conservative_rename(AT_FDCWD, q, AT_FDCWD, p) > 0);
|
assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) > 0);
|
||||||
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user