Skip to content

Commit 95aeed8

Browse files
nabijaczlewelijohannbg
authored andcommitted
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
1 parent a1d4041 commit 95aeed8

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

dracut-init.sh

-2
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ srcmods="$dracutsysrootdir/lib/modules/$kernel/"
7272
}
7373
export srcmods
7474

75-
[[ $DRACUT_FIRMWARE_PATH ]] || export DRACUT_FIRMWARE_PATH="/lib/firmware/updates:/lib/firmware:/lib/firmware/$kernel"
76-
7775
# export standard hookdirs
7876
[[ $hookdirs ]] || {
7977
hookdirs="cmdline pre-udev pre-trigger netroot "

dracut.sh

+4-1
Original file line numberDiff line numberDiff line change
@@ -1020,7 +1020,10 @@ stdloglvl=$((stdloglvl + verbosity_mod_l))
10201020
[[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
10211021
[[ $lvmconf_l ]] && lvmconf=$lvmconf_l
10221022
[[ $dracutbasedir ]] || dracutbasedir="$dracutsysrootdir"/usr/lib/dracut
1023-
[[ $fw_dir ]] || fw_dir="$dracutsysrootdir/lib/firmware/updates:$dracutsysrootdir/lib/firmware:$dracutsysrootdir/lib/firmware/$kernel"
1023+
[[ $fw_dir ]] || {
1024+
fw_path_para=$(< /sys/module/firmware_class/parameters/path)
1025+
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"
1026+
}
10241027
[[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
10251028
[[ $tmpdir ]] || tmpdir="$TMPDIR"
10261029
[[ $tmpdir ]] || tmpdir="$dracutsysrootdir"/var/tmp

src/install/dracut-install.c

+28-8
Original file line numberDiff line numberDiff line change
@@ -983,9 +983,12 @@ static void usage(int status)
983983
"\n"
984984
" --module,-m Install kernel modules, instead of files\n"
985985
" --kerneldir Specify the kernel module directory\n"
986-
" (default: /lib/modules/`uname -r`)\n"
986+
" (default: /lib/modules/$(uname -r))\n"
987987
" --firmwaredirs Specify the firmware directory search path with : separation\n"
988-
" (default: DRACUT_FIRMWARE_PATH env var, /lib/firmware if not set)\n"
988+
" (default: $DRACUT_FIRMWARE_PATH, otherwise kernel-compatible\n"
989+
" $(</sys/module/firmware_class/parameters/path),\n"
990+
" /lib/firmware/updates/$(uname -r), /lib/firmware/updates\n"
991+
" /lib/firmware/$(uname -r), /lib/firmware)\n"
989992
" --silent Don't display error messages for kernel module install\n"
990993
" --modalias Only generate module list from /sys/devices modalias list\n"
991994
" -o --optional If kernel module does not exist, do not fail\n"
@@ -1149,10 +1152,10 @@ static int parse_argv(int argc, char *argv[])
11491152
log_set_max_level(arg_loglevel);
11501153
}
11511154

1155+
struct utsname buf = {0};
11521156
if (!kerneldir) {
1153-
struct utsname buf;
11541157
uname(&buf);
1155-
_asprintf(&kerneldir, "%s%s", "/lib/modules/", buf.release);
1158+
_asprintf(&kerneldir, "/lib/modules/%s", buf.release);
11561159
}
11571160

11581161
if (arg_modalias) {
@@ -1161,15 +1164,32 @@ static int parse_argv(int argc, char *argv[])
11611164

11621165
if (arg_module) {
11631166
if (!firmwaredirs) {
1164-
char *path = NULL;
1165-
1166-
path = getenv("DRACUT_FIRMWARE_PATH");
1167+
char *path = getenv("DRACUT_FIRMWARE_PATH");
11671168

11681169
if (path) {
11691170
log_debug("DRACUT_FIRMWARE_PATH=%s", path);
11701171
firmwaredirs = strv_split(path, ":");
11711172
} else {
1172-
firmwaredirs = strv_new("/lib/firmware", NULL);
1173+
if (!*buf.release)
1174+
uname(&buf);
1175+
1176+
char fw_path_para[PATH_MAX + 1] = "";
1177+
int path = open("/sys/module/firmware_class/parameters/path", O_RDONLY | O_CLOEXEC);
1178+
if (path != -1) {
1179+
ssize_t rd = read(path, fw_path_para, PATH_MAX);
1180+
if (rd != -1)
1181+
fw_path_para[rd - 1] = '\0';
1182+
close(path);
1183+
}
1184+
char uk[22 + sizeof(buf.release)], fk[14 + sizeof(buf.release)];
1185+
sprintf(uk, "/lib/firmware/updates/%s", buf.release);
1186+
sprintf(fk, "/lib/firmware/%s", buf.release);
1187+
firmwaredirs = strv_new(STRV_IFNOTNULL(*fw_path_para ? fw_path_para : NULL),
1188+
uk,
1189+
"/lib/firmware/updates",
1190+
fk,
1191+
"/lib/firmware",
1192+
NULL);
11731193
}
11741194
}
11751195
}

0 commit comments

Comments
 (0)