From 953c928c24455744d5534679998d129b947a5e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 12 Dec 2022 12:52:12 +0100 Subject: udev: rework 60-evdev.rules to be "additive" We would execute up to four hwdb match patterns (+ the keyboard builtin): After the first hit, we would skip the other patterns, because of the GOTO="evdev_end" action. 57bb707d48131f4daad2b1b746eab586eb66b4f3 (rules: Add extended evdev/input match rules for event nodes with the same name), added an additional match with ":phys::ev:" inserted. This breaks backwards compatibility for user hwdb patterns, because we quit after the first match. In general hwdb properties are "additive". We often have a general rule that matches a wider class and then some specific overrides. E.g. in this particular case, we have a match for all trackpoints, and then a bunch of model-specific settings. So let's change the rules to try all the match patterns and combine the received properties. We execute builtin-keyboard once at the end, if there was at least one match. Fixes #25698. Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2152226. This also impacts other cases which I think would be very confusing for users. Since we quit after a first successful match, if we had e.g. a match for 'evdev:input:b*v*p*' in out database, and the user added a match using 'evdev:name:*', which is the approach we document in the .hwdb files and which users quite often use, it would be silently ignored. What's worse, if we added our 'evdev:input:b*v*p*' match at a later point, user's match would stop working. If we combine all the properties, we get more stable behaviour. --- rules.d/60-evdev.rules | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/rules.d/60-evdev.rules b/rules.d/60-evdev.rules index 055a62a12d..15483101e7 100644 --- a/rules.d/60-evdev.rules +++ b/rules.d/60-evdev.rules @@ -3,23 +3,28 @@ ACTION=="remove", GOTO="evdev_end" KERNEL!="event*", GOTO="evdev_end" -# skip later rules when we find something for this input device -IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=evdev:", \ - IMPORT{builtin}="keyboard", GOTO="evdev_end" +# Execute the match patterns below, from least-to-most specific. + +# Device matching the modalias string (bustype, vendor, product, version, other properties) +IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=evdev:", + ENV{.HAVE_HWDB_PROPERTIES}="1" # AT keyboard matching by the machine's DMI data DRIVERS=="atkbd", \ IMPORT{builtin}="hwdb 'evdev:atkbd:$attr{[dmi/id]modalias}'", \ - IMPORT{builtin}="keyboard", GOTO="evdev_end" + ENV{.HAVE_HWDB_PROPERTIES}="1" -# device matching the input device name + properties + the machine's DMI data +# Device matching the input device name and the machine's DMI data KERNELS=="input*", \ - IMPORT{builtin}="hwdb 'evdev:name:$attr{name}:phys:$attr{phys}:ev:$attr{capabilities/ev}:$attr{[dmi/id]modalias}'", \ - IMPORT{builtin}="keyboard", GOTO="evdev_end" + IMPORT{builtin}="hwdb 'evdev:name:$attr{name}:$attr{[dmi/id]modalias}'", \ + ENV{.HAVE_HWDB_PROPERTIES}="1" -# device matching the input device name and the machine's DMI data +# Device matching the input device name + properties + the machine's DMI data KERNELS=="input*", \ - IMPORT{builtin}="hwdb 'evdev:name:$attr{name}:$attr{[dmi/id]modalias}'", \ - IMPORT{builtin}="keyboard", GOTO="evdev_end" + IMPORT{builtin}="hwdb 'evdev:name:$attr{name}:phys:$attr{phys}:ev:$attr{capabilities/ev}:$attr{[dmi/id]modalias}'", \ + ENV{.HAVE_HWDB_PROPERTIES}="1" + +ENV{.HAVE_HWDB_PROPERTIES}=="1", \ + IMPORT{builtin}="keyboard" LABEL="evdev_end" -- cgit v1.2.1