Merge pull request #14160 from mwilck/fix-shutdown-hang

Fix shutdown hang caused by recent udev change
This commit is contained in:
Yu Watanabe 2019-11-27 19:16:12 +09:00 committed by GitHub
commit 403e4b4728
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -293,8 +293,6 @@ static void manager_free(Manager *manager) {
if (!manager) if (!manager)
return; return;
manager->monitor = sd_device_monitor_unref(manager->monitor);
udev_builtin_exit(); udev_builtin_exit();
if (manager->pid == getpid_cached()) if (manager->pid == getpid_cached())
@ -791,6 +789,8 @@ static void manager_exit(Manager *manager) {
manager->inotify_event = sd_event_source_unref(manager->inotify_event); manager->inotify_event = sd_event_source_unref(manager->inotify_event);
manager->fd_inotify = safe_close(manager->fd_inotify); manager->fd_inotify = safe_close(manager->fd_inotify);
manager->monitor = sd_device_monitor_unref(manager->monitor);
/* discard queued events and kill workers */ /* discard queued events and kill workers */
event_queue_cleanup(manager, EVENT_QUEUED); event_queue_cleanup(manager, EVENT_QUEUED);
manager_kill_workers(manager); manager_kill_workers(manager);
@ -1311,10 +1311,12 @@ static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, voi
device_delete_db(worker->event->dev); device_delete_db(worker->event->dev);
device_tag_index(worker->event->dev, NULL, false); device_tag_index(worker->event->dev, NULL, false);
/* forward kernel event without amending it */ if (manager->monitor) {
r = device_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel); /* forward kernel event without amending it */
if (r < 0) r = device_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
log_device_error_errno(worker->event->dev_kernel, r, "Failed to send back device to kernel: %m"); if (r < 0)
log_device_error_errno(worker->event->dev_kernel, r, "Failed to send back device to kernel: %m");
}
} }
worker_free(worker); worker_free(worker);