dracut/backport-fix-dracut-default-to-correctsearch-paths.patch
hongjinghao 9d9fb131b3 backport patchs from upstream
(cherry picked from commit 74c55dc789a3aacb444c42ab40cd308bd213f5e3)
2024-02-22 16:48:54 +08:00

123 lines
6.1 KiB
Diff

From 95aeed8975dd5a2af782ec986f2af6176b585c59 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz>
Date: Tue, 26 Apr 2022 16:42:55 +0200
Subject: [PATCH] fix(dracut): default to correct firmware search paths
1. /sys/module/firmware_class/parameters/path (fw_path_para), if any
2. /lib/firmware/updates/$(uname -r)
3. /lib/firmware/updates
4. /lib/firmware/$(uname -r)
5. /lib/firmware
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/base/firmware_loader/main.c?h=v5.17#n406
Reference:https://github.com/dracutdevs/dracut/commit/95aeed8975dd5a2af782ec986f2af6176b585c59
Conflict:context adaptation
---
dracut-init.sh | 2 --
dracut.sh | 5 ++++-
src/install/dracut-install.c | 36 ++++++++++++++++++++++++++++--------
3 files changed, 32 insertions(+), 11 deletions(-)
diff --git a/dracut-init.sh b/dracut-init.sh
index b6e3714..1d29181 100644
--- a/dracut-init.sh
+++ b/dracut-init.sh
@@ -72,8 +72,6 @@ srcmods="$dracutsysrootdir/lib/modules/$kernel/"
}
export srcmods
-[[ $DRACUT_FIRMWARE_PATH ]] || export DRACUT_FIRMWARE_PATH="/lib/firmware/updates:/lib/firmware:/lib/firmware/$kernel"
-
# export standard hookdirs
[[ $hookdirs ]] || {
hookdirs="cmdline pre-udev pre-trigger netroot "
diff --git a/dracut.sh b/dracut.sh
index 0df6508..02632c5 100755
--- a/dracut.sh
+++ b/dracut.sh
@@ -988,7 +988,10 @@ stdloglvl=$((stdloglvl + verbosity_mod_l))
[[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
[[ $lvmconf_l ]] && lvmconf=$lvmconf_l
[[ $dracutbasedir ]] || dracutbasedir="$dracutsysrootdir"/usr/lib/dracut
-[[ $fw_dir ]] || fw_dir="$dracutsysrootdir/lib/firmware/updates:$dracutsysrootdir/lib/firmware:$dracutsysrootdir/lib/firmware/$kernel"
+[[ $fw_dir ]] || {
+ fw_path_para=$(< /sys/module/firmware_class/parameters/path)
+ fw_dir="${fw_path_para:+$dracutsysrootdir$fw_path_para:}$dracutsysrootdir/lib/firmware/updates/$kernel:$dracutsysrootdir/lib/firmware/updates:$dracutsysrootdir/lib/firmware/$kernel:$dracutsysrootdir/lib/firmware"
+}
[[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
[[ $tmpdir ]] || tmpdir="$TMPDIR"
[[ $tmpdir ]] || tmpdir="$dracutsysrootdir"/var/tmp
diff --git a/src/install/dracut-install.c b/src/install/dracut-install.c
index 9122f39..b41bfc7 100644
--- a/src/install/dracut-install.c
+++ b/src/install/dracut-install.c
@@ -1017,9 +1017,12 @@ static void usage(int status)
"\n"
" --module,-m Install kernel modules, instead of files\n"
" --kerneldir Specify the kernel module directory\n"
- " (default: /lib/modules/`uname -r`)\n"
+ " (default: /lib/modules/$(uname -r))\n"
" --firmwaredirs Specify the firmware directory search path with : separation\n"
- " (default: DRACUT_FIRMWARE_PATH env var, /lib/firmware if not set)\n"
+ " (default: $DRACUT_FIRMWARE_PATH, otherwise kernel-compatible\n"
+ " $(</sys/module/firmware_class/parameters/path),\n"
+ " /lib/firmware/updates/$(uname -r), /lib/firmware/updates\n"
+ " /lib/firmware/$(uname -r), /lib/firmware)\n"
" --silent Don't display error messages for kernel module install\n"
" --modalias Only generate module list from /sys/devices modalias list\n"
" -o --optional If kernel module does not exist, do not fail\n"
@@ -1183,10 +1186,10 @@ static int parse_argv(int argc, char *argv[])
log_set_max_level(arg_loglevel);
}
+ struct utsname buf = {0};
if (!kerneldir) {
- struct utsname buf;
uname(&buf);
- if (asprintf(&kerneldir, "%s%s", "/lib/modules/", buf.release) < 0) {
+ if (asprintf(&kerneldir, "/lib/modules/%s", buf.release) < 0) {
log_error("Out of memory!");
exit(EXIT_FAILURE);
}
@@ -1198,15 +1201,32 @@ static int parse_argv(int argc, char *argv[])
if (arg_module) {
if (!firmwaredirs) {
- char *path = NULL;
-
- path = getenv("DRACUT_FIRMWARE_PATH");
+ char *path = getenv("DRACUT_FIRMWARE_PATH");
if (path) {
log_debug("DRACUT_FIRMWARE_PATH=%s", path);
firmwaredirs = strv_split(path, ":");
} else {
- firmwaredirs = strv_new("/lib/firmware", NULL);
+ if (!*buf.release)
+ uname(&buf);
+
+ char fw_path_para[PATH_MAX + 1] = "";
+ int path = open("/sys/module/firmware_class/parameters/path", O_RDONLY | O_CLOEXEC);
+ if (path != -1) {
+ ssize_t rd = read(path, fw_path_para, PATH_MAX);
+ if (rd != -1)
+ fw_path_para[rd - 1] = '\0';
+ close(path);
+ }
+ char uk[22 + sizeof(buf.release)], fk[14 + sizeof(buf.release)];
+ sprintf(uk, "/lib/firmware/updates/%s", buf.release);
+ sprintf(fk, "/lib/firmware/%s", buf.release);
+ firmwaredirs = strv_new(STRV_IFNOTNULL(*fw_path_para ? fw_path_para : NULL),
+ uk,
+ "/lib/firmware/updates",
+ fk,
+ "/lib/firmware",
+ NULL);
}
}
}
--
2.23.0