From: Kay Sievers Date: Thu, 6 Aug 2009 14:16:26 +0000 (+0200) Subject: re-enable failed event tracking X-Git-Tag: 174~862 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=f7c5b04f69e004912327f082be8645b65bb1ff5d;ds=sidebyside re-enable failed event tracking It did not work for the last couple of releases. If RUN{record_failed}+="..." is given, a non-zero execution will mark the event as failed. Recorded failed events can be re-triggered with: udevadm trigger --type=failed The failed tracking _might_ be useful for things which might not be ready to be executed at early bootup, but a bit later when the needed dependencies are available. In many cases though, it indicates that something is used in a way it should not. --- diff --git a/NEWS b/NEWS index b36ace5c0..0f41c18bb 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,15 @@ udev 146 ======== -New keymaps, new modem, hid2hci updated. +Bugfixes. + +The udevadm trigger "--retry-failed" option, which is replaced since quite +a while by "--type=failed" is removed. +The failed tracking was not working at all for a few releases. The RUN +option "ignore_error" is replaces by a "record_failed" option, and the +default is not to track any failing RUN executions. + +New keymaps, new modem, hid2hci updated. udev 145 ======== diff --git a/rules/rules.d/80-drivers.rules b/rules/rules.d/80-drivers.rules index 63409cc01..d0485e13c 100644 --- a/rules/rules.d/80-drivers.rules +++ b/rules/rules.d/80-drivers.rules @@ -2,7 +2,7 @@ ACTION!="add", GOTO="drivers_end" -DRIVER!="?*", ENV{MODALIAS}=="?*", RUN{ignore_error}+="/sbin/modprobe -b $env{MODALIAS}" +DRIVER!="?*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe -b $env{MODALIAS}" SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN+="/sbin/modprobe -b tifm_sd" SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN+="/sbin/modprobe -b tifm_ms" SUBSYSTEM=="memstick", RUN+="/sbin/modprobe -b --all ms_block mspro_block" diff --git a/udev/udev-event.c b/udev/udev-event.c index 5716afef7..6a8bb44cf 100644 --- a/udev/udev-event.c +++ b/udev/udev-event.c @@ -741,7 +741,7 @@ int udev_event_execute_run(struct udev_event *event) udev_event_apply_format(event, cmd, program, sizeof(program)); envp = udev_device_get_properties_envp(event->dev); if (util_run_program(event->udev, program, envp, NULL, 0, NULL) != 0) { - if (!udev_list_entry_get_flag(list_entry)) + if (udev_list_entry_get_flag(list_entry)) err = -1; } } diff --git a/udev/udev-rules.c b/udev/udev-rules.c index a174d5db4..5f6ed06c9 100644 --- a/udev/udev-rules.c +++ b/udev/udev-rules.c @@ -1379,7 +1379,7 @@ static int add_rule(struct udev_rules *rules, char *line, int flag = 0; attr = get_key_attribute(rules->udev, key + sizeof("RUN")-1); - if (attr != NULL && strstr(attr, "ignore_error")) + if (attr != NULL && strstr(attr, "record_failed")) flag = 1; rule_add_key(&rule_tmp, TK_A_RUN, op, value, &flag); continue; diff --git a/udev/udev.xml b/udev/udev.xml index 934fe628a..5aa6c38da 100644 --- a/udev/udev.xml +++ b/udev/udev.xml @@ -335,7 +335,10 @@ device. This can only be used for very short running tasks. Running an event process for a long period of time may block all further events for this or a dependent device. Long running tasks need to be immediately - detached from the event process itself. + detached from the event process itself. If the option + is specified, + and the executed program returns non-zero, the event will be marked as failed + for a possible later handling. If the specified string starts with , all current event values will be passed to the specified socket, as a message in the same diff --git a/udev/udevadm-trigger.c b/udev/udevadm-trigger.c index a97feb79b..5cd4acd6e 100644 --- a/udev/udevadm-trigger.c +++ b/udev/udevadm-trigger.c @@ -95,7 +95,6 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[]) { "verbose", no_argument, NULL, 'v' }, { "dry-run", no_argument, NULL, 'n' }, { "type", required_argument, NULL, 't' }, - { "retry-failed", no_argument, NULL, 'F' }, { "action", required_argument, NULL, 'c' }, { "subsystem-match", required_argument, NULL, 's' }, { "subsystem-nomatch", required_argument, NULL, 'S' }, @@ -153,9 +152,6 @@ int udevadm_trigger(struct udev *udev, int argc, char *argv[]) goto exit; } break; - case 'F': - device_type = TYPE_FAILED; - break; case 'c': action = optarg; break; diff --git a/udev/udevd.c b/udev/udevd.c index 69d509ce9..4024460d4 100644 --- a/udev/udevd.c +++ b/udev/udevd.c @@ -165,7 +165,7 @@ static void event_queue_delete(struct event *event) udev_list_node_remove(&event->node); /* mark as failed, if "add" event returns non-zero */ - if (event->exitcode && strcmp(udev_device_get_action(event->dev), "add") == 0) + if (event->exitcode != 0 && strcmp(udev_device_get_action(event->dev), "add") == 0) udev_queue_export_device_failed(udev_queue_export, event->dev); else udev_queue_export_device_finished(udev_queue_export, event->dev); @@ -271,8 +271,9 @@ static void worker_new(struct event *event) do { struct udev_event *udev_event; - struct worker_message msg; + struct worker_message msg = {}; int err; + int failed = 0; info(event->udev, "seq %llu running\n", udev_device_get_seqnum(dev)); udev_event = udev_event_new(dev); @@ -291,7 +292,7 @@ static void worker_new(struct event *event) /* execute RUN= */ if (err == 0 && !udev_event->ignore_device && udev_get_run(udev_event->udev)) - udev_event_execute_run(udev_event); + failed = udev_event_execute_run(udev_event); /* reset alarm */ alarm(0); @@ -306,7 +307,10 @@ static void worker_new(struct event *event) udev_monitor_send_device(worker_monitor, NULL, dev); /* send back the result of the event execution */ - msg.exitcode = err; + if (err != 0) + msg.exitcode = err; + else if (failed != 0) + msg.exitcode = failed; msg.pid = getpid(); send(worker_watch[WRITE_END], &msg, sizeof(struct worker_message), 0);