# called by dracut
installkernel() {
local _blockfuncs='ahci_platform_get_resources|ata_scsi_ioctl|scsi_add_host|blk_cleanup_queue|register_mtd_blktrans|scsi_esp_register|register_virtio_device|usb_stor_disconnect|mmc_add_host|sdhci_add_host|scsi_add_host_with_dma'
+ local _hostonly_drvs
find_kernel_modules_external () {
local _OLDIFS
IFS=$_OLDIFS
}
- is_block_dev() {
- [ -e /sys/dev/block/$1 ] && return 0
+ record_block_dev_drv() {
+ for _mod in $(get_dev_module /dev/block/$1); do
+ [[ " $_hostonly_drvs " != *$_mod* ]] && _hostonly_drvs+=" $_mod"
+ done
+ [[ "$_hostonly_drvs" ]] && return 0
return 1
}
+ install_block_modules_strict () {
+ hostonly='' instmods $_hostonly_drvs
+ }
+
install_block_modules () {
- hostonly='' instmods sg sr_mod sd_mod scsi_dh ata_piix
instmods \
scsi_dh_rdac scsi_dh_emc scsi_dh_alua \
=ide nvme vmd \
find_kernel_modules_external | instmods
- if ! [[ $hostonly ]] || for_each_host_dev_and_slaves is_block_dev; then
- install_block_modules
+ # if not on hostonly mode, or there are hostonly block device
+ # install block drivers
+ if ! [[ $hostonly ]] || \
+ for_each_host_dev_and_slaves_all record_block_dev_drv;
+ then
+ hostonly='' instmods sg sr_mod sd_mod scsi_dh ata_piix
+
+ if [[ "$hostonly_mode" == "strict" ]]; then
+ install_block_modules_strict
+ else
+ install_block_modules
+ fi
fi
# if not on hostonly mode, install all known filesystems,