if (r < 0 && r != -ENOENT)
return r;
- dirs = r >= 0 ? initrd_dirs : system_dirs;
+ /* Make sure that we fall back to the system preset directories if we're operating on a root
+ * directory without initrd preset directories. This makes sure that we don't regress when
+ * using a newer systemctl to operate on a root directory with an older version of systemd
+ * installed that doesn't yet known about initrd preset directories. */
+ if (r >= 0)
+ STRV_FOREACH(d, initrd_dirs) {
+ r = chase_and_access(*d, root_dir, CHASE_PREFIX_ROOT, F_OK, /* ret_path= */ NULL);
+ if (r >= 0)
+ return conf_files_list_strv(ret, ".preset", root_dir, 0, initrd_dirs);
+ if (r != -ENOENT)
+ return r;
+ }
+
+ dirs = system_dirs;
} else if (IN_SET(scope, RUNTIME_SCOPE_GLOBAL, RUNTIME_SCOPE_USER))
dirs = user_dirs;
else