]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
[PATCH] udevd: don't delay events with TIMEOUT in the environment
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Thu, 17 Mar 2005 10:51:37 +0000 (11:51 +0100)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 06:53:53 +0000 (23:53 -0700)
On Tue, 2005-03-15 at 09:25 +0100, Hannes Reinecke wrote:
> The current implementation of the firmware class breaks a fundamental
> assumption in udevd: that the physical device can be initialised fully
> prior to executing the next event for that device.

Thanks to Hannes for the patch.

RELEASE-NOTES
udevd.c
udevd.h

index 0bddab41897fc9c158beb1b22fe9c8feb2222545..2defd7117b388dad12ce770fc5bf3d839f8aa107 100644 (file)
@@ -1,3 +1,9 @@
+udev 056
+========
+Possible use of a system-wide klibc:
+  make USE_KLIB=true KLCC=/usr/bin/klcc all
+will link against an external klibc and our own version will be ignored.
+
 udev 055
 ========
 We support an unlimited count of symlinks now.
diff --git a/udevd.c b/udevd.c
index 2cd3622ce011a5a04630ff8d05595dbd6d53fc81..6e27c8a0d141779edfe2f8e3420c0d4b927a1bdf 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -113,6 +113,14 @@ static void msg_queue_insert(struct hotplug_msg *msg)
                return;
        }
 
+       /* don't delay messages with timeout set */
+       if (msg->timeout) {
+               dbg("move seq %llu with timeout %u to exec queue", msg->seqnum, msg->timeout);
+               list_add(&msg->node, &exec_list);
+               run_exec_q = 1;
+               return;
+       }
+
        /* sort message by sequence number into list */
        list_for_each_entry_reverse(loop_msg, &msg_list, node) {
                if (loop_msg->seqnum < msg->seqnum)
@@ -293,6 +301,10 @@ static struct hotplug_msg *running_with_devpath(struct hotplug_msg *msg)
        if (msg->devpath == NULL)
                return NULL;
 
+       /* skip any events with a timeout set */
+       if (msg->timeout)
+               return NULL;
+
        list_for_each_entry(loop_msg, &running_list, node) {
                if (loop_msg->devpath == NULL)
                        continue;
@@ -490,6 +502,9 @@ static struct hotplug_msg *get_udevsend_msg(void)
 
                if (strncmp(key, "PHYSDEVPATH=", 12) == 0)
                        msg->physdevpath = &key[12];
+
+               if (strncmp(key, "TIMEOUT=", 8) == 0)
+                       msg->timeout = strtoull(&key[8], NULL, 10);
        }
        msg->envp[i++] = "UDEVD_EVENT=1";
        msg->envp[i] = NULL;
diff --git a/udevd.h b/udevd.h
index 64e1d6ad12105a087c612dad0c469c5404297a48..b3e998b04c3f69aa2f9bbfa2779e5ac0fe426e2d 100644 (file)
--- a/udevd.h
+++ b/udevd.h
@@ -60,6 +60,7 @@ struct hotplug_msg {
        char *subsystem;
        unsigned long long seqnum;
        char *physdevpath;
+       unsigned int timeout;
        char *envp[HOTPLUG_NUM_ENVP+1];
        char envbuf[];
 };