From: Kay Sievers Date: Wed, 29 Aug 2007 12:11:37 +0000 (+0200) Subject: do not delete the device node with ignore_remove, but handle the event X-Git-Tag: 174~1833 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=a75689bad504e35e346b84960b2b604532b1d6b5 do not delete the device node with ignore_remove, but handle the event --- diff --git a/udev.7 b/udev.7 index 0ea554923..874c9abe3 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 9fb615294..83a9d754c 100644 --- a/udev.xml +++ b/udev.xml @@ -416,8 +416,8 @@ - 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. diff --git a/udev_device.c b/udev_device.c index 2b7ffe0bf..62217ff58 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 01fb2117b..364d1b7ad 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;