richardphibel / rpms / systemd

Forked from rpms/systemd 2 years ago
Clone
984f77
From 4dbe6568d5bcc082b13f3ef4d323d1669f16095c Mon Sep 17 00:00:00 2001
984f77
From: Michal Sekletar <msekleta@redhat.com>
984f77
Date: Mon, 30 May 2022 11:55:41 +0200
984f77
Subject: [PATCH] unit: check for mount rate limiting before checking active
984f77
 state
984f77
984f77
Having this check as part of mount_can_start() is too late because
984f77
UNIT(u)->can_start() virtual method is called after checking the active
984f77
state of unit in unit_start().
984f77
984f77
We need to hold off running mount start jobs when /p/s/mountinfo monitor
984f77
is rate limited even when given mount unit is already active.
984f77
984f77
Fixes #20329
984f77
984f77
(cherry picked from commit b161bc394b2cc8b271dda9208e310cc2af0cc29d)
984f77
984f77
Resolves: #2095744
984f77
---
984f77
 src/core/mount.c | 3 ---
984f77
 src/core/unit.c  | 4 ++++
984f77
 2 files changed, 4 insertions(+), 3 deletions(-)
984f77
984f77
diff --git a/src/core/mount.c b/src/core/mount.c
984f77
index 9547cb9b29..d37b5731f8 100644
984f77
--- a/src/core/mount.c
984f77
+++ b/src/core/mount.c
984f77
@@ -1999,9 +1999,6 @@ static int mount_can_start(Unit *u) {
984f77
 
984f77
         assert(m);
984f77
 
984f77
-        if (sd_event_source_is_ratelimited(u->manager->mount_event_source))
984f77
-                return -EAGAIN;
984f77
-
984f77
         r = unit_test_start_limit(u);
984f77
         if (r < 0) {
984f77
                 mount_enter_dead(m, MOUNT_FAILURE_START_LIMIT_HIT);
984f77
diff --git a/src/core/unit.c b/src/core/unit.c
984f77
index c00d30e837..0810bf5a58 100644
984f77
--- a/src/core/unit.c
984f77
+++ b/src/core/unit.c
984f77
@@ -1729,6 +1729,10 @@ int unit_start(Unit *u) {
984f77
 
984f77
         assert(u);
984f77
 
984f77
+        /* Let's hold off running start jobs for mount units when /proc/self/mountinfo monitor is rate limited. */
984f77
+        if (u->type == UNIT_MOUNT && sd_event_source_is_ratelimited(u->manager->mount_event_source))
984f77
+                return -EAGAIN;
984f77
+
984f77
         /* If this is already started, then this will succeed. Note that this will even succeed if this unit
984f77
          * is not startable by the user. This is relied on to detect when we need to wait for units and when
984f77
          * waiting is finished. */