]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fix(kernel-modules): use modalias info in get_dev_module()
authorAdrien Thierry <athierry@redhat.com>
Mon, 13 Feb 2023 15:43:32 +0000 (10:43 -0500)
committerAntonio Álvarez Feijoo <antonio.feijoo@suse.com>
Wed, 15 Feb 2023 11:59:13 +0000 (12:59 +0100)
When calling dracut with '--hostonly-mode=strict', get_dev_module() gets
called on the system's block devices to find the required drivers. The
driver name is retrieved using udevadm. However, the driver name
returned by udevadm is not necessarily the same as the module name.
This is the case for the Qualcomm UFS driver: udevadm returns
'ufshcd-qcom' while the module name is 'ufs-qcom', so dracut-install is
not able to find the module afterwards.

To solve this, make get_dev_module() also return the module alias info
from the modalias files contained in the sysfs directories parsed by
udevadm.

Signed-off-by: Adrien Thierry <athierry@redhat.com>
dracut-functions.sh

index 6e3807b23f59abb42e137f1e415053ca8c53bfda..80f3b44ce93cbbd158d964f85b5ab9cc7a913d17 100755 (executable)
@@ -987,8 +987,20 @@ block_is_netdevice() {
 get_dev_module() {
     local dev_attr_walk
     local dev_drivers
+    local dev_paths
     dev_attr_walk=$(udevadm info -a "$1")
     dev_drivers=$(echo "$dev_attr_walk" | sed -n 's/\s*DRIVERS=="\(\S\+\)"/\1/p')
+
+    # also return modalias info from sysfs paths parsed by udevadm
+    dev_paths=$(echo "$dev_attr_walk" | sed -n 's/.*\(\/devices\/.*\)'\'':/\1/p')
+    local dev_path
+    for dev_path in $dev_paths; do
+        local modalias_file="/sys$dev_path/modalias"
+        if [ -e "$modalias_file" ]; then
+            dev_drivers="$(printf "%s\n%s" "$dev_drivers" "$(cat "$modalias_file")")"
+        fi
+    done
+
     # if no kernel modules found and device is in a virtual subsystem, follow symlinks
     if [[ -z $dev_drivers && $(udevadm info -q path "$1") == "/devices/virtual"* ]]; then
         local dev_vkernel