do not delete the device node with ignore_remove, but handle the event
This commit is contained in:
parent
1113044be2
commit
a75689bad5
2
udev.7
2
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
|
||||
|
|
4
udev.xml
4
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>
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
15
udev_rules.c
15
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;
|
||||
|
|
Loading…
Reference in a new issue