From: kay.sievers@vrfy.org Date: Thu, 17 Mar 2005 10:51:37 +0000 (+0100) Subject: [PATCH] udevd: don't delay events with TIMEOUT in the environment X-Git-Tag: 056~7 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;ds=sidebyside;h=7f7ae03a6290ccc1e4ca57416fe871dae4b865d2;hp=92ebb398ed004348d5f92a242f323fb25dc7d6e5;p=elogind.git [PATCH] udevd: don't delay events with TIMEOUT in the environment 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. --- diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 0bddab418..2defd7117 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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 2cd3622ce..6e27c8a0d 100644 --- 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 64e1d6ad1..b3e998b04 100644 --- 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[]; };