summaryrefslogtreecommitdiffstats
path: root/src/udev/udevd.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-03-12 12:57:15 +0100
committerLennart Poettering <lennart@poettering.net>2022-03-24 16:20:32 +0100
commit2d40f02ee4317233365f53c85234be3af6b000a6 (patch)
tree0f3a803d0263b645a9d294b11e3d24393c5e5b01 /src/udev/udevd.c
parentudev: only ignore ENOENT or friends which suggest the block device is not exist (diff)
downloadsystemd-2d40f02ee4317233365f53c85234be3af6b000a6.tar.xz
systemd-2d40f02ee4317233365f53c85234be3af6b000a6.zip
udev: assume there is no blocker when failed to check event dependencies
Previously, if udevd failed to resolve event dependency, the event is ignored and libudev listeners did not receive the event. This is inconsistent with the case when a worker failed to process a event, in that case, the original uevent sent by the kernel is broadcasted to listeners.
Diffstat (limited to '')
-rw-r--r--src/udev/udevd.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index f1f864a461..8c690357b8 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -951,24 +951,21 @@ static int event_queue_start(Manager *manager) {
/* do not start event if parent or child event is still running or queued */
r = event_is_blocked(event);
+ if (r > 0)
+ continue;
if (r < 0) {
sd_device_action_t a = _SD_DEVICE_ACTION_INVALID;
(void) sd_device_get_action(event->dev, &a);
log_device_warning_errno(event->dev, r,
- "Failed to check event dependency, "
- "skipping event (SEQNUM=%"PRIu64", ACTION=%s)",
+ "Failed to check dependencies for event (SEQNUM=%"PRIu64", ACTION=%s), "
+ "assuming there is no blocking event, ignoring: %m",
event->seqnum,
strna(device_action_to_string(a)));
-
- event_free(event);
- return r;
}
- if (r > 0)
- continue;
r = event_run(event);
- if (r <= 0)
+ if (r <= 0) /* 0 means there are no idle workers. Let's escape from the loop. */
return r;
}