summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2007-08-29 14:11:37 +0200
committerKay Sievers <kay.sievers@vrfy.org>2007-08-29 14:11:37 +0200
commita75689bad504e35e346b84960b2b604532b1d6b5 (patch)
tree6ab67b02456a64a86963881a06d450762b5a7378
parent1113044be205f9d78642744ffaa01329a77bee79 (diff)
do not delete the device node with ignore_remove, but handle the event
-rw-r--r--udev.72
-rw-r--r--udev.xml4
-rw-r--r--udev_device.c8
-rw-r--r--udev_rules.c15
4 files changed, 19 insertions, 10 deletions
diff --git a/udev.7 b/udev.7
index 0ea554923d..874c9abe38 100644
--- a/udev.7
+++ b/udev.7
@@ -275,7 +275,7 @@ Ignore this event completely\.
.PP
\fBignore_remove\fR
.RS 4
-Ignore any later remove event for this device\. This may be useful as a workaround for broken device drivers\.
+Do not remove the device node when the device goes away\. This may be useful as a workaround for broken device drivers\.
.RE
.PP
\fBlink_priority=\fR\fB\fIvalue\fR\fR
diff --git a/udev.xml b/udev.xml
index 9fb6152941..83a9d754ca 100644
--- a/udev.xml
+++ b/udev.xml
@@ -416,8 +416,8 @@
<varlistentry>
<term><option>ignore_remove</option></term>
<listitem>
- <para>Ignore any later remove event for this device. This may be useful
- as a workaround for broken device drivers.</para>
+ <para>Do not remove the device node when the device goes away. This may be
+ useful as a workaround for broken device drivers.</para>
</listitem>
</varlistentry>
<varlistentry>
diff --git a/udev_device.c b/udev_device.c
index 2b7ffe0bf4..62217ff585 100644
--- a/udev_device.c
+++ b/udev_device.c
@@ -266,10 +266,6 @@ int udev_device_event(struct udev_rules *rules, struct udevice *udev)
/* import database entry, and delete it */
if (udev_db_get_device(udev, udev->dev->devpath) == 0) {
udev_db_delete_device(udev);
- if (udev->ignore_remove) {
- info("ignore_remove for '%s'", udev->name);
- goto exit;
- }
/* restore stored persistent data */
list_for_each_entry(name_loop, &udev->env_list, node)
putenv(name_loop->name);
@@ -285,6 +281,10 @@ int udev_device_event(struct udev_rules *rules, struct udevice *udev)
goto exit;
}
+ if (udev->ignore_remove) {
+ info("ignore_remove for '%s'", udev->name);
+ goto exit;
+ }
/* remove the node */
retval = udev_node_remove(udev);
diff --git a/udev_rules.c b/udev_rules.c
index 01fb2117b2..364d1b7adc 100644
--- a/udev_rules.c
+++ b/udev_rules.c
@@ -1472,9 +1472,14 @@ int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev)
break;
dbg("process rule");
- if (rule->name.operation != KEY_OP_UNSET || rule->symlink.operation != KEY_OP_UNSET ||
- rule->mode_operation != KEY_OP_UNSET || rule->owner.operation != KEY_OP_UNSET ||
- rule->group.operation != KEY_OP_UNSET) {
+ if (rule->name.operation == KEY_OP_ASSIGN ||
+ rule->name.operation == KEY_OP_ASSIGN_FINAL ||
+ rule->name.operation == KEY_OP_ADD ||
+ rule->symlink.operation == KEY_OP_ASSIGN ||
+ rule->symlink.operation == KEY_OP_ASSIGN_FINAL ||
+ rule->symlink.operation == KEY_OP_ADD ||
+ rule->mode_operation != KEY_OP_UNSET ||
+ rule->owner.operation != KEY_OP_UNSET || rule->group.operation != KEY_OP_UNSET) {
dbg("skip rule that names a device");
continue;
}
@@ -1485,6 +1490,10 @@ int udev_rules_get_run(struct udev_rules *rules, struct udevice *udev)
udev->ignore_device = 1;
return 0;
}
+ if (rule->ignore_remove) {
+ udev->ignore_remove = 1;
+ dbg("remove event should be ignored");
+ }
if (!udev->run_final && rule->run.operation != KEY_OP_UNSET) {
struct name_entry *entry;