]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
mount: retrigger run queue after ratelimit expired to run delayed mount start jobs 20953/head
authorMichal Sekletar <msekleta@redhat.com>
Mon, 4 Oct 2021 18:31:49 +0000 (20:31 +0200)
committerMichal Sekletar <msekleta@redhat.com>
Thu, 11 Nov 2021 16:04:39 +0000 (17:04 +0100)
Fixes #20329

src/core/mount.c

index 88a670dc2ae5e2f62d6d4b7056cd155c3950dd3b..3463641c6cae0628f73f05b09575e1083ac41c09 100644 (file)
@@ -1838,6 +1838,21 @@ static bool mount_is_mounted(Mount *m) {
         return UNIT(m)->perpetual || FLAGS_SET(m->proc_flags, MOUNT_PROC_IS_MOUNTED);
 }
 
+static int mount_on_ratelimit_expire(sd_event_source *s, void *userdata) {
+        Manager *m = userdata;
+        int r;
+
+        assert(m);
+
+        /* By entering ratelimited state we made all mount start jobs not runnable, now rate limit is over so let's
+         * make sure we dispatch them in the next iteration. */
+        r = sd_event_source_set_enabled(m->run_queue_event_source, SD_EVENT_ONESHOT);
+        if (r < 0)
+                log_debug_errno(r, "Failed to enable run queue event source, ignoring: %m");
+
+        return 0;
+}
+
 static void mount_enumerate(Manager *m) {
         int r;
 
@@ -1891,6 +1906,12 @@ static void mount_enumerate(Manager *m) {
                         goto fail;
                 }
 
+                r = sd_event_source_set_ratelimit_expire_callback(m->mount_event_source, mount_on_ratelimit_expire);
+                if (r < 0) {
+                         log_error_errno(r, "Failed to enable rate limit for mount events: %m");
+                         goto fail;
+                }
+
                 (void) sd_event_source_set_description(m->mount_event_source, "mount-monitor-dispatch");
         }