summaryrefslogtreecommitdiff
path: root/src/udev/udevd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/udev/udevd.c')
-rw-r--r--src/udev/udevd.c53
1 files changed, 32 insertions, 21 deletions
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index a028c9cac0..ffc48a03bd 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2012 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2004-2012 Kay Sievers <kay@vrfy.org>
* Copyright (C) 2004 Chris Friesen <chris_friesen@sympatico.ca>
* Copyright (C) 2009 Canonical Ltd.
* Copyright (C) 2009 Scott James Remnant <scott@netsplit.com>
@@ -95,8 +95,9 @@ struct event {
size_t devpath_len;
const char *devpath_old;
dev_t devnum;
- bool is_block;
int ifindex;
+ bool is_block;
+ bool nodelay;
};
static inline struct event *node_to_event(struct udev_list_node *node)
@@ -121,7 +122,7 @@ struct worker {
struct udev_monitor *monitor;
enum worker_state state;
struct event *event;
- unsigned long long event_start_usec;
+ usec_t event_start_usec;
};
/* passed from worker to main process */
@@ -377,7 +378,7 @@ out:
worker->monitor = worker_monitor;
worker->pid = pid;
worker->state = WORKER_RUNNING;
- worker->event_start_usec = now_usec();
+ worker->event_start_usec = now(CLOCK_MONOTONIC);
worker->event = event;
event->state = EVENT_RUNNING;
udev_list_node_append(&worker->node, &worker_list);
@@ -408,7 +409,7 @@ static void event_run(struct event *event)
worker_ref(worker);
worker->event = event;
worker->state = WORKER_RUNNING;
- worker->event_start_usec = now_usec();
+ worker->event_start_usec = now(CLOCK_MONOTONIC);
event->state = EVENT_RUNNING;
return;
}
@@ -438,8 +439,10 @@ static int event_queue_insert(struct udev_device *dev)
event->devpath_len = strlen(event->devpath);
event->devpath_old = udev_device_get_devpath_old(dev);
event->devnum = udev_device_get_devnum(dev);
- event->is_block = (strcmp("block", udev_device_get_subsystem(dev)) == 0);
+ event->is_block = streq("block", udev_device_get_subsystem(dev));
event->ifindex = udev_device_get_ifindex(dev);
+ if (streq(udev_device_get_subsystem(dev), "firmware"))
+ event->nodelay = true;
udev_queue_export_device_queued(udev_queue_export, dev);
log_debug("seq %llu queued, '%s' '%s'\n", udev_device_get_seqnum(dev),
@@ -519,6 +522,10 @@ static bool is_devpath_busy(struct event *event)
return true;
}
+ /* allow to bypass the dependency tracking */
+ if (event->nodelay)
+ continue;
+
/* parent device event found */
if (event->devpath[common] == '/') {
event->delaying_seqnum = loop_event->seqnum;
@@ -1035,14 +1042,17 @@ static void kernel_cmdline_options(struct udev *udev)
else
opt = s;
- if (startswith(opt, "udev.log-priority="))
- udev_set_log_priority(udev, util_log_priority(opt + 18));
+ if (startswith(opt, "udev.log-priority=")) {
+ int prio;
- if (startswith(opt, "udev.children-max="))
+ prio = util_log_priority(opt + 18);
+ log_set_max_level(prio);
+ udev_set_log_priority(udev, prio);
+ } else if (startswith(opt, "udev.children-max=")) {
children_max = strtoul(opt + 18, NULL, 0);
-
- if (startswith(opt, "udev.exec-delay="))
+ } else if (startswith(opt, "udev.exec-delay=")) {
exec_delay = strtoul(opt + 16, NULL, 0);
+ }
free(s);
}
@@ -1087,7 +1097,7 @@ int main(int argc, char *argv[])
for (;;) {
int option;
- option = getopt_long(argc, argv, "c:deDtN:hV", options, NULL);
+ option = getopt_long(argc, argv, "c:de:DtN:hV", options, NULL);
if (option == -1)
break;
@@ -1104,7 +1114,7 @@ int main(int argc, char *argv[])
case 'D':
debug = true;
log_set_max_level(LOG_DEBUG);
- udev_set_log_priority(udev, LOG_INFO);
+ udev_set_log_priority(udev, LOG_DEBUG);
break;
case 'N':
if (strcmp (optarg, "early") == 0) {
@@ -1152,7 +1162,7 @@ int main(int argc, char *argv[])
mkdir("/run/udev", 0755);
- dev_setup();
+ dev_setup(NULL);
static_dev_create_from_modules(udev);
/* before opening new files, make sure std{in,out,err} fds are in a sane state */
@@ -1174,7 +1184,7 @@ int main(int argc, char *argv[])
}
if (systemd_fds(udev, &fd_ctrl, &fd_netlink) >= 0) {
- /* get control and netlink socket from from systemd */
+ /* get control and netlink socket from systemd */
udev_ctrl = udev_ctrl_new_from_fd(udev, fd_ctrl);
if (udev_ctrl == NULL) {
log_error("error taking over udev control socket");
@@ -1364,7 +1374,7 @@ int main(int argc, char *argv[])
udev_list_node_init(&worker_list);
for (;;) {
- static unsigned long long last_usec;
+ static usec_t last_usec;
struct epoll_event ev[8];
int fdcount;
int timeout;
@@ -1435,7 +1445,7 @@ int main(int argc, char *argv[])
if (worker->state != WORKER_RUNNING)
continue;
- if ((now_usec() - worker->event_start_usec) > 30 * 1000 * 1000) {
+ if ((now(CLOCK_MONOTONIC) - worker->event_start_usec) > 30 * 1000 * 1000) {
log_error("worker [%u] %s timeout; kill it\n", worker->pid,
worker->event ? worker->event->devpath : "<idle>");
kill(worker->pid, SIGKILL);
@@ -1469,13 +1479,13 @@ int main(int argc, char *argv[])
}
/* check for changed config, every 3 seconds at most */
- if ((now_usec() - last_usec) > 3 * 1000 * 1000) {
+ if ((now(CLOCK_MONOTONIC) - last_usec) > 3 * 1000 * 1000) {
if (udev_rules_check_timestamp(rules))
reload = true;
if (udev_builtin_validate(udev))
reload = true;
- last_usec = now_usec();
+ last_usec = now(CLOCK_MONOTONIC);
}
/* reload requested, HUP signal received, rules changed, builtin changed */
@@ -1483,7 +1493,7 @@ int main(int argc, char *argv[])
worker_kill(udev);
rules = udev_rules_unref(rules);
udev_builtin_exit(udev);
- reload = 0;
+ reload = false;
}
/* event has finished */
@@ -1495,7 +1505,7 @@ int main(int argc, char *argv[])
dev = udev_monitor_receive_device(monitor);
if (dev != NULL) {
- udev_device_set_usec_initialized(dev, now_usec());
+ udev_device_set_usec_initialized(dev, now(CLOCK_MONOTONIC));
if (event_queue_insert(dev) < 0)
udev_device_unref(dev);
}
@@ -1503,6 +1513,7 @@ int main(int argc, char *argv[])
/* start new events */
if (!udev_list_node_is_empty(&event_list) && !udev_exit && !stop_exec_queue) {
+ udev_builtin_init(udev);
if (rules == NULL)
rules = udev_rules_new(udev, resolve_names);
if (rules != NULL)