From 419a71e1e533fcc380f27d902194c8878882fa20 Mon Sep 17 00:00:00 2001 From: "Ricardo M. Correia" Date: Sat, 22 Mar 2014 18:27:23 +0100 Subject: [PATCH] spl, zfs: Add git versions, based on recent commits Upstream has not been tagging new versions for a long time, but we need compatibility with newer kernels. The 0.6.2 versions already have a bunch of backported compatibility patches, but 3.14 kernels need even more. Also, the git versions have fixed a bunch of crashes and other bugs, so perhaps we should just bite the bullet and just use recent git versions (as sometimes upstream recommends, when people run into bugs). This adds a new "boot.zfs.useGit" boolean option, so that a user can easily opt into using the git versions. --- nixos/modules/tasks/filesystems/zfs.nix | 39 +++++++++++++------ pkgs/os-specific/linux/spl/git.nix | 46 ++++++++++++++++++++++ pkgs/os-specific/linux/zfs/git.nix | 52 +++++++++++++++++++++++++ pkgs/top-level/all-packages.nix | 6 ++- 4 files changed, 129 insertions(+), 14 deletions(-) create mode 100644 pkgs/os-specific/linux/spl/git.nix create mode 100644 pkgs/os-specific/linux/zfs/git.nix diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix index 1d75a24692c0..d7deb44c407c 100644 --- a/nixos/modules/tasks/filesystems/zfs.nix +++ b/nixos/modules/tasks/filesystems/zfs.nix @@ -11,6 +11,7 @@ with lib; let cfgSpl = config.boot.spl; + cfgZfs = config.boot.zfs; cfgSnapshots = config.services.zfs.autoSnapshot; inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems; @@ -21,8 +22,11 @@ let kernel = config.boot.kernelPackages; + splPkg = if cfgZfs.useGit then kernel.spl_git else kernel.spl; + zfsPkg = if cfgZfs.useGit then kernel.zfs_git else kernel.zfs; + autosnapPkg = pkgs.zfstools.override { - zfs = config.boot.kernelPackages.zfs; + zfs = zfsPkg; }; zfsAutoSnap = "${autosnapPkg}/bin/zfs-auto-snapshot"; @@ -47,6 +51,17 @@ in ''; }; + boot.zfs.useGit = mkOption { + type = types.bool; + default = false; + example = true; + description = '' + Use the git version of the SPL and ZFS packages. + Note that these are unreleased versions, with less testing, and therefore + may be more unstable. + ''; + }; + services.zfs.autoSnapshot = { enable = mkOption { default = false; @@ -111,7 +126,7 @@ in (mkIf enableZfs { boot = { kernelModules = [ "spl" "zfs" ] ; - extraModulePackages = [ kernel.zfs kernel.spl ]; + extraModulePackages = [ splPkg zfsPkg ]; extraModprobeConfig = mkIf (cfgSpl.hostid != "") '' options spl spl_hostid=${cfgSpl.hostid} ''; @@ -121,10 +136,10 @@ in kernelModules = [ "spl" "zfs" ] ; extraUtilsCommands = '' - cp -v ${kernel.zfs}/sbin/zfs $out/bin - cp -v ${kernel.zfs}/sbin/zdb $out/bin - cp -v ${kernel.zfs}/sbin/zpool $out/bin - cp -pdv ${kernel.zfs}/lib/lib*.so* $out/lib + cp -v ${zfsPkg}/sbin/zfs $out/bin + cp -v ${zfsPkg}/sbin/zdb $out/bin + cp -v ${zfsPkg}/sbin/zpool $out/bin + cp -pdv ${zfsPkg}/lib/lib*.so* $out/lib cp -pdv ${pkgs.zlib}/lib/lib*.so* $out/lib ''; postDeviceCommands = @@ -139,7 +154,7 @@ in serviceConfig = { Type = "oneshot"; RemainAfterExit = true; - ExecStart = "${kernel.zfs}/sbin/zpool import -f -a"; + ExecStart = "${zfsPkg}/sbin/zpool import -f -a"; }; restartIfChanged = false; }; @@ -151,15 +166,15 @@ in serviceConfig = { Type = "oneshot"; RemainAfterExit = true; - ExecStart = "${kernel.zfs}/sbin/zfs mount -a"; - ExecStop = "${kernel.zfs}/sbin/zfs umount -a"; + ExecStart = "${zfsPkg}/sbin/zfs mount -a"; + ExecStop = "${zfsPkg}/sbin/zfs umount -a"; }; restartIfChanged = false; }; - system.fsPackages = [ kernel.zfs ]; # XXX: needed? zfs doesn't have (need) a fsck - environment.systemPackages = [ kernel.zfs ]; - services.udev.packages = [ kernel.zfs ]; # to hook zvol naming, etc. + system.fsPackages = [ zfsPkg ]; # XXX: needed? zfs doesn't have (need) a fsck + environment.systemPackages = [ zfsPkg ]; + services.udev.packages = [ zfsPkg ]; # to hook zvol naming, etc. }) (mkIf enableAutoSnapshots { diff --git a/pkgs/os-specific/linux/spl/git.nix b/pkgs/os-specific/linux/spl/git.nix new file mode 100644 index 000000000000..ba7ccc7348ee --- /dev/null +++ b/pkgs/os-specific/linux/spl/git.nix @@ -0,0 +1,46 @@ +{ stdenv, fetchgit, kernel, perl, autoconf, automake, libtool, coreutils, gawk }: + +stdenv.mkDerivation { + name = "spl-0.6.3pre-${kernel.version}"; + src = fetchgit { + url = git://github.com/zfsonlinux/spl.git; + rev = "89aa97059d7ddad668a5118aef7914743162a5e8"; + sha256 = "1x4pba26zbyly8xd9q8s4av9v88ck0n9szxx72wzcn0s25rsyanx"; + }; + + patches = [ ./install_prefix.patch ]; + + buildInputs = [ perl autoconf automake libtool ]; + + preConfigure = '' + ./autogen.sh + + substituteInPlace ./module/spl/spl-generic.c --replace /usr/bin/hostid hostid + substituteInPlace ./module/spl/spl-module.c --replace /bin/mknod mknod + + substituteInPlace ./module/spl/spl-generic.c --replace "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PATH=${coreutils}:${gawk}:/bin" + substituteInPlace ./module/splat/splat-vnode.c --replace "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PATH=${coreutils}:/bin" + substituteInPlace ./module/splat/splat-linux.c --replace "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PATH=${coreutils}:/bin" + ''; + + configureFlags = '' + --with-linux=${kernel.dev}/lib/modules/${kernel.modDirVersion}/source + --with-linux-obj=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build + ''; + + enableParallelBuilding = true; + + meta = { + description = "Kernel module driver for solaris porting layer (needed by in-kernel zfs)"; + + longDescription = '' + This kernel module is a porting layer for ZFS to work inside the linux + kernel. + ''; + + homepage = http://zfsonlinux.org/; + platforms = stdenv.lib.platforms.linux; + license = stdenv.lib.licenses.gpl2Plus; + maintainers = with stdenv.lib.maintainers; [ wizeman ]; + }; +} diff --git a/pkgs/os-specific/linux/zfs/git.nix b/pkgs/os-specific/linux/zfs/git.nix new file mode 100644 index 000000000000..cc75011c7da9 --- /dev/null +++ b/pkgs/os-specific/linux/zfs/git.nix @@ -0,0 +1,52 @@ +{ stdenv, fetchgit, kernel, spl_git, perl, autoconf, automake, libtool, zlib, libuuid, coreutils, utillinux }: + +stdenv.mkDerivation { + name = "zfs-0.6.3pre-${kernel.version}"; + + src = fetchgit { + url = git://github.com/zfsonlinux/zfs.git; + rev = "de39ec11b885f97e6256324ee89eaf75af9852f6"; + sha256 = "02hrhka9hg0vn4z20x7xzwrkr340pv9qwvwj8phjdm5ln321jh33"; + }; + + patches = [ ./mount_zfs_prefix.patch ./nix-build.patch ]; + + buildInputs = [ spl_git perl autoconf automake libtool zlib libuuid coreutils ]; + + # for zdb to get the rpath to libgcc_s, needed for pthread_cancel to work + NIX_CFLAGS_LINK = "-lgcc_s"; + + preConfigure = '' + ./autogen.sh + + substituteInPlace ./module/zfs/zfs_ctldir.c --replace "umount -t zfs" "${utillinux}/bin/umount -t zfs" + substituteInPlace ./module/zfs/zfs_ctldir.c --replace "mount -t zfs" "${utillinux}/bin/mount -t zfs" + substituteInPlace ./lib/libzfs/libzfs_mount.c --replace "/bin/umount" "${utillinux}/bin/umount" + substituteInPlace ./lib/libzfs/libzfs_mount.c --replace "/bin/mount" "${utillinux}/bin/mount" + substituteInPlace ./udev/rules.d/* --replace "/lib/udev/vdev_id" "$out/lib/udev/vdev_id" + substituteInPlace ./cmd/ztest/ztest.c --replace "/usr/sbin/ztest" "$out/sbin/ztest" + substituteInPlace ./cmd/ztest/ztest.c --replace "/usr/sbin/zdb" "$out/sbin/zdb" + ''; + + configureFlags = '' + --disable-systemd + --with-linux=${kernel.dev}/lib/modules/${kernel.modDirVersion}/source + --with-linux-obj=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build + --with-spl=${spl_git}/libexec/spl + ''; + + enableParallelBuilding = true; + + meta = { + description = "ZFS Filesystem Linux Kernel module"; + longDescription = '' + ZFS is a filesystem that combines a logical volume manager with a + Copy-On-Write filesystem with data integrity detection and repair, + snapshotting, cloning, block devices, deduplication, and more. + ''; + homepage = http://zfsonlinux.org/; + license = stdenv.lib.licenses.cddl; + platforms = stdenv.lib.platforms.linux; + maintainers = with stdenv.lib.maintainers; [ wizeman ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 579e8d741d9f..07345ee5a8fb 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -7078,7 +7078,8 @@ let psmouse_alps = callPackage ../os-specific/linux/psmouse-alps { }; - spl = callPackage ../os-specific/linux/spl/default.nix { }; + spl = callPackage ../os-specific/linux/spl { }; + spl_git = callPackage ../os-specific/linux/spl/git.nix { }; sysdig = callPackage ../os-specific/linux/sysdig {}; @@ -7094,7 +7095,8 @@ let virtualboxGuestAdditions = callPackage ../applications/virtualization/virtualbox/guest-additions { }; - zfs = callPackage ../os-specific/linux/zfs/default.nix { }; + zfs = callPackage ../os-specific/linux/zfs { }; + zfs_git = callPackage ../os-specific/linux/zfs/git.nix { }; }; # Build the kernel modules for the some of the kernels.