From e1254d0616f812d22753421bd791c4486c0a9128 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 16 Mar 2024 00:46:11 +0900 Subject: [PATCH] network/varlink: return earlier from SetPersistentStorage method if nothing changed --- src/network/networkd-manager-varlink.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/network/networkd-manager-varlink.c b/src/network/networkd-manager-varlink.c index 69c7a81339c..b1b60ac48fb 100644 --- a/src/network/networkd-manager-varlink.c +++ b/src/network/networkd-manager-varlink.c @@ -186,6 +186,7 @@ static int vl_method_set_persistent_storage(Varlink *vlink, JsonVariant *paramet if (ready) { _cleanup_close_ int fd = -EBADF; + struct stat st, st_prev; fd = open("/var/lib/systemd/network/", O_CLOEXEC | O_DIRECTORY | O_PATH); if (fd < 0) @@ -198,6 +199,18 @@ static int vl_method_set_persistent_storage(Varlink *vlink, JsonVariant *paramet log_warning("The persistent storage is on read-only filesystem."); return varlink_error(vlink, "io.systemd.Network.StorageReadOnly", NULL); } + + if (fstat(fd, &st) < 0) + return log_warning_errno(r, "Failed to stat the persistent storage: %m"); + + if (manager->persistent_storage_fd >= 0 && + fstat(manager->persistent_storage_fd, &st_prev) >= 0 && + stat_inode_same(&st, &st_prev)) + return varlink_reply(vlink, NULL); + + } else { + if (manager->persistent_storage_fd < 0) + return varlink_reply(vlink, NULL); } r = varlink_verify_polkit_async( -- 2.47.3