517d247192
The recent SPL merge caused a regression in kernels with ZFS integrated into the sources where our modules would be initialized in alphabetical order, despite icp requiring the spl module be loaded first. This caused kernels with ZFS builtin to fail to boot. We resolve this by adding a special case for the spl that lists it first. It is somewhat ugly, but it works. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Matthew Thode <prometheanfire@gentoo.org> Signed-off-by: Richard Yao <ryao@gentoo.org> Closes #7595 Closes #7606
113 lines
2.4 KiB
Bash
Executable File
113 lines
2.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
usage()
|
|
{
|
|
echo "usage: $0 <kernel source tree>" >&2
|
|
exit 1
|
|
}
|
|
|
|
[ "$#" -eq 1 ] || usage
|
|
KERNEL_DIR="$(readlink --canonicalize-existing "$1")"
|
|
|
|
MODULES=()
|
|
MODULES+="spl"
|
|
for MODULE_DIR in module/*
|
|
do
|
|
[ -d "$MODULE_DIR" ] || continue
|
|
[ "spl" = "${MODULE_DIR##*/}" ] && continue
|
|
MODULES+=("${MODULE_DIR##*/}")
|
|
done
|
|
|
|
if ! [ -e 'zfs_config.h' ]
|
|
then
|
|
echo >&2
|
|
echo " $0: you did not run configure, or you're not in the ZFS source directory." >&2
|
|
echo " $0: run configure with --with-linux=$KERNEL_DIR and --enable-linux-builtin." >&2
|
|
echo >&2
|
|
exit 1
|
|
fi
|
|
|
|
make clean || true
|
|
|
|
rm -rf "$KERNEL_DIR/include/zfs" "$KERNEL_DIR/fs/zfs"
|
|
cp --recursive include "$KERNEL_DIR/include/zfs"
|
|
cp --recursive module "$KERNEL_DIR/fs/zfs"
|
|
cp zfs_config.h "$KERNEL_DIR/include/zfs/"
|
|
|
|
for MODULE in "${MODULES[@]}"
|
|
do
|
|
sed -i.bak '/obj =/d' "$KERNEL_DIR/fs/zfs/$MODULE/Makefile"
|
|
sed -i.bak '/src =/d' "$KERNEL_DIR/fs/zfs/$MODULE/Makefile"
|
|
done
|
|
|
|
cat > "$KERNEL_DIR/fs/zfs/Kconfig" <<"EOF"
|
|
config ZFS
|
|
tristate "ZFS filesystem support"
|
|
depends on EFI_PARTITION
|
|
select ZLIB_INFLATE
|
|
select ZLIB_DEFLATE
|
|
help
|
|
This is the ZFS filesystem from the ZFS On Linux project.
|
|
|
|
See http://zfsonlinux.org/
|
|
|
|
To compile this file system support as a module, choose M here.
|
|
|
|
If unsure, say N.
|
|
EOF
|
|
|
|
{
|
|
cat <<-"EOF"
|
|
ZFS_MODULE_CFLAGS = -I$(srctree)/include/zfs
|
|
ZFS_MODULE_CFLAGS += -I$(srctree)/include/zfs/spl
|
|
ZFS_MODULE_CFLAGS += -include $(srctree)/include/zfs/zfs_config.h
|
|
ZFS_MODULE_CFLAGS += -std=gnu99 -Wno-declaration-after-statement
|
|
ZFS_MODULE_CPPFLAGS = -D_KERNEL
|
|
ZFS_MODULE_CPPFLAGS += -UDEBUG -DNDEBUG
|
|
export ZFS_MODULE_CFLAGS ZFS_MODULE_CPPFLAGS
|
|
|
|
obj-$(CONFIG_ZFS) :=
|
|
EOF
|
|
|
|
for MODULE in "${MODULES[@]}"
|
|
do
|
|
echo 'obj-$(CONFIG_ZFS) += ' "$MODULE/"
|
|
done
|
|
} > "$KERNEL_DIR/fs/zfs/Kbuild"
|
|
|
|
add_after()
|
|
{
|
|
local FILE="$1"
|
|
local MARKER="$2"
|
|
local NEW="$3"
|
|
local LINE
|
|
|
|
while IFS='' read -r LINE
|
|
do
|
|
echo "$LINE"
|
|
|
|
if [ -n "$MARKER" -a "$LINE" = "$MARKER" ]
|
|
then
|
|
echo "$NEW"
|
|
MARKER=''
|
|
if IFS='' read -r LINE
|
|
then
|
|
[ "$LINE" != "$NEW" ] && echo "$LINE"
|
|
fi
|
|
fi
|
|
done < "$FILE" > "$FILE.new"
|
|
|
|
mv "$FILE.new" "$FILE"
|
|
}
|
|
|
|
add_after "$KERNEL_DIR/fs/Kconfig" 'if BLOCK' 'source "fs/zfs/Kconfig"'
|
|
add_after "$KERNEL_DIR/fs/Makefile" 'endif' 'obj-$(CONFIG_ZFS) += zfs/'
|
|
|
|
echo >&2
|
|
echo " $0: done." >&2
|
|
echo " $0: now you can build the kernel with ZFS support." >&2
|
|
echo " $0: make sure you enable ZFS support (CONFIG_ZFS) before building." >&2
|
|
echo >&2
|