You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.9 KiB
52 lines
1.9 KiB
From 7131b76b1ef9382396cdc9dc1a23999d94bb79f8 Mon Sep 17 00:00:00 2001 |
|
From: Michal Sekletar <msekleta@redhat.com> |
|
Date: Mon, 30 May 2022 11:55:41 +0200 |
|
Subject: [PATCH] unit: check for mount rate limiting before checking active |
|
state |
|
|
|
Having this check as part of mount_can_start() is too late because |
|
UNIT(u)->can_start() virtual method is called after checking the active |
|
state of unit in unit_start(). |
|
|
|
We need to hold off running mount start jobs when /p/s/mountinfo monitor |
|
is rate limited even when given mount unit is already active. |
|
|
|
Fixes #20329 |
|
|
|
(cherry picked from commit b161bc394b2cc8b271dda9208e310cc2af0cc29d) |
|
|
|
Related: #2087652 |
|
--- |
|
src/core/mount.c | 3 --- |
|
src/core/unit.c | 4 ++++ |
|
2 files changed, 4 insertions(+), 3 deletions(-) |
|
|
|
diff --git a/src/core/mount.c b/src/core/mount.c |
|
index d63884e47e..8011389bcc 100644 |
|
--- a/src/core/mount.c |
|
+++ b/src/core/mount.c |
|
@@ -2169,9 +2169,6 @@ static int mount_can_start(Unit *u) { |
|
|
|
assert(m); |
|
|
|
- if (sd_event_source_is_ratelimited(u->manager->mount_event_source)) |
|
- return -EAGAIN; |
|
- |
|
r = unit_test_start_limit(u); |
|
if (r < 0) { |
|
mount_enter_dead(m, MOUNT_FAILURE_START_LIMIT_HIT); |
|
diff --git a/src/core/unit.c b/src/core/unit.c |
|
index 6eaa553255..569f712e85 100644 |
|
--- a/src/core/unit.c |
|
+++ b/src/core/unit.c |
|
@@ -1848,6 +1848,10 @@ int unit_start(Unit *u) { |
|
|
|
assert(u); |
|
|
|
+ /* Let's hold off running start jobs for mount units when /proc/self/mountinfo monitor is rate limited. */ |
|
+ if (u->type == UNIT_MOUNT && sd_event_source_is_ratelimited(u->manager->mount_event_source)) |
|
+ return -EAGAIN; |
|
+ |
|
/* If this is already started, then this will succeed. Note that this will even succeed if this unit |
|
* is not startable by the user. This is relied on to detect when we need to wait for units and when |
|
* waiting is finished. */
|
|
|