From 8a27100d0696d971525efcd8e59b504f56a0b6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 4 Jan 2026 15:10:42 +0100 Subject: [PATCH] shared/install: ignore aliasing failure when doing presets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In recent Fedora, preset-all fails: [ 155s] Failed to preset unit: File '/buildroot/etc/systemd/user/dbus.service' already exists and is a symlink to /usr/lib/systemd/user/dbus-broker.service [ 155s] ‣ "systemctl --root=/buildroot --global preset-all" returned non-zero exit code 1. Strictly speaking, this is an error in configuration. The presets specify that both dbus-broker.service and dbus-daemon.service shall be enabled and they both claim the 'dbus.service' alias. But this kind of error is very easy to make. Failing the preset operation is too harsh, since in most cases the system will work fine without an alias and changes in unrelated components can cause the conflict. Let's reuse the same logic that was added in ad5fdd391248432e0c105003a8a13f821bde0b8e: when enabling the unit through 'preset' or 'preset-all', print the message, but suppress the error. When enabling through 'enable', fail the operation. --- src/shared/install.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/shared/install.c b/src/shared/install.c index a22c6df2f7..d85ac2df62 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -1942,6 +1942,7 @@ int unit_file_verify_alias( static int install_info_symlink_alias( RuntimeScope scope, + UnitFileFlags file_flags, InstallInfo *info, const LookupPaths *lp, const char *config_path, @@ -1996,6 +1997,10 @@ static int install_info_symlink_alias( broken = r == 0; /* symlink target does not exist? */ r = create_symlink(lp, alias_target ?: info->path, alias_path, force || broken, changes, n_changes); + if (r == -EEXIST && FLAGS_SET(file_flags, UNIT_FILE_IGNORE_AUXILIARY_FAILURE)) + /* We cannot realize the alias because a conflicting alias exists. + * Do not propagate this as error. */ + continue; if (r != 0 && ret >= 0) ret = r; } @@ -2160,7 +2165,7 @@ static int install_info_apply( * because they might would pointing to a non-existent or wrong unit. */ return r; - r = install_info_symlink_alias(scope, info, lp, config_path, force, changes, n_changes); + r = install_info_symlink_alias(scope, file_flags, info, lp, config_path, force, changes, n_changes); q = install_info_symlink_wants(scope, file_flags, info, lp, config_path, info->wanted_by, ".wants/", changes, n_changes); if (q != 0 && r >= 0)