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.
This commit is contained in:
Lennart Poettering
2019-07-17 14:53:07 +02:00
parent a5ac2021da
commit fcd8e119c2

View File

@@ -1751,6 +1751,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_free_ Set *around = NULL, *gone = NULL;
Manager *m = userdata;
@@ -1762,28 +1785,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: %m");
} 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) {