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.
87 lines
3.0 KiB
87 lines
3.0 KiB
From daf63a3c6c6cd241017bdf9a26c7b1caf744e69b Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Wed, 17 Jul 2019 14:53:07 +0200
|
|
Subject: [PATCH] mount: simplify /proc/self/mountinfo handler
|
|
|
|
Our IO handler is only installed for one fd, hence there's no reason to
|
|
conditionalize on it again.
|
|
|
|
Also, split out the draining into a helper function of its own.
|
|
|
|
(cherry picked from commit fcd8e119c28be19ffbc5227089cf4d3b8ba60238)
|
|
|
|
Conflicts:
|
|
src/core/mount.c
|
|
|
|
Related: #1696178
|
|
---
|
|
src/core/mount.c | 48 ++++++++++++++++++++++++++----------------------
|
|
1 file changed, 26 insertions(+), 22 deletions(-)
|
|
|
|
diff --git a/src/core/mount.c b/src/core/mount.c
|
|
index 16229d4af1..85b07375e2 100644
|
|
--- a/src/core/mount.c
|
|
+++ b/src/core/mount.c
|
|
@@ -1758,6 +1758,29 @@ fail:
|
|
mount_shutdown(m);
|
|
}
|
|
|
|
+static int drain_libmount(Manager *m) {
|
|
+ bool rescan = false;
|
|
+ int r;
|
|
+
|
|
+ assert(m);
|
|
+
|
|
+ /* Drain all events and verify that the event is valid.
|
|
+ *
|
|
+ * Note that libmount also monitors /run/mount mkdir if the directory does not exist yet. The mkdir
|
|
+ * may generate event which is irrelevant for us.
|
|
+ *
|
|
+ * error: r < 0; valid: r == 0, false positive: r == 1 */
|
|
+ do {
|
|
+ r = mnt_monitor_next_change(m->mount_monitor, NULL, NULL);
|
|
+ if (r < 0)
|
|
+ return log_error_errno(r, "Failed to drain libmount events: %m");
|
|
+ if (r == 0)
|
|
+ rescan = true;
|
|
+ } while (r == 0);
|
|
+
|
|
+ return rescan;
|
|
+}
|
|
+
|
|
static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
|
|
_cleanup_set_free_ Set *around = NULL, *gone = NULL;
|
|
Manager *m = userdata;
|
|
@@ -1769,28 +1792,9 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents,
|
|
assert(m);
|
|
assert(revents & EPOLLIN);
|
|
|
|
- if (fd == mnt_monitor_get_fd(m->mount_monitor)) {
|
|
- bool rescan = false;
|
|
-
|
|
- /* Drain all events and verify that the event is valid.
|
|
- *
|
|
- * Note that libmount also monitors /run/mount mkdir if the
|
|
- * directory does not exist yet. The mkdir may generate event
|
|
- * which is irrelevant for us.
|
|
- *
|
|
- * error: r < 0; valid: r == 0, false positive: rc == 1 */
|
|
- do {
|
|
- r = mnt_monitor_next_change(m->mount_monitor, NULL, NULL);
|
|
- if (r == 0)
|
|
- rescan = true;
|
|
- else if (r < 0)
|
|
- return log_error_errno(r, "Failed to drain libmount events");
|
|
- } while (r == 0);
|
|
-
|
|
- log_debug("libmount event [rescan: %s]", yes_no(rescan));
|
|
- if (!rescan)
|
|
- return 0;
|
|
- }
|
|
+ r = drain_libmount(m);
|
|
+ if (r <= 0)
|
|
+ return r;
|
|
|
|
r = mount_load_proc_self_mountinfo(m, true);
|
|
if (r < 0) {
|