%global commit 36c3e1cb1ac054761e6ff726d374fde770ab790b %global gittag 8.1.0.4 %global shortcommit %(c=%{commit}; echo ${c:0:7}) %define spec_release 1 %define kmod_name kvdo %define kmod_driver_version %{gittag} %define kmod_rpm_release %{spec_release} %define kmod_kernel_version 5.12.0-1.el9 %define kmod_headers_version %(rpm -qa kernel-devel | sed 's/^kernel-devel-//') %define kmod_kbuild_dir . %define kmod_devel_package 0 Source0: https://github.com/dm-vdo/%{kmod_name}/archive/%{commit}/%{kmod_name}-%{shortcommit}.tar.gz %define findpat %( echo "%""P" ) Name: kmod-kvdo Version: %{kmod_driver_version} Release: %{kmod_rpm_release}%{?dist} Summary: Kernel Modules for Virtual Data Optimizer License: GPLv2+ URL: http://github.com/dm-vdo/kvdo BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: elfutils-libelf-devel BuildRequires: glibc BuildRequires: kernel-devel >= %{kmod_kernel_version} # Disable the kernel-debug requirement for now BuildRequires: libuuid-devel BuildRequires: redhat-rpm-config ExcludeArch: i686 ExcludeArch: ppc ExcludeArch: ppc64 ExcludeArch: s390 %global kernel_source() /usr/src/kernels/%{kmod_headers_version} %global _use_internal_dependency_generator 0 Provides: kernel-modules = %{kmod_kernel_version}.%{_target_cpu} Provides: kmod-%{kmod_name} = %{?epoch:%{epoch}:}%{version}-%{release} Requires(post): %{_sbindir}/weak-modules Requires(postun): %{_sbindir}/weak-modules Requires: kernel >= %{kmod_kernel_version} Requires: kernel-core-uname-r >= %{kmod_kernel_version} %description Virtual Data Optimizer (VDO) is a device mapper target that delivers block-level deduplication, compression, and thin provisioning. This package provides the kernel modules for VDO. %pre # During the install, check whether kvdo or uds is loaded. A warning here # indicates that a previous install was not completely removed. This message # is purely informational to the user. for module in kvdo uds; do if grep -q "^${module}" /proc/modules; then if [ "${module}" == "kvdo" ]; then echo "WARNING: Found ${module} module previously loaded (Version: $(cat /sys/kvdo/version 2>/dev/null || echo Unknown)). A reboot is recommended before attempting to use the newly installed module." else echo "WARNING: Found ${module} module previously loaded. A reboot is recommended before attempting to use the newly installed module." fi fi done %post modules=( $(find /lib/modules/%{kmod_headers_version}/extra/kmod-%{kmod_name} | grep '\.ko$') ) printf '%s\n' "${modules[@]}" >> /var/lib/rpm-kmod-posttrans-weak-modules-add %pretrans -p posix.unlink("/var/lib/rpm-kmod-posttrans-weak-modules-add") %posttrans if [ -f "/var/lib/rpm-kmod-posttrans-weak-modules-add" ]; then modules=( $(cat /var/lib/rpm-kmod-posttrans-weak-modules-add) ) rm -rf /var/lib/rpm-kmod-posttrans-weak-modules-add printf '%s\n' "${modules[@]}" | %{_sbindir}/weak-modules --dracut=/usr/bin/dracut --add-modules fi %preun rpm -ql kmod-kvdo-%{kmod_driver_version}-%{kmod_rpm_release}%{?dist}.$(arch) | grep '\.ko$' > /var/run/rpm-kmod-%{kmod_name}-modules # Check whether kvdo or uds is loaded, and if so attempt to remove it. A # failure to unload means there is still something using the module. To make # sure the user is aware, we print a warning with recommended instructions. for module in kvdo uds; do if grep -q "^${module}" /proc/modules; then warnMessage="WARNING: ${module} in use. Changes will take effect after a reboot." modprobe -r ${module} 2>/dev/null || echo ${warnMessage} && /usr/bin/true fi done %postun modules=( $(cat /var/run/rpm-kmod-%{kmod_name}-modules) ) rm /var/run/rpm-kmod-%{kmod_name}-modules printf '%s\n' "${modules[@]}" | %{_sbindir}/weak-modules --dracut=/usr/bin/dracut --remove-modules %files %defattr(644,root,root,755) /lib/modules/%{kmod_headers_version} /etc/depmod.d/%{kmod_name}.conf /usr/share/doc/kmod-%{kmod_name}/greylist.txt %prep %setup -n %{kmod_name}-%{commit} %{nil} set -- * mkdir source mv "$@" source/ mkdir obj %build rm -rf obj cp -r source obj make -C %{kernel_source} M=$PWD/obj/%{kmod_kbuild_dir} V=1 \ NOSTDINC_FLAGS="-I $PWD/obj/include -I $PWD/obj/include/uapi" # mark modules executable so that strip-to-file can strip them find obj/%{kmod_kbuild_dir} -name "*.ko" -type f -exec chmod u+x '{}' + whitelist="/lib/modules/kabi-current/kabi_whitelist_%{_target_cpu}" for modules in $( find obj/%{kmod_kbuild_dir} -name "*.ko" -type f -printf "%{findpat}\n" | sed 's|\.ko$||' | sort -u ) ; do # update depmod.conf module_weak_path=$(echo $modules | sed 's/[\/]*[^\/]*$//') if [ -z "$module_weak_path" ]; then module_weak_path=%{name} else module_weak_path=%{name}/$module_weak_path fi echo "override $(echo $modules | sed 's/.*\///') $(echo %{kmod_headers_version} | sed 's/\.[^\.]*$//').* weak-updates/$module_weak_path" >> source/depmod.conf # update greylist nm -u obj/%{kmod_kbuild_dir}/$modules.ko | sed 's/.*U //' | sed 's/^\.//' | sort -u | while read -r symbol; do grep -q "^\s*$symbol\$" $whitelist || echo "$symbol" >> source/greylist done done sort -u source/greylist | uniq > source/greylist.txt %install export INSTALL_MOD_PATH=$RPM_BUILD_ROOT export INSTALL_MOD_DIR=extra/%{name} make -C %{kernel_source} modules_install V=1 \ M=$PWD/obj/%{kmod_kbuild_dir} # Cleanup unnecessary kernel-generated module dependency files. find $INSTALL_MOD_PATH/lib/modules -iname 'modules.*' -exec rm {} \; install -m 644 -D source/depmod.conf $RPM_BUILD_ROOT/etc/depmod.d/%{kmod_name}.conf install -m 644 -D source/greylist.txt $RPM_BUILD_ROOT/usr/share/doc/kmod-%{kmod_name}/greylist.txt %clean rm -rf $RPM_BUILD_ROOT %changelog * Tue May 04 2021 - Andy Walsh - 8.1.0.4-1 - Initial build for EL9 - Related: rhbz#1955374