diff options
author | Michal Sekletar <msekleta@redhat.com> | 2021-10-04 20:31:49 +0200 |
---|---|---|
committer | Michal Sekletar <msekleta@redhat.com> | 2021-11-11 17:04:39 +0100 |
commit | edc027b4f1cfaa49e8ecdde763eb8c623402d464 (patch) | |
tree | 146880b9494a99789ea28b277b7763ed98018a9e | |
parent | a7c93dfe91e88a5a561341c523a45c7f8d71a588 (diff) | |
download | systemd-edc027b4f1cfaa49e8ecdde763eb8c623402d464.tar.gz |
mount: retrigger run queue after ratelimit expired to run delayed mount start jobs
Fixes #20329
-rw-r--r-- | src/core/mount.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/core/mount.c b/src/core/mount.c index 88a670dc2a..3463641c6c 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -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"); } |