diff options
author | Raito Bezarius <masterancpp@gmail.com> | 2023-03-29 14:13:21 +0200 |
---|---|---|
committer | Jörg Thalheim <joerg@thalheim.io> | 2023-06-16 11:07:33 +0200 |
commit | d4cab20b3a76fef4b9a487c37107df6351ebce33 (patch) | |
tree | 676c0f1af7b490d0d01aad56b4df9450919b6447 | |
parent | 0b62a4642d074926e94018aff3d707af5302da6f (diff) | |
download | nixpkgs-d4cab20b3a76fef4b9a487c37107df6351ebce33.tar nixpkgs-d4cab20b3a76fef4b9a487c37107df6351ebce33.tar.gz nixpkgs-d4cab20b3a76fef4b9a487c37107df6351ebce33.tar.bz2 nixpkgs-d4cab20b3a76fef4b9a487c37107df6351ebce33.tar.lz nixpkgs-d4cab20b3a76fef4b9a487c37107df6351ebce33.tar.xz nixpkgs-d4cab20b3a76fef4b9a487c37107df6351ebce33.tar.zst nixpkgs-d4cab20b3a76fef4b9a487c37107df6351ebce33.zip |
zfs: add option to restore kernel_neon for linux 6.2 support on aarch64
Introduced in https://github.com/torvalds/linux/commit/aaeca98456431a8d9382ecf48ac4843e252c07b3 with the usual disdain for ZFS. We have been there in the past with <https://www.phoronix.com/news/NixOS-Linux-5.0-ZFS-FPU-Drop> / https://github.com/NixOS/nixpkgs/pull/61076. This fixes ZFS on aarch64 until the next breakage. See https://github.com/openzfs/zfs/issues/14555 for original upstream issue.
-rw-r--r-- | nixos/modules/tasks/filesystems/zfs.nix | 47 | ||||
-rw-r--r-- | pkgs/os-specific/linux/zfs/stable.nix | 8 | ||||
-rw-r--r-- | pkgs/os-specific/linux/zfs/unstable.nix | 16 |
3 files changed, 60 insertions, 11 deletions
diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix index 16dc0c44c18..3f75def0250 100644 --- a/nixos/modules/tasks/filesystems/zfs.nix +++ b/nixos/modules/tasks/filesystems/zfs.nix @@ -323,6 +323,30 @@ in Defaults to 0, which waits forever. ''; }; + + removeLinuxDRM = lib.mkOption { + type = types.bool; + default = false; + description = lib.mdDoc '' + Linux 6.2 dropped some kernel symbols required on aarch64 required by zfs. + Enabling this option will bring them back to allow this kernel version. + Note that in some jurisdictions this may be illegal as it might be considered + removing copyright protection from the code. + See https://www.ifross.org/?q=en/artikel/ongoing-dispute-over-value-exportsymbolgpl-function for further information. + + If configure your kernel package with `zfs.latestCompatibleLinuxPackages`, you will need to also pass removeLinuxDRM to that package like this: + + ``` + { pkgs, ... }: { + boot.kernelPackages = (pkgs.zfs.override { + removeLinuxDRM = pkgs.hostPlatform.isAarch64; + }).latestCompatibleLinuxPackages; + + boot.zfs.removeLinuxDRM = true; + } + ``` + ''; + }; }; services.zfs.autoSnapshot = { @@ -532,11 +556,13 @@ in # https://github.com/NixOS/nixpkgs/issues/106093 kernelParams = lib.optionals (!config.boot.zfs.allowHibernation) [ "nohibernate" ]; - extraModulePackages = [ - (if config.boot.zfs.enableUnstable then + extraModulePackages = let + kernelPkg = if config.boot.zfs.enableUnstable then config.boot.kernelPackages.zfsUnstable else - config.boot.kernelPackages.zfs) + config.boot.kernelPackages.zfs; + in [ + (kernelPkg.override { inherit (cfgZfs) removeLinuxDRM; }) ]; }; @@ -654,6 +680,21 @@ in services.udev.packages = [ cfgZfs.package ]; # to hook zvol naming, etc. systemd.packages = [ cfgZfs.package ]; + # Export kernel_neon_* symbols again. + # This change is necessary until ZFS figures out a solution + # with upstream or in their build system to fill the gap for + # this symbol. + # In the meantime, we restore what was once a working piece of code + # in the kernel. + boot.kernelPatches = lib.optional (cfgZfs.removeLinuxDRM && pkgs.stdenv.hostPlatform.system == "aarch64-linux") { + name = "export-neon-symbols-as-gpl"; + patch = pkgs.fetchpatch { + url = "https://github.com/torvalds/linux/commit/aaeca98456431a8d9382ecf48ac4843e252c07b3.patch"; + hash = "sha256-L2g4G1tlWPIi/QRckMuHDcdWBcKpObSWSRTvbHRIwIk="; + revert = true; + }; + }; + systemd.services = let createImportService' = pool: createImportService { inherit pool; diff --git a/pkgs/os-specific/linux/zfs/stable.nix b/pkgs/os-specific/linux/zfs/stable.nix index 77ea4bb84b4..e208bcba9c7 100644 --- a/pkgs/os-specific/linux/zfs/stable.nix +++ b/pkgs/os-specific/linux/zfs/stable.nix @@ -2,6 +2,7 @@ , kernel ? null , stdenv , linuxKernel +, removeLinuxDRM ? false , ... } @ args: @@ -11,10 +12,13 @@ in callPackage ./generic.nix args { # check the release notes for compatible kernels kernelCompatible = - if stdenv'.isx86_64 + if stdenv'.isx86_64 || removeLinuxDRM then kernel.kernelOlder "6.4" else kernel.kernelOlder "6.2"; - latestCompatibleLinuxPackages = linuxKernel.packages.linux_6_3; + latestCompatibleLinuxPackages = if stdenv'.isx86_64 || removeLinuxDRM then + linuxKernel.packages.linux_6_3 + else + linuxKernel.packages.linux_6_1; # this package should point to the latest release. version = "2.1.12"; diff --git a/pkgs/os-specific/linux/zfs/unstable.nix b/pkgs/os-specific/linux/zfs/unstable.nix index b8cf789e8ff..f262f77970b 100644 --- a/pkgs/os-specific/linux/zfs/unstable.nix +++ b/pkgs/os-specific/linux/zfs/unstable.nix @@ -2,6 +2,7 @@ , kernel ? null , stdenv , linuxKernel +, removeLinuxDRM ? false , ... } @ args: @@ -13,19 +14,22 @@ callPackage ./generic.nix args { # NOTE: # zfs-2.1.9<=x<=2.1.10 is broken with aarch64-linux-6.2 # for future releases, please delete this condition. - kernelCompatible = if stdenv'.isx86_64 - then kernel.kernelOlder "6.3" + kernelCompatible = if stdenv'.isx86_64 || removeLinuxDRM + then kernel.kernelOlder "6.4" else kernel.kernelOlder "6.2"; - latestCompatibleLinuxPackages = linuxKernel.packages.linux_6_1; + + latestCompatibleLinuxPackages = if stdenv'.isx86_64 || removeLinuxDRM then + linuxKernel.packages.linux_6_3 + else + linuxKernel.packages.linux_6_1; # this package should point to a version / git revision compatible with the latest kernel release # IMPORTANT: Always use a tagged release candidate or commits from the # zfs-<version>-staging branch, because this is tested by the OpenZFS # maintainers. - version = "2.1.12-staging-2023-04-18"; - rev = "e25f9131d679692704c11dc0c1df6d4585b70c35"; + version = "2.1.12"; - sha256 = "tJLwyqUj1l5F0WKZDeMGrEFa8fc/axKqm31xtN51a5M="; + sha256 = "eYUR5d4gpTrlFu6j1uL83DWL9uPGgAUDRdSEb73V5i4="; isUnstable = true; } |