| From 36af2d5c4433fb40ee2af912c4ac0a30991aecfc Mon Sep 17 00:00:00 2001 |
| From: Kai-Heng Feng <kai.heng.feng@canonical.com> |
| Date: Fri, 22 Jan 2021 20:53:02 +0800 |
| Subject: ACPI: sysfs: Prefer "compatible" modalias |
| |
| From: Kai-Heng Feng <kai.heng.feng@canonical.com> |
| |
| commit 36af2d5c4433fb40ee2af912c4ac0a30991aecfc upstream. |
| |
| Commit 8765c5ba1949 ("ACPI / scan: Rework modalias creation when |
| "compatible" is present") may create two "MODALIAS=" in one uevent |
| file if specific conditions are met. |
| |
| This breaks systemd-udevd, which assumes each "key" in one uevent file |
| to be unique. The internal implementation of systemd-udevd overwrites |
| the first MODALIAS with the second one, so its kmod rule doesn't load |
| the driver for the first MODALIAS. |
| |
| So if both the ACPI modalias and the OF modalias are present, use the |
| latter to ensure that there will be only one MODALIAS. |
| |
| Link: https://github.com/systemd/systemd/pull/18163 |
| Suggested-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Fixes: 8765c5ba1949 ("ACPI / scan: Rework modalias creation when "compatible" is present") |
| Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> |
| Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> |
| Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Cc: 4.1+ <stable@vger.kernel.org> # 4.1+ |
| [ rjw: Subject and changelog edits ] |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/acpi/device_sysfs.c | 20 ++++++-------------- |
| 1 file changed, 6 insertions(+), 14 deletions(-) |
| |
| --- a/drivers/acpi/device_sysfs.c |
| +++ b/drivers/acpi/device_sysfs.c |
| @@ -251,20 +251,12 @@ int __acpi_device_uevent_modalias(struct |
| if (add_uevent_var(env, "MODALIAS=")) |
| return -ENOMEM; |
| |
| - len = create_pnp_modalias(adev, &env->buf[env->buflen - 1], |
| - sizeof(env->buf) - env->buflen); |
| - if (len < 0) |
| - return len; |
| - |
| - env->buflen += len; |
| - if (!adev->data.of_compatible) |
| - return 0; |
| - |
| - if (len > 0 && add_uevent_var(env, "MODALIAS=")) |
| - return -ENOMEM; |
| - |
| - len = create_of_modalias(adev, &env->buf[env->buflen - 1], |
| - sizeof(env->buf) - env->buflen); |
| + if (adev->data.of_compatible) |
| + len = create_of_modalias(adev, &env->buf[env->buflen - 1], |
| + sizeof(env->buf) - env->buflen); |
| + else |
| + len = create_pnp_modalias(adev, &env->buf[env->buflen - 1], |
| + sizeof(env->buf) - env->buflen); |
| if (len < 0) |
| return len; |
| |