diff --git a/pkgs/os-specific/linux/zfs/default.nix b/pkgs/os-specific/linux/zfs/default.nix index 67ed1312826a..162824b1c5ba 100644 --- a/pkgs/os-specific/linux/zfs/default.nix +++ b/pkgs/os-specific/linux/zfs/default.nix @@ -8,7 +8,7 @@ stdenv.mkDerivation { sha256 = "18b5f18k8mwb17r5ippsilmp1a2sqjw9fwn0z82159dkhsadg33b"; }; - patches = [ ./mount_zfs_prefix.patch ./nix-build.patch ]; + patches = [ ./mount_zfs_prefix.patch ./nix-build.patch ./libblkid-1db7b9b.patch ]; buildInputs = [ spl perl autoconf automake libtool zlib libuuid coreutils ]; diff --git a/pkgs/os-specific/linux/zfs/libblkid-1db7b9b.patch b/pkgs/os-specific/linux/zfs/libblkid-1db7b9b.patch new file mode 100644 index 000000000000..894bf395ce85 --- /dev/null +++ b/pkgs/os-specific/linux/zfs/libblkid-1db7b9b.patch @@ -0,0 +1,118 @@ +commit 1db7b9be75a225cedb3b7a60028ca5695e5b8346 +Author: Richard Yao +Date: Wed Aug 28 16:17:47 2013 -0400 + + Fix libblkid support + + libblkid support is dormant because the autotools check is broken and + liblkid identifies ZFS vdevs as "zfs_member", not "zfs". We fix that + with a few changes: + + First, we fix the libblkid autotools check to do a few things: + + 1. Make a 64MB file, which is the minimum size ZFS permits. + 2. Make 4 fake uberblock entries to make libblkid's check succeed. + 3. Return 0 upon success to make autotools use the success case. + 4. Include stdlib.h to avoid implicit declration of free(). + 5. Check for "zfs_member", not "zfs" + 6. Make --with-blkid disable autotools check (avoids Gentoo sandbox violation) + 7. Pass '-lblkid' correctly using LIBS not LDFLAGS. + + Second, we change the libblkid support to scan for "zfs_member", not + "zfs". + + This makes --with-blkid work on Gentoo. + + Signed-off-by: Richard Yao + Signed-off-by: Brian Behlendorf + Issue #1751 + +diff --git a/config/user-libblkid.m4 b/config/user-libblkid.m4 +index 276587f..2dd2623 100644 +--- a/config/user-libblkid.m4 ++++ b/config/user-libblkid.m4 +@@ -22,26 +22,45 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_LIBBLKID], [ + [with_blkid=check]) + + LIBBLKID= +- AS_IF([test "x$with_blkid" != xno], ++ AS_IF([test "x$with_blkid" = xyes], ++ [ ++ AC_SUBST([LIBBLKID], ["-lblkid"]) ++ AC_DEFINE([HAVE_LIBBLKID], 1, ++ [Define if you have libblkid]) ++ ]) ++ ++ AS_IF([test "x$with_blkid" = xcheck], + [ + AC_CHECK_LIB([blkid], [blkid_get_cache], + [ + AC_MSG_CHECKING([for blkid zfs support]) + + ZFS_DEV=`mktemp` +- dd if=/dev/zero of=$ZFS_DEV bs=1024k count=8 \ ++ truncate -s 64M $ZFS_DEV ++ echo -en "\x0c\xb1\xba\0\0\0\0\0" | \ ++ dd of=$ZFS_DEV bs=1k count=8 \ ++ seek=128 conv=notrunc &>/dev/null \ + >/dev/null 2>/dev/null + echo -en "\x0c\xb1\xba\0\0\0\0\0" | \ + dd of=$ZFS_DEV bs=1k count=8 \ + seek=132 conv=notrunc &>/dev/null \ + >/dev/null 2>/dev/null ++ echo -en "\x0c\xb1\xba\0\0\0\0\0" | \ ++ dd of=$ZFS_DEV bs=1k count=8 \ ++ seek=136 conv=notrunc &>/dev/null \ ++ >/dev/null 2>/dev/null ++ echo -en "\x0c\xb1\xba\0\0\0\0\0" | \ ++ dd of=$ZFS_DEV bs=1k count=8 \ ++ seek=140 conv=notrunc &>/dev/null \ ++ >/dev/null 2>/dev/null + +- saved_LDFLAGS="$LDFLAGS" +- LDFLAGS="-lblkid" ++ saved_LIBS="$LIBS" ++ LIBS="-lblkid" + + AC_RUN_IFELSE([AC_LANG_PROGRAM( + [ + #include ++ #include + #include + ], + [ +@@ -58,10 +77,10 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_LIBBLKID], [ + return 2; + } + +- if (strcmp(value, "zfs")) { ++ if (strcmp(value, "zfs_member")) { + free(value); + blkid_put_cache(cache); +- return 3; ++ return 0; + } + + free(value); +@@ -82,7 +101,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_LIBBLKID], [ + [--with-blkid given but unavailable])]) + ]) + +- LDFLAGS="$saved_LDFLAGS" ++ LIBS="$saved_LIBS" + ], + [ + AS_IF([test "x$with_blkid" != xcheck], +diff --git a/lib/libzfs/libzfs_import.c b/lib/libzfs/libzfs_import.c +index 53609f2..d1fa98e 100644 +--- a/lib/libzfs/libzfs_import.c ++++ b/lib/libzfs/libzfs_import.c +@@ -965,7 +965,7 @@ zpool_find_import_blkid(libzfs_handle_t *hdl, pool_list_t *pools) + goto err_blkid2; + } + +- err = blkid_dev_set_search(iter, "TYPE", "zfs"); ++ err = blkid_dev_set_search(iter, "TYPE", "zfs_member"); + if (err != 0) { + (void) zfs_error_fmt(hdl, EZFS_BADCACHE, + dgettext(TEXT_DOMAIN, "blkid_dev_set_search() %d"), err);