parent
48041d53f8
commit
a2461574d6
|
@ -1,64 +0,0 @@
|
|||
From b13268dc09eed68426c2e68a402c96b93f8b0fff Mon Sep 17 00:00:00 2001
|
||||
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
||||
Date: Mon, 12 Sep 2022 04:57:17 +0900
|
||||
Subject: [PATCH] test-mountpoint-util: support running on a mount namespace
|
||||
with another mount on /proc
|
||||
|
||||
Fixes #11505.
|
||||
---
|
||||
src/test/test-mountpoint-util.c | 30 +++++++++++++++++++++---------
|
||||
1 file changed, 21 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/test/test-mountpoint-util.c b/src/test/test-mountpoint-util.c
|
||||
index 92eed0be62..391e1c97ba 100644
|
||||
--- a/src/test/test-mountpoint-util.c
|
||||
+++ b/src/test/test-mountpoint-util.c
|
||||
@@ -83,24 +83,36 @@ TEST(mnt_id) {
|
||||
|
||||
HASHMAP_FOREACH_KEY(p, k, h) {
|
||||
int mnt_id = PTR_TO_INT(k), mnt_id2;
|
||||
+ const char *q;
|
||||
|
||||
r = path_get_mnt_id(p, &mnt_id2);
|
||||
if (r < 0) {
|
||||
- log_debug_errno(r, "Failed to get the mnt id of %s: %m\n", p);
|
||||
+ log_debug_errno(r, "Failed to get the mnt id of %s: %m", p);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mnt_id == mnt_id2) {
|
||||
- log_debug("mnt ids of %s is %i\n", p, mnt_id);
|
||||
+ log_debug("mnt ids of %s is %i.", p, mnt_id);
|
||||
continue;
|
||||
} else
|
||||
- log_debug("mnt ids of %s are %i, %i\n", p, mnt_id, mnt_id2);
|
||||
-
|
||||
- /* The ids don't match? If so, then there are two mounts on the same path, let's check if
|
||||
- * that's really the case */
|
||||
- char *t = hashmap_get(h, INT_TO_PTR(mnt_id2));
|
||||
- log_debug("the other path for mnt id %i is %s\n", mnt_id2, t);
|
||||
- assert_se(path_equal(p, t));
|
||||
+ log_debug("mnt ids of %s are %i (from /proc/self/mountinfo), %i (from path_get_mnt_id()).", p, mnt_id, mnt_id2);
|
||||
+
|
||||
+ /* The ids don't match? This can easily happen e.g. running with "unshare --mount-proc".
|
||||
+ * See #11505. */
|
||||
+ assert_se(q = hashmap_get(h, INT_TO_PTR(mnt_id2)));
|
||||
+
|
||||
+ assert_se((r = path_is_mount_point(p, NULL, 0)) >= 0);
|
||||
+ if (r == 0) {
|
||||
+ /* If the path is not a mount point anymore, then it must be a sub directory of
|
||||
+ * the path corresponds to mnt_id2. */
|
||||
+ log_debug("The path %s for mnt id %i is not a mount point.", p, mnt_id2);
|
||||
+ assert_se(!isempty(path_startswith(p, q)));
|
||||
+ } else {
|
||||
+ /* If the path is still a mount point, then it must be equivalent to the path
|
||||
+ * corresponds to mnt_id2 */
|
||||
+ log_debug("There are multiple mounts on the same path %s.", p);
|
||||
+ assert_se(path_equal(p, q));
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.37.2
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
From 1f83244641f13a9cb28fdac7e3c17c5446242dfb Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Fri, 14 Oct 2022 15:02:20 +0200
|
||||
Subject: [PATCH] manager: allow transient units to have drop-ins
|
||||
|
||||
In https://github.com/containers/podman/issues/16107, starting of a transient
|
||||
slice unit fails because there's a "global" drop-in
|
||||
/usr/lib/systemd/user/slice.d/10-oomd-per-slice-defaults.conf (provided by
|
||||
systemd-oomd-defaults package to install some default oomd policy). This means
|
||||
that the unit_is_pristine() check fails and starting of the unit is forbidden.
|
||||
|
||||
It seems pretty clear to me that dropins at any other level then the unit
|
||||
should be ignored in this check: we now have multiple layers of drop-ins
|
||||
(for each level of the cgroup path, and also "global" ones for a specific
|
||||
unit type). If we install a "global" drop-in, we wouldn't be able to start
|
||||
any transient units of that type, which seems undesired.
|
||||
|
||||
In principle we could reject dropins at the unit level, but I don't think that
|
||||
is useful. The whole reason for drop-ins is that they are "add ons", and there
|
||||
isn't any particular reason to disallow them for transient units. It would also
|
||||
make things harder to implement and describe: one place for drop-ins is good,
|
||||
but another is bad. (And as a corner case: for instanciated units, a drop-in
|
||||
in the template would be acceptable, but a instance-specific drop-in bad?)
|
||||
|
||||
Thus, $subject.
|
||||
|
||||
While at it, adjust the message. All the conditions in unit_is_pristine()
|
||||
essentially mean that it wasn't loaded (e.g. it might be in an error state),
|
||||
and that it doesn't have a fragment path (now that drop-ins are acceptable).
|
||||
If there's a job for it, it necessarilly must have been loaded. If it is
|
||||
merged into another unit, it also was loaded and found to be an alias.
|
||||
Based on the discussion in the bugs, it seems that the current message
|
||||
is far from obvious ;)
|
||||
|
||||
Fixes https://github.com/containers/podman/issues/16107,
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=2133792.
|
||||
---
|
||||
src/core/dbus-manager.c | 2 +-
|
||||
src/core/unit.c | 14 ++++++++------
|
||||
2 files changed, 9 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
|
||||
index 73f739b12dcf..20156c58f59f 100644
|
||||
--- a/src/core/dbus-manager.c
|
||||
+++ b/src/core/dbus-manager.c
|
||||
@@ -957,7 +957,7 @@ static int transient_unit_from_message(
|
||||
|
||||
if (!unit_is_pristine(u))
|
||||
return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS,
|
||||
- "Unit %s already exists.", name);
|
||||
+ "Unit %s was already loaded or has a fragment file.", name);
|
||||
|
||||
/* OK, the unit failed to load and is unreferenced, now let's
|
||||
* fill in the transient data instead */
|
||||
diff --git a/src/core/unit.c b/src/core/unit.c
|
||||
index 5016114cb470..d0f71886132f 100644
|
||||
--- a/src/core/unit.c
|
||||
+++ b/src/core/unit.c
|
||||
@@ -4844,16 +4844,18 @@ int unit_fail_if_noncanonical(Unit *u, const char* where) {
|
||||
bool unit_is_pristine(Unit *u) {
|
||||
assert(u);
|
||||
|
||||
- /* Check if the unit already exists or is already around,
|
||||
- * in a number of different ways. Note that to cater for unit
|
||||
- * types such as slice, we are generally fine with units that
|
||||
- * are marked UNIT_LOADED even though nothing was actually
|
||||
- * loaded, as those unit types don't require a file on disk. */
|
||||
+ /* Check if the unit already exists or is already around, in a number of different ways. Note that to
|
||||
+ * cater for unit types such as slice, we are generally fine with units that are marked UNIT_LOADED
|
||||
+ * even though nothing was actually loaded, as those unit types don't require a file on disk.
|
||||
+ *
|
||||
+ * Note that we don't check for drop-ins here, because we allow drop-ins for transient units
|
||||
+ * identically to non-transient units, both unit-specific and hierarchical. E.g. for a-b-c.service:
|
||||
+ * service.d/….conf, a-.service.d/….conf, a-b-.service.d/….conf, a-b-c.service.d/….conf.
|
||||
+ */
|
||||
|
||||
return IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) &&
|
||||
!u->fragment_path &&
|
||||
!u->source_path &&
|
||||
- strv_isempty(u->dropin_paths) &&
|
||||
!u->job &&
|
||||
!u->merged_into;
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
From b146a7345b69de16e88347acadb3783ffeeaad9d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||||
Date: Fri, 14 Oct 2022 14:40:24 +0200
|
||||
Subject: [PATCH] manager: reformat boolean expression in unit_is_pristine()
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Not not IN_SET(…) is just too much for my poor brain. Let's invert
|
||||
the expression to make it easier to undertand.
|
||||
---
|
||||
src/core/unit.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/core/unit.c b/src/core/unit.c
|
||||
index d6bea2080f08..5016114cb470 100644
|
||||
--- a/src/core/unit.c
|
||||
+++ b/src/core/unit.c
|
||||
@@ -4850,12 +4850,12 @@ bool unit_is_pristine(Unit *u) {
|
||||
* are marked UNIT_LOADED even though nothing was actually
|
||||
* loaded, as those unit types don't require a file on disk. */
|
||||
|
||||
- return !(!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
|
||||
- u->fragment_path ||
|
||||
- u->source_path ||
|
||||
- !strv_isempty(u->dropin_paths) ||
|
||||
- u->job ||
|
||||
- u->merged_into);
|
||||
+ return IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) &&
|
||||
+ !u->fragment_path &&
|
||||
+ !u->source_path &&
|
||||
+ strv_isempty(u->dropin_paths) &&
|
||||
+ !u->job &&
|
||||
+ !u->merged_into;
|
||||
}
|
||||
|
||||
pid_t unit_control_pid(Unit *u) {
|
|
@ -30,12 +30,12 @@
|
|||
Name: systemd
|
||||
Url: https://www.freedesktop.org/wiki/Software/systemd
|
||||
%if %{without inplace}
|
||||
Version: 251.7
|
||||
Version: 251.8
|
||||
%else
|
||||
# determine the build information from local checkout
|
||||
Version: %(tools/meson-vcs-tag.sh . error | sed -r 's/-([0-9])/.^\1/; s/-g/_g/')
|
||||
%endif
|
||||
Release: %autorelease -b 28
|
||||
Release: %autorelease
|
||||
|
||||
# For a breakdown of the licensing, see README
|
||||
License: LGPLv2+ and MIT and GPLv2+
|
||||
|
@ -89,11 +89,6 @@ GIT_DIR=../../src/systemd/.git git diffab -M v233..master@{2017-06-15} -- hwdb/[
|
|||
# than in the next section. Packit CI will drop any patches in this range before
|
||||
# applying upstream pull requests.
|
||||
|
||||
# PR https://github.com/systemd/systemd/pull/24639
|
||||
Patch0002: 0002-test-mountpoint-util-support-running-on-a-mount-name.patch
|
||||
|
||||
Patch0003: https://github.com/systemd/systemd/pull/25004/commits/b146a7345b69de16e88347acadb3783ffeeaad9d.patch
|
||||
Patch0004: https://github.com/systemd/systemd/pull/25004/commits/1f83244641f13a9cb28fdac7e3c17c5446242dfb.patch
|
||||
|
||||
# Those are downstream-only patches, but we don't want them in packit builds:
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1738828
|
||||
|
|
Loading…
Reference in New Issue