diff options
author | V3n3RiX <venerix@redcorelinux.org> | 2017-10-09 18:53:29 +0100 |
---|---|---|
committer | V3n3RiX <venerix@redcorelinux.org> | 2017-10-09 18:53:29 +0100 |
commit | 4f2d7949f03e1c198bc888f2d05f421d35c57e21 (patch) | |
tree | ba5f07bf3f9d22d82e54a462313f5d244036c768 /sys-fs/zfs-kmod/files |
reinit the tree, so we can have metadata
Diffstat (limited to 'sys-fs/zfs-kmod/files')
20 files changed, 1566 insertions, 0 deletions
diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-fix-invisible-snapshots.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-fix-invisible-snapshots.patch new file mode 100644 index 000000000000..2daf211c7744 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-fix-invisible-snapshots.patch @@ -0,0 +1,39 @@ +From 1c50c992bafd96773dc3950d382a89806df8cc9c Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Wed, 9 Jan 2013 11:09:06 -0800 +Subject: [PATCH] Revert "Avoid ELOOP on auto-mounted snapshots" + +This reverts commit 7afcf5b1da83549bfba70a61fae7a00eaa63c2b0 which +accidentally introduced a regression with the .zfs snapshot directory. +While the updated code still does correctly mount the requested +snapshot. It updates the vfsmount such that it references the +original dataset vfsmount. The result is that the snapshot itself +isn't visible. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Issue #816 +--- + module/zfs/zpl_ctldir.c | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/module/zfs/zpl_ctldir.c b/module/zfs/zpl_ctldir.c +index a2d8fa9..7dfaf6e 100644 +--- a/module/zfs/zpl_ctldir.c ++++ b/module/zfs/zpl_ctldir.c +@@ -357,13 +357,6 @@ + return ERR_PTR(error); + + /* +- * Ensure path->dentry points to the dentry for the root of the +- * newly-mounted snapshot, otherwise this function may be called +- * repeatedly which can lead to an incorrect ELOOP error return. +- */ +- follow_up(path); +- +- /* + * Rather than returning the new vfsmount for the snapshot we must + * return NULL to indicate a mount collision. This is done because + * the user space mount calls do_add_mount() which adds the vfsmount +-- +1.7.10 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-fix-recursive-reader.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-fix-recursive-reader.patch new file mode 100644 index 000000000000..7d0263f31901 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-fix-recursive-reader.patch @@ -0,0 +1,40 @@ +diff --git a/module/zfs/dsl_dataset.c b/module/zfs/dsl_dataset.c +index 21fdd08..872d44a 100644 +--- a/module/zfs/dsl_dataset.c ++++ b/module/zfs/dsl_dataset.c +@@ -20,7 +20,7 @@ + */ + /* + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +- * Copyright (c) 2011 by Delphix. All rights reserved. ++ * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + */ + +@@ -4158,9 +4220,13 @@ struct dsl_ds_releasearg { + dsl_dataset_t *snap; + uint64_t used, comp, uncomp; + +- err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &snap); +- if (err != 0) +- break; ++ if (snapobj == new->ds_object) { ++ snap = new; ++ } else { ++ err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &snap); ++ if (err != 0) ++ break; ++ } + + if (snap->ds_phys->ds_prev_snap_txg == + oldsnap->ds_phys->ds_creation_txg) { +@@ -4189,7 +4255,8 @@ struct dsl_ds_releasearg { + * was not a snapshot of/before new. + */ + snapobj = snap->ds_phys->ds_prev_snap_obj; +- dsl_dataset_rele(snap, FTAG); ++ if (snap != new) ++ dsl_dataset_rele(snap, FTAG); + if (snapobj == 0) { + err = EINVAL; + break; diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-gcc-4.7-compat.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-gcc-4.7-compat.patch new file mode 100644 index 000000000000..9f31ecc82307 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc13-gcc-4.7-compat.patch @@ -0,0 +1,51 @@ +From 37f000c5aa76613e644cf3e5b1ec7bd2df6f7451 Mon Sep 17 00:00:00 2001 +From: Ned Bass <bass6@llnl.gov> +Date: Wed, 26 Dec 2012 14:56:41 -0800 +Subject: [PATCH] Fix gcc array subscript above bounds warning + +In a debug build, certain GCC versions flag an array bounds warning in +the below code from dnode_sync.c + + } else { + int i; + ASSERT(dn->dn_next_nblkptr[txgoff] < dnp->dn_nblkptr); + /* the blkptrs we are losing better be unallocated */ + for (i = dn->dn_next_nblkptr[txgoff]; + i < dnp->dn_nblkptr; i++) + ASSERT(BP_IS_HOLE(&dnp->dn_blkptr[i])); + +This usage is in fact safe, since the ASSERT ensures the index does +not exceed to maximum possible number of block pointers. However gcc +can't determine that the assignment 'i = dn->dn_next_nblkptr[txgoff];' +falls within the array bounds so it issues a warning. To avoid this, +initialize i to zero to make gcc happy but skip the elements before +dn->dn_next_nblkptr[txgoff] in the loop body. Since a dnode contains +at most 3 block pointers this overhead should be negligible. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Closes #950 +--- + module/zfs/dnode_sync.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/module/zfs/dnode_sync.c b/module/zfs/dnode_sync.c +index af636dc..f2dda86 100644 +--- a/module/zfs/dnode_sync.c ++++ b/module/zfs/dnode_sync.c +@@ -666,9 +666,10 @@ + int i; + ASSERT(dn->dn_next_nblkptr[txgoff] < dnp->dn_nblkptr); + /* the blkptrs we are losing better be unallocated */ +- for (i = dn->dn_next_nblkptr[txgoff]; +- i < dnp->dn_nblkptr; i++) +- ASSERT(BP_IS_HOLE(&dnp->dn_blkptr[i])); ++ for (i = 0; i < dnp->dn_nblkptr; i++) { ++ if (i >= dn->dn_next_nblkptr[txgoff]) ++ ASSERT(BP_IS_HOLE(&dnp->dn_blkptr[i])); ++ } + #endif + } + mutex_enter(&dn->dn_mtx); +-- +1.7.10 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-cast-const-for-32bit-compatibility.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-cast-const-for-32bit-compatibility.patch new file mode 100644 index 000000000000..13189244c69a --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-cast-const-for-32bit-compatibility.patch @@ -0,0 +1,36 @@ +From dd26aa535b395735ca61ea2a3e618aded45eb05e Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Mon, 4 Feb 2013 16:35:54 -0800 +Subject: [PATCH] Cast 'zfs bad bloc' to ULL for x86 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Explicitly case this value to an unsigned long long for 32-bit +systems to inform the compiler that a long type should not be +used. Otherwise we get the following compiler error: + + dmu_send.c:376: error: integer constant is too large for + ‘long’ type + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +--- + module/zfs/dmu_send.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/module/zfs/dmu_send.c b/module/zfs/dmu_send.c +index 0cf3c4a..921c3d7 100644 +--- a/module/zfs/dmu_send.c ++++ b/module/zfs/dmu_send.c +@@ -373,7 +373,7 @@ + for (ptr = abuf->b_data; + (char *)ptr < (char *)abuf->b_data + blksz; + ptr++) +- *ptr = 0x2f5baddb10c; ++ *ptr = 0x2f5baddb10cULL; + } else { + return (EIO); + } +-- +1.7.10 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-flush-properly.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-flush-properly.patch new file mode 100644 index 000000000000..fb4c7c35696c --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-flush-properly.patch @@ -0,0 +1,42 @@ +diff --git a/config/kernel.m4 b/config/kernel.m4 +index 5623785..9d5aa46 100644 +--- a/config/kernel.m4 ++++ b/config/kernel.m4 +@@ -16,7 +16,6 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ + ZFS_AC_KERNEL_INVALIDATE_BDEV_ARGS + ZFS_AC_KERNEL_BDEV_LOGICAL_BLOCK_SIZE + ZFS_AC_KERNEL_BDEV_PHYSICAL_BLOCK_SIZE +- ZFS_AC_KERNEL_BIO_EMPTY_BARRIER + ZFS_AC_KERNEL_BIO_FAILFAST + ZFS_AC_KERNEL_BIO_FAILFAST_DTD + ZFS_AC_KERNEL_REQ_FAILFAST_MASK +diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c +index cbf0a4d..e902a70 100644 +--- a/module/zfs/vdev_disk.c ++++ b/module/zfs/vdev_disk.c +@@ -604,8 +604,6 @@ + return __vdev_disk_physio(bdev, NULL, kbuf, size, offset, flags); + } + +-/* 2.6.24 API change */ +-#ifdef HAVE_BIO_EMPTY_BARRIER + BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, size, rc) + { + zio_t *zio = bio->bi_private; +@@ -646,13 +644,6 @@ + + return 0; + } +-#else +-static int +-vdev_disk_io_flush(struct block_device *bdev, zio_t *zio) +-{ +- return ENOTSUP; +-} +-#endif /* HAVE_BIO_EMPTY_BARRIER */ + + static int + vdev_disk_io_start(zio_t *zio) +-- +1.7.10 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-improved-autotools-checks.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-improved-autotools-checks.patch new file mode 100644 index 000000000000..15d5af34d5c5 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-improved-autotools-checks.patch @@ -0,0 +1,105 @@ +From d75af3c0ebb4e31ece087aeecfeff282cb6f1361 Mon Sep 17 00:00:00 2001 +From: Etienne Dechamps <etienne@edechamps.fr> +Date: Sun, 24 Feb 2013 12:42:28 +0000 +Subject: [PATCH] Use -Werror for all kernel configure tests. + +As a matter of fact, we're already using -Werror for most tests because +of a bug in kernel-bio-empty-barrier.m4 which sets -Werror without +reverting it afterwards. This meant that all tests which ran after this +one was using -Werror. + +This patch simply makes it clear that we're using -Werror and makes +the code more readable and more predictable. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Closes #1317 +--- + config/kernel-bio-empty-barrier.m4 | 1 - + config/kernel-bio-end-io-t-args.m4 | 3 --- + config/kernel-security-inode-init.m4 | 6 ------ + config/kernel.m4 | 2 +- + 4 files changed, 1 insertion(+), 11 deletions(-) + +diff --git a/config/kernel-bio-empty-barrier.m4 b/config/kernel-bio-empty-barrier.m4 +index 99549fe..fda16b3 100644 +--- a/config/kernel-bio-empty-barrier.m4 ++++ b/config/kernel-bio-empty-barrier.m4 +@@ -4,7 +4,6 @@ dnl # Empty write barriers are now supported and we should use them. + dnl # + AC_DEFUN([ZFS_AC_KERNEL_BIO_EMPTY_BARRIER], [ + AC_MSG_CHECKING([whether bio_empty_barrier() is defined]) +- EXTRA_KCFLAGS="-Werror" + ZFS_LINUX_TRY_COMPILE([ + #include <linux/bio.h> + ],[ +diff --git a/config/kernel-bio-end-io-t-args.m4 b/config/kernel-bio-end-io-t-args.m4 +index ced4861..44e4826 100644 +--- a/config/kernel-bio-end-io-t-args.m4 ++++ b/config/kernel-bio-end-io-t-args.m4 +@@ -9,8 +9,6 @@ dnl # to void. + dnl # + AC_DEFUN([ZFS_AC_KERNEL_BIO_END_IO_T_ARGS], [ + AC_MSG_CHECKING([whether bio_end_io_t wants 2 args]) +- tmp_flags="$EXTRA_KCFLAGS" +- EXTRA_KCFLAGS="-Werror" + ZFS_LINUX_TRY_COMPILE([ + #include <linux/bio.h> + ],[ +@@ -25,5 +23,4 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_END_IO_T_ARGS], [ + ],[ + AC_MSG_RESULT(no) + ]) +- EXTRA_KCFLAGS="$tmp_flags" + ]) +diff --git a/config/kernel-security-inode-init.m4 b/config/kernel-security-inode-init.m4 +index c21588a..a62176d 100644 +--- a/config/kernel-security-inode-init.m4 ++++ b/config/kernel-security-inode-init.m4 +@@ -7,8 +7,6 @@ dnl # security checks will just be skipped. + dnl # + AC_DEFUN([ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY], [ + AC_MSG_CHECKING([whether security_inode_init_security wants 6 args]) +- tmp_flags="$EXTRA_KCFLAGS" +- EXTRA_KCFLAGS="-Werror" + ZFS_LINUX_TRY_COMPILE([ + #include <linux/security.h> + ],[ +@@ -27,7 +25,6 @@ AC_DEFUN([ZFS_AC_KERNEL_6ARGS_SECURITY_INODE_INIT_SECURITY], [ + ],[ + AC_MSG_RESULT(no) + ]) +- EXTRA_KCFLAGS="$tmp_flags" + ]) + + dnl # +@@ -39,8 +36,6 @@ dnl # and the EVM xattr. + dnl # + AC_DEFUN([ZFS_AC_KERNEL_CALLBACK_SECURITY_INODE_INIT_SECURITY], [ + AC_MSG_CHECKING([whether security_inode_init_security wants callback]) +- tmp_flags="$EXTRA_KCFLAGS" +- EXTRA_KCFLAGS="-Werror" + ZFS_LINUX_TRY_COMPILE([ + #include <linux/security.h> + ],[ +@@ -57,5 +52,4 @@ AC_DEFUN([ZFS_AC_KERNEL_CALLBACK_SECURITY_INODE_INIT_SECURITY], [ + ],[ + AC_MSG_RESULT(no) + ]) +- EXTRA_KCFLAGS="$tmp_flags" + ]) +diff --git a/config/kernel.m4 b/config/kernel.m4 +index 6d28074..5623785 100644 +--- a/config/kernel.m4 ++++ b/config/kernel.m4 +@@ -488,7 +488,7 @@ AC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [ + modpost_flag='' + test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage + AS_IF( +- [AC_TRY_COMMAND(cp conftest.c build && make [$2] -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag) >/dev/null && AC_TRY_COMMAND([$3])], ++ [AC_TRY_COMMAND(cp conftest.c build && make [$2] -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag) >/dev/null && AC_TRY_COMMAND([$3])], + [$4], + [_AC_MSG_LOG_CONFTEST m4_ifvaln([$5],[$5])] + ) +-- +1.7.10 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-improved-hardened-support.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-improved-hardened-support.patch new file mode 100644 index 000000000000..03ee65ef9d4a --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-improved-hardened-support.patch @@ -0,0 +1,473 @@ +From ead579050140bfa010d06f6e0fea3f680c781b38 Mon Sep 17 00:00:00 2001 +From: Richard Yao <ryao@cs.stonybrook.edu> +Date: Thu, 14 Feb 2013 18:54:04 -0500 +Subject: [PATCH] Eliminate runtime function pointer modifications in + autotools checks +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +PaX/GrSecurity patched kernels implement a dialect of C that relies on a +GCC plugin for enforcement. A basic idea in this dialect is that +function pointers in structures should not change during runtime. +This causes code that modifies function pointers at runtime to fail to +compile in many instances. The autotools checks rely on whether or +not small test cases compile against a given kernel. Some +autotools checks assume some default case if other cases fail. When one +of these autotools checks tests a PaX/GrSecurity patched kernel by +modifying a function pointer at runtime, the default case will be used. + +Early detection of such situations is possible by relying on compiler +warnings, which are compiler errors when --enable-debug is used. +Unfortunately, very few people build ZFS with --enable-debug. The more +common situation is that these issues manifest themselves as runtime +failures in the form of NULL pointer exceptions. + +Previous patches that addressed such issues with PaX/GrSecurity +compatibility largely relied on rewriting autotools checks to avoid +runtime function pointer modification or the addition of PaX/GrSecurity +specific checks. This patch takes the previous work to its logical +conclusion by eliminating the use of runtime function pointer +modification. This permits the removal of PaX-specific autotools checks +in favor of ones that work across all supported kernels. + +This should resolve issues that were reported to occur with +PaX/GrSecurity-patched Linux 3.7.5 kernels on Gentoo Linux. + +https://bugs.gentoo.org/show_bug.cgi?id=457176 + +We should be able to prevent future regressions in PaX/GrSecurity +compatibility by ensuring that all changes to ZFSOnLinux avoid runtime +function pointer modification. At the same time, this does not solve the +issue of silent failures triggering default cases in the autotools +check, which is what permitted these regressions to become runtime +failures in the first place. This will need to be addressed in a future +patch. + +Reported-by: Marcin Mirosław <bug@mejor.pl> +Signed-off-by: Richard Yao <ryao@cs.stonybrook.edu> +--- + config/kernel-bdev-block-device-operations.m4 | 21 +++---- + config/kernel-bio-end-io-t-args.m4 | 6 +- + config/kernel-create-nameidata.m4 | 12 ++-- + config/kernel-dentry-operations.m4 | 6 +- + config/kernel-dirty-inode.m4 | 8 +-- + config/kernel-fallocate.m4 | 37 +++-------- + config/kernel-fsync.m4 | 84 ++++--------------------- + config/kernel-lookup-nameidata.m4 | 9 +-- + config/kernel-mkdir-umode-t.m4 | 7 ++- + config/kernel-shrink.m4 | 21 +++---- + 10 files changed, 62 insertions(+), 149 deletions(-) + +diff --git a/config/kernel-bdev-block-device-operations.m4 b/config/kernel-bdev-block-device-operations.m4 +index 28c3032..1674af0 100644 +--- a/config/kernel-bdev-block-device-operations.m4 ++++ b/config/kernel-bdev-block-device-operations.m4 +@@ -7,24 +7,21 @@ AC_DEFUN([ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS], [ + EXTRA_KCFLAGS="${NO_UNUSED_BUT_SET_VARIABLE}" + ZFS_LINUX_TRY_COMPILE([ + #include <linux/blkdev.h> +- ],[ +- int (*blk_open) (struct block_device *, fmode_t) = NULL; +- int (*blk_release) (struct gendisk *, fmode_t) = NULL; +- int (*blk_ioctl) (struct block_device *, fmode_t, +- unsigned, unsigned long) = NULL; +- int (*blk_compat_ioctl) (struct block_device *, fmode_t, +- unsigned, unsigned long) = NULL; +- struct block_device_operations blk_ops = { ++ ++ int blk_open (struct block_device *bdev, fmode_t mode) { return 0; } ++ int blk_release (struct gendisk *g, fmode_t mode) { return 0; } ++ int blk_ioctl (struct block_device *bdev, fmode_t mode, ++ unsigned x, unsigned long y) { return 0; } ++ int blk_compat_ioctl (struct block_device * bdev, fmode_t mode, ++ unsigned x, unsigned long y) { return 0; } ++ static struct block_device_operations blk_ops __attribute__ ((unused)) = { + .open = blk_open, + .release = blk_release, + .ioctl = blk_ioctl, + .compat_ioctl = blk_compat_ioctl, + }; ++ ],[ + +- blk_ops.open(NULL, 0); +- blk_ops.release(NULL, 0); +- blk_ops.ioctl(NULL, 0, 0, 0); +- blk_ops.compat_ioctl(NULL, 0, 0, 0); + ],[ + AC_MSG_RESULT(struct block_device) + AC_DEFINE(HAVE_BDEV_BLOCK_DEVICE_OPERATIONS, 1, +diff --git a/config/kernel-bio-end-io-t-args.m4 b/config/kernel-bio-end-io-t-args.m4 +index ced4861..fe5707a 100644 +--- a/config/kernel-bio-end-io-t-args.m4 ++++ b/config/kernel-bio-end-io-t-args.m4 +@@ -13,11 +13,9 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_END_IO_T_ARGS], [ + EXTRA_KCFLAGS="-Werror" + ZFS_LINUX_TRY_COMPILE([ + #include <linux/bio.h> ++ void wanted_end_io(struct bio * bio, int x) { return; } + ],[ +- void (*wanted_end_io)(struct bio *, int) = NULL; +- bio_end_io_t *local_end_io __attribute__ ((unused)); +- +- local_end_io = wanted_end_io; ++ bio_end_io_t *local_end_io __attribute__ ((unused)) = wanted_end_io; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_2ARGS_BIO_END_IO_T, 1, +diff --git a/config/kernel-create-nameidata.m4 b/config/kernel-create-nameidata.m4 +index 100f077..c779715 100644 +--- a/config/kernel-create-nameidata.m4 ++++ b/config/kernel-create-nameidata.m4 +@@ -5,18 +5,18 @@ AC_DEFUN([ZFS_AC_KERNEL_CREATE_NAMEIDATA], [ + AC_MSG_CHECKING([whether iops->create() takes struct nameidata]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> +- ],[ + #ifdef HAVE_MKDIR_UMODE_T +- int (*inode_create) (struct inode *,struct dentry *, +- umode_t, struct nameidata *) = NULL; ++ int inode_create (struct inode *inode ,struct dentry *dentry, ++ umode_t umode, struct nameidata *nidata) { return 0; } + #else +- int (*inode_create) (struct inode *,struct dentry *, +- int, struct nameidata *) = NULL; ++ int inode_create (struct inode *inode,struct dentry *dentry, ++ int umode, struct nameidata * nidata) { return 0; } + #endif +- struct inode_operations iops __attribute__ ((unused)) = { ++ static struct inode_operations iops __attribute__ ((unused)) = { + .create = inode_create, + }; + ],[ ++ ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_CREATE_NAMEIDATA, 1, + [iops->create() operation takes nameidata]) +diff --git a/config/kernel-dentry-operations.m4 b/config/kernel-dentry-operations.m4 +index dfbea7d..b89c51d 100644 +--- a/config/kernel-dentry-operations.m4 ++++ b/config/kernel-dentry-operations.m4 +@@ -5,12 +5,12 @@ AC_DEFUN([ZFS_AC_KERNEL_D_REVALIDATE_NAMEIDATA], [ + AC_MSG_CHECKING([whether dops->d_revalidate() takes struct nameidata]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/dcache.h> +- ],[ +- int (*revalidate) (struct dentry *, struct nameidata *) = NULL; +- struct dentry_operations dops __attribute__ ((unused)) = { ++ int revalidate (struct dentry *dentry, struct nameidata *nidata) { return 0; } ++ static struct dentry_operations dops __attribute__ ((unused)) = { + .d_revalidate = revalidate, + }; + ],[ ++ ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_D_REVALIDATE_NAMEIDATA, 1, + [dops->d_revalidate() operation takes nameidata]) +diff --git a/config/kernel-dirty-inode.m4 b/config/kernel-dirty-inode.m4 +index 2ededf1..86e3425 100644 +--- a/config/kernel-dirty-inode.m4 ++++ b/config/kernel-dirty-inode.m4 +@@ -8,11 +8,11 @@ AC_DEFUN([ZFS_AC_KERNEL_DIRTY_INODE_WITH_FLAGS], [ + AC_MSG_CHECKING([whether sops->dirty_inode() wants flags]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> ++ void dirty_inode (struct inode * a, int b) { return; } ++ static struct super_operations sops __attribute__ ((unused)) = { ++ .dirty_inode = dirty_inode, ++ }; + ],[ +- void (*dirty_inode) (struct inode *, int) = NULL; +- struct super_operations sops __attribute__ ((unused)); +- +- sops.dirty_inode = dirty_inode; + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_DIRTY_INODE_WITH_FLAGS, 1, +diff --git a/config/kernel-fallocate.m4 b/config/kernel-fallocate.m4 +index 6ac5ae6..0041ef2 100644 +--- a/config/kernel-fallocate.m4 ++++ b/config/kernel-fallocate.m4 +@@ -5,12 +5,12 @@ AC_DEFUN([ZFS_AC_KERNEL_FILE_FALLOCATE], [ + AC_MSG_CHECKING([whether fops->fallocate() exists]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> +- ],[ +- long (*fallocate) (struct file *, int, loff_t, loff_t) = NULL; +- struct file_operations fops __attribute__ ((unused)) = { +- .fallocate = fallocate, ++ long test_fallocate(struct file *file, int mode, loff_t offset, loff_t len) { return 0; } ++ static const struct file_operations fops __attribute__ ((unused)) = { ++ .fallocate = test_fallocate, + }; + ],[ ++ ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_FILE_FALLOCATE, 1, [fops->fallocate() exists]) + ],[ +@@ -25,34 +25,14 @@ AC_DEFUN([ZFS_AC_KERNEL_INODE_FALLOCATE], [ + AC_MSG_CHECKING([whether iops->fallocate() exists]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> +- ],[ +- long (*fallocate) (struct inode *, int, loff_t, loff_t) = NULL; +- struct inode_operations fops __attribute__ ((unused)) = { +- .fallocate = fallocate, ++ long test_fallocate (struct inode *inode, int mode, loff_t offset, loff_t len) { return 0; } ++ static const struct inode_operations fops __attribute__ ((unused)) = { ++ .fallocate = test_fallocate, + }; + ],[ +- AC_MSG_RESULT(yes) +- AC_DEFINE(HAVE_INODE_FALLOCATE, 1, [fops->fallocate() exists]) +- ],[ +- AC_MSG_RESULT(no) +- ]) +-]) +- +-dnl # +-dnl # PaX Linux 2.6.38 - 3.x API +-dnl # +-AC_DEFUN([ZFS_AC_PAX_KERNEL_FILE_FALLOCATE], [ +- AC_MSG_CHECKING([whether fops->fallocate() exists]) +- ZFS_LINUX_TRY_COMPILE([ +- #include <linux/fs.h> +- ],[ +- long (*fallocate) (struct file *, int, loff_t, loff_t) = NULL; +- struct file_operations_no_const fops __attribute__ ((unused)) = { +- .fallocate = fallocate, +- }; + ],[ + AC_MSG_RESULT(yes) +- AC_DEFINE(HAVE_FILE_FALLOCATE, 1, [fops->fallocate() exists]) ++ AC_DEFINE(HAVE_INODE_FALLOCATE, 1, [fops->fallocate() exists]) + ],[ + AC_MSG_RESULT(no) + ]) +@@ -65,5 +45,4 @@ dnl # + AC_DEFUN([ZFS_AC_KERNEL_FALLOCATE], [ + ZFS_AC_KERNEL_FILE_FALLOCATE + ZFS_AC_KERNEL_INODE_FALLOCATE +- ZFS_AC_PAX_KERNEL_FILE_FALLOCATE + ]) +diff --git a/config/kernel-fsync.m4 b/config/kernel-fsync.m4 +index ca00d93..9ac0c79 100644 +--- a/config/kernel-fsync.m4 ++++ b/config/kernel-fsync.m4 +@@ -4,11 +4,11 @@ dnl # + AC_DEFUN([ZFS_AC_KERNEL_FSYNC_WITH_DENTRY], [ + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> ++ int test_fsync (struct file *f, struct dentry *dentry, int x) { return 0; } ++ static const struct file_operations fops __attribute__ ((unused)) = { ++ .fsync = test_fsync, ++ }; + ],[ +- int (*fsync) (struct file *, struct dentry *, int) = NULL; +- struct file_operations fops __attribute__ ((unused)); +- +- fops.fsync = fsync; + ],[ + AC_MSG_RESULT([dentry]) + AC_DEFINE(HAVE_FSYNC_WITH_DENTRY, 1, +@@ -23,11 +23,11 @@ dnl # + AC_DEFUN([ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY], [ + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> ++ int test_fsync (struct file *f, int x) { return 0; } ++ static const struct file_operations fops __attribute__ ((unused)) = { ++ .fsync = test_fsync, ++ }; + ],[ +- int (*fsync) (struct file *, int) = NULL; +- struct file_operations fops __attribute__ ((unused)); +- +- fops.fsync = fsync; + ],[ + AC_MSG_RESULT([no dentry]) + AC_DEFINE(HAVE_FSYNC_WITHOUT_DENTRY, 1, +@@ -42,68 +42,11 @@ dnl # + AC_DEFUN([ZFS_AC_KERNEL_FSYNC_RANGE], [ + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> ++ int test_fsync (struct file *f, loff_t a, loff_t b, int c) { return 0; } ++ static const struct file_operations fops __attribute__ ((unused)) = { ++ .fsync = test_fsync, ++ }; + ],[ +- int (*fsync) (struct file *, loff_t, loff_t, int) = NULL; +- struct file_operations fops __attribute__ ((unused)); +- +- fops.fsync = fsync; +- ],[ +- AC_MSG_RESULT([range]) +- AC_DEFINE(HAVE_FSYNC_RANGE, 1, +- [fops->fsync() with range]) +- ],[ +- ]) +-]) +- +-dnl # +-dnl # PaX Linux 2.6.x - 2.6.34 API +-dnl # +-AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_WITH_DENTRY], [ +- ZFS_LINUX_TRY_COMPILE([ +- #include <linux/fs.h> +- ],[ +- int (*fsync) (struct file *, struct dentry *, int) = NULL; +- file_operations_no_const fops __attribute__ ((unused)); +- +- fops.fsync = fsync; +- ],[ +- AC_MSG_RESULT([dentry]) +- AC_DEFINE(HAVE_FSYNC_WITH_DENTRY, 1, +- [fops->fsync() with dentry]) +- ],[ +- ]) +-]) +- +-dnl # +-dnl # PaX Linux 2.6.35 - Linux 3.0 API +-dnl # +-AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_WITHOUT_DENTRY], [ +- ZFS_LINUX_TRY_COMPILE([ +- #include <linux/fs.h> +- ],[ +- int (*fsync) (struct file *, int) = NULL; +- file_operations_no_const fops __attribute__ ((unused)); +- +- fops.fsync = fsync; +- ],[ +- AC_MSG_RESULT([no dentry]) +- AC_DEFINE(HAVE_FSYNC_WITHOUT_DENTRY, 1, +- [fops->fsync() without dentry]) +- ],[ +- ]) +-]) +- +-dnl # +-dnl # PaX Linux 3.1 - 3.x API +-dnl # +-AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_RANGE], [ +- ZFS_LINUX_TRY_COMPILE([ +- #include <linux/fs.h> +- ],[ +- int (*fsync) (struct file *, loff_t, loff_t, int) = NULL; +- file_operations_no_const fops __attribute__ ((unused)); +- +- fops.fsync = fsync; + ],[ + AC_MSG_RESULT([range]) + AC_DEFINE(HAVE_FSYNC_RANGE, 1, +@@ -117,7 +60,4 @@ AC_DEFUN([ZFS_AC_KERNEL_FSYNC], [ + ZFS_AC_KERNEL_FSYNC_WITH_DENTRY + ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY + ZFS_AC_KERNEL_FSYNC_RANGE +- ZFS_AC_PAX_KERNEL_FSYNC_WITH_DENTRY +- ZFS_AC_PAX_KERNEL_FSYNC_WITHOUT_DENTRY +- ZFS_AC_PAX_KERNEL_FSYNC_RANGE + ]) +diff --git a/config/kernel-lookup-nameidata.m4 b/config/kernel-lookup-nameidata.m4 +index 5e30be4..20b8cca 100644 +--- a/config/kernel-lookup-nameidata.m4 ++++ b/config/kernel-lookup-nameidata.m4 +@@ -5,13 +5,14 @@ AC_DEFUN([ZFS_AC_KERNEL_LOOKUP_NAMEIDATA], [ + AC_MSG_CHECKING([whether iops->lookup() takes struct nameidata]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> +- ],[ +- struct dentry * (*inode_lookup) (struct inode *,struct dentry *, +- struct nameidata *) = NULL; +- struct inode_operations iops __attribute__ ((unused)) = { ++ struct dentry * inode_lookup (struct inode * inode, ++ struct dentry * dentry, struct nameidata * nidata) ++ { return NULL; } ++ static struct inode_operations iops __attribute__ ((unused)) = { + .lookup = inode_lookup, + }; + ],[ ++ ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_LOOKUP_NAMEIDATA, 1, + [iops->lookup() operation takes nameidata]) +diff --git a/config/kernel-mkdir-umode-t.m4 b/config/kernel-mkdir-umode-t.m4 +index dd5d94b..ce8aa8f 100644 +--- a/config/kernel-mkdir-umode-t.m4 ++++ b/config/kernel-mkdir-umode-t.m4 +@@ -10,12 +10,13 @@ AC_DEFUN([ZFS_AC_KERNEL_MKDIR_UMODE_T], [ + AC_MSG_CHECKING([whether iops->create()/mkdir()/mknod() take umode_t]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> +- ],[ +- int (*mkdir) (struct inode *,struct dentry *,umode_t) = NULL; +- struct inode_operations iops __attribute__ ((unused)) = { ++ int mkdir (struct inode * inode, struct dentry * dentry, umode_t umode) ++ { return 0; } ++ static struct inode_operations iops __attribute__ ((unused)) = { + .mkdir = mkdir, + }; + ],[ ++ ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_MKDIR_UMODE_T, 1, + [iops->create()/mkdir()/mknod() take umode_t]) +diff --git a/config/kernel-shrink.m4 b/config/kernel-shrink.m4 +index ea748c9..ce4b965 100644 +--- a/config/kernel-shrink.m4 ++++ b/config/kernel-shrink.m4 +@@ -8,15 +8,14 @@ AC_DEFUN([ZFS_AC_KERNEL_SHRINK], [ + AC_MSG_CHECKING([whether super_block has s_shrink]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> +- ],[ +- int (*shrink)(struct shrinker *, struct shrink_control *sc) +- __attribute__ ((unused)) = NULL; +- struct super_block sb __attribute__ ((unused)) = { ++ int shrink(struct shrinker * s, struct shrink_control *sc) { return 0; } ++ static struct super_block sb __attribute__ ((unused)) = { + .s_shrink.shrink = shrink, + .s_shrink.seeks = DEFAULT_SEEKS, + .s_shrink.batch = 0, + }; + ],[ ++ ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SHRINK, 1, [struct super_block has s_shrink]) + +@@ -29,13 +28,12 @@ AC_DEFUN([ZFS_AC_KERNEL_NR_CACHED_OBJECTS], [ + AC_MSG_CHECKING([whether sops->nr_cached_objects() exists]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> +- ],[ +- int (*nr_cached_objects)(struct super_block *) +- __attribute__ ((unused)) = NULL; +- struct super_operations sops __attribute__ ((unused)) = { ++ int nr_cached_objects(struct super_block * sb) { return 0; } ++ static struct super_operations sops __attribute__ ((unused)) = { + .nr_cached_objects = nr_cached_objects, + }; + ],[ ++ ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NR_CACHED_OBJECTS, 1, + [sops->nr_cached_objects() exists]) +@@ -48,13 +46,12 @@ AC_DEFUN([ZFS_AC_KERNEL_FREE_CACHED_OBJECTS], [ + AC_MSG_CHECKING([whether sops->free_cached_objects() exists]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> +- ],[ +- void (*free_cached_objects)(struct super_block *, int) +- __attribute__ ((unused)) = NULL; +- struct super_operations sops __attribute__ ((unused)) = { ++ void free_cached_objects(struct super_block * sb, int x) { return; } ++ static struct super_operations sops __attribute__ ((unused)) = { + .free_cached_objects = free_cached_objects, + }; + ],[ ++ ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_FREE_CACHED_OBJECTS, 1, + [sops->free_cached_objects() exists]) +-- +1.7.10 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-linux-3.9-compat.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-linux-3.9-compat.patch new file mode 100644 index 000000000000..1dfef6117f1a --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-linux-3.9-compat.patch @@ -0,0 +1,32 @@ +commit 3d8c9c9de0a5e1f1b496fcef2750a01a45860b04 +Author: Richard Yao <ryao@cs.stonybrook.edu> +Date: Mon Mar 4 15:52:11 2013 -0500 + + Linux 3.9 compat: Undefine GCC_VERSION + + The mainline kernel started defining GCC_VERSION with commit + torvalds/linux@3f3f8d2f48acfd8ed3b8e6b7377935da57b27b16. Unfortunately, + LZ4 also defines this macro, but the two defintions are incompatible. We + undefine GCC_VERSION in lz4.c to handle this. + + Signed-off-by: Richard Yao <ryao@cs.stonybrook.edu> + +diff --git a/module/zfs/lz4.c b/module/zfs/lz4.c +index b9850c0..8afaad1 100644 +--- a/module/zfs/lz4.c ++++ b/module/zfs/lz4.c +@@ -243,6 +243,14 @@ lz4_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n) + /* Disable restrict */ + #define restrict + ++/* ++ * Linux : GCC_VERSION is defined as of 3.9-rc1, so undefine it. ++ * torvalds/linux@3f3f8d2f48acfd8ed3b8e6b7377935da57b27b16 ++ */ ++#ifdef GCC_VERSION ++#undef GCC_VERSION ++#endif ++ + #define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) + + #if (GCC_VERSION >= 302) || (__INTEL_COMPILER >= 800) || defined(__clang__)
\ No newline at end of file diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-vfs-name-length-compatibility.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-vfs-name-length-compatibility.patch new file mode 100644 index 000000000000..5f9f6525e73c --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-vfs-name-length-compatibility.patch @@ -0,0 +1,36 @@ +From 7f235381a0e501df55ebe2de10b69124e928d175 Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Mon, 11 Feb 2013 12:55:24 -0800 +Subject: [PATCH] Add explicit MAXNAMELEN check + +It turns out that the Linux VFS doesn't strictly handle all cases +where a component path name exceeds MAXNAMELEN. It does however +appear to correctly handle MAXPATHLEN for us. + +The right way to handle this appears to be to add an explicit +check to the zpl_lookup() function. Several in-tree filesystems +handle this case the same way. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Issue #1279 +--- + module/zfs/zpl_inode.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/module/zfs/zpl_inode.c b/module/zfs/zpl_inode.c +index e406288..8c8ec24 100644 +--- a/module/zfs/zpl_inode.c ++++ b/module/zfs/zpl_inode.c +@@ -41,6 +41,9 @@ + struct inode *ip; + int error; + ++ if (dlen(dentry) > ZFS_MAXNAMELEN) ++ return ERR_PTR(-ENAMETOOLONG); ++ + crhold(cr); + error = -zfs_lookup(dir, dname(dentry), &ip, 0, cr, NULL, NULL); + ASSERT3S(error, <=, 0); +-- +1.7.10 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-zfs_arc_memory_throttle_disable.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-zfs_arc_memory_throttle_disable.patch new file mode 100644 index 000000000000..81ec15f3e6c7 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.0_rc14-zfs_arc_memory_throttle_disable.patch @@ -0,0 +1,41 @@ +From 546c978bbd3f132a88609cab15ec0e954eaa62b8 Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Thu, 21 Feb 2013 12:14:44 -0800 +Subject: [PATCH] Enable zfs_arc_memory_throttle_disable by default + +The zfs_arc_memory_throttle_disable module option was introduced +by commit 0c5493d47059f25ce9dbf20c9fe87655f55102a1 to resolve a +memory miscalculation which could result in the txg_sync thread +spinning. + +When this was first introduced the default behavior was left +unchanged until enough real world usage confirmed there were no +unexpected issues. We've now reached that point. Linux's +direct reclaim is working as expected so we're enabling this +behavior by default. + +This helps pave the way to retire the spl_kmem_availrmem() +functionality in the SPL layer. This was the only caller. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Issue #938 +--- + module/zfs/arc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/module/zfs/arc.c b/module/zfs/arc.c +index 09924db..b7499ee 100644 +--- a/module/zfs/arc.c ++++ b/module/zfs/arc.c +@@ -189,7 +189,7 @@ + int zfs_arc_grow_retry = 0; + int zfs_arc_shrink_shift = 0; + int zfs_arc_p_min_shift = 0; +-int zfs_arc_memory_throttle_disable = 0; ++int zfs_arc_memory_throttle_disable = 1; + int zfs_disable_dup_eviction = 0; + int zfs_arc_meta_prune = 0; + +-- +1.8.1.5 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-arc-read-panic.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-arc-read-panic.patch new file mode 100644 index 000000000000..00ec1057efa1 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-arc-read-panic.patch @@ -0,0 +1,42 @@ +From 3db3ff4a787acf068b122562fb5be5aecec2611f Mon Sep 17 00:00:00 2001 +From: Richard Yao <ryao@gentoo.org> +Date: Tue, 2 Jul 2013 00:07:15 -0400 +Subject: [PATCH] Use MAXPATHLEN instead of sizeof in snprintf +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This silences a GCC 4.8.0 warning by fixing a programming error +caught by static analysis: + +../../cmd/ztest/ztest.c: In function ‘ztest_vdev_aux_add_remove’: +../../cmd/ztest/ztest.c:2584:33: error: argument to ‘sizeof’ + in ‘snprintf’ call is the same expression as the destination; + did you mean to provide an explicit length? + [-Werror=sizeof-pointer-memaccess] + (void) snprintf(path, sizeof (path), ztest_aux_template, + ^ + +Signed-off-by: Richard Yao <ryao@gentoo.org> +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Closes #1480 +--- + cmd/ztest/ztest.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c +index b38d7b1..93a5f1e 100644 +--- a/cmd/ztest/ztest.c ++++ b/cmd/ztest/ztest.c +@@ -2581,7 +2581,7 @@ enum ztest_object { + zs->zs_vdev_aux = 0; + for (;;) { + int c; +- (void) snprintf(path, sizeof (path), ztest_aux_template, ++ (void) snprintf(path, MAXPATHLEN, ztest_aux_template, + ztest_opts.zo_dir, ztest_opts.zo_pool, aux, + zs->zs_vdev_aux); + for (c = 0; c < sav->sav_count; c++) +-- +1.8.1.6 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-getdents.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-getdents.patch new file mode 100644 index 000000000000..ce7d5c0494d9 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-getdents.patch @@ -0,0 +1,32 @@ +From 8f1e11b6105bf46a4258958eb3dcae2ab21ed8b2 Mon Sep 17 00:00:00 2001 +From: Caleb James DeLisle <calebdelisle@lavabit.com> +Date: Tue, 16 Apr 2013 05:23:39 -0400 +Subject: [PATCH] Remove .readdir from zpl_file_operations table + +The zpl_readdir() function shouldn't be registered as part of +the zpl_file_operations table, it must only be part of the +zpl_dir_file_operations table. By removing this callback +the VFS will now correctly return ENOTDIR when calling +getdents() on a file. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Closes #1404 +--- + module/zfs/zpl_file.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/module/zfs/zpl_file.c b/module/zfs/zpl_file.c +index 9c27b7f..db6a72c 100644 +--- a/module/zfs/zpl_file.c ++++ b/module/zfs/zpl_file.c +@@ -446,7 +446,6 @@ + .llseek = generic_file_llseek, + .read = zpl_read, + .write = zpl_write, +- .readdir = zpl_readdir, + .mmap = zpl_mmap, + .fsync = zpl_fsync, + #ifdef HAVE_FILE_FALLOCATE +-- +1.8.1.6 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-txg_quiesce-deadlock.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-txg_quiesce-deadlock.patch new file mode 100644 index 000000000000..8513e78882b1 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-txg_quiesce-deadlock.patch @@ -0,0 +1,73 @@ +From 57f5a2008e2e6acf58934cf43c5fdca0faffa73e Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Thu, 25 Apr 2013 16:29:22 -0700 +Subject: [PATCH] Fix txg_quiesce thread deadlock + +A deadlock was accidentally introduced by commit e95853a which +can occur when the system is under memory pressure. What happens +is that while the txg_quiesce thread is holding the tx->tx_cpu +locks it enters memory reclaim. In the context of this memory +reclaim it then issues synchronous I/O to a ZVOL swap device. +Because the txg_quiesce thread is holding the tx->tx_cpu locks +a new txg cannot be opened to handle the I/O. Deadlock. + +The fix is straight forward. Move the memory allocation outside +the critical region where the tx->tx_cpu locks are held. And for +good measure change the offending allocation to KM_PUSHPAGE to +ensure it never attempts to issue I/O during reclaim. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Issue #1274 +--- + module/zfs/dsl_pool.c | 2 +- + module/zfs/txg.c | 14 +++++++------- + 2 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/module/zfs/dsl_pool.c b/module/zfs/dsl_pool.c +index 704f034..771b265 100644 +--- a/module/zfs/dsl_pool.c ++++ b/module/zfs/dsl_pool.c +@@ -143,7 +143,7 @@ + { + txg_history_t *th, *rm; + +- th = kmem_zalloc(sizeof(txg_history_t), KM_SLEEP); ++ th = kmem_zalloc(sizeof(txg_history_t), KM_PUSHPAGE); + mutex_init(&th->th_lock, NULL, MUTEX_DEFAULT, NULL); + th->th_kstat.txg = txg; + th->th_kstat.state = TXG_STATE_OPEN; +diff --git a/module/zfs/txg.c b/module/zfs/txg.c +index c7c3df3..7c820af 100644 +--- a/module/zfs/txg.c ++++ b/module/zfs/txg.c +@@ -367,6 +367,13 @@ + tx->tx_open_txg++; + + /* ++ * Now that we've incremented tx_open_txg, we can let threads ++ * enter the next transaction group. ++ */ ++ for (c = 0; c < max_ncpus; c++) ++ mutex_exit(&tx->tx_cpu[c].tc_lock); ++ ++ /* + * Measure how long the txg was open and replace the kstat. + */ + th = dsl_pool_txg_history_get(dp, txg); +@@ -376,13 +383,6 @@ + dsl_pool_txg_history_add(dp, tx->tx_open_txg); + + /* +- * Now that we've incremented tx_open_txg, we can let threads +- * enter the next transaction group. +- */ +- for (c = 0; c < max_ncpus; c++) +- mutex_exit(&tx->tx_cpu[c].tc_lock); +- +- /* + * Quiesce the transaction group by waiting for everyone to txg_exit(). + */ + start = gethrtime(); +-- +1.8.1.6 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-xattr-behavior-1.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-xattr-behavior-1.patch new file mode 100644 index 000000000000..b4801708ae35 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-xattr-behavior-1.patch @@ -0,0 +1,50 @@ +From f706421173c571371afff5e2a2ee0784c5e3f95d Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Wed, 17 Apr 2013 13:07:36 -0700 +Subject: [PATCH] Correctly return ERANGE in getxattr(2) + +According to the getxattr(2) man page the ERANGE errno should be +returned when the size of the value buffer is to small to hold the +result. Prior to this patch the implementation would just truncate +the value to size bytes. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Closes #1408 +--- + module/zfs/zpl_xattr.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c +index c03764f..a7e38e6 100644 +--- a/module/zfs/zpl_xattr.c ++++ b/module/zfs/zpl_xattr.c +@@ -225,6 +225,11 @@ + goto out; + } + ++ if (size < i_size_read(xip)) { ++ error = -ERANGE; ++ goto out; ++ } ++ + error = zpl_read_common(xip, value, size, 0, UIO_SYSSPACE, 0, cr); + out: + if (xip) +@@ -263,9 +268,12 @@ + if (!size) + return (nv_size); + +- memcpy(value, nv_value, MIN(size, nv_size)); ++ if (size < nv_size) ++ return (-ERANGE); ++ ++ memcpy(value, nv_value, nv_size); + +- return (MIN(size, nv_size)); ++ return (nv_size); + } + + static int +-- +1.8.1.6 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-xattr-behavior-2.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-xattr-behavior-2.patch new file mode 100644 index 000000000000..bb4b1c4a3a34 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-xattr-behavior-2.patch @@ -0,0 +1,37 @@ +From 0377189b884fab7db02a95088e05712c7cf336f7 Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Wed, 8 May 2013 09:20:04 -0700 +Subject: [PATCH] Only check directory xattr on ENOENT + +When SA xattrs are enabled only fallback to checking the directory +xattrs when the name is not found as a SA xattr. Otherwise, the SA +error which should be returned to the caller is overwritten by the +directory xattr errors. Positive return values indicating success +will also be immediately returned. + +In the case of #1437 the ERANGE error was being correctly returned +by zpl_xattr_get_sa() only to be overridden with ENOENT which was +returned by the subsequent unnessisary call to zpl_xattr_get_dir(). + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Closes #1437 +--- + module/zfs/zpl_xattr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c +index a7e38e6..eb2c00d 100644 +--- a/module/zfs/zpl_xattr.c ++++ b/module/zfs/zpl_xattr.c +@@ -288,7 +288,7 @@ + + if (zsb->z_use_sa && zp->z_is_sa) { + error = zpl_xattr_get_sa(ip, name, value, size); +- if (error >= 0) ++ if (error != -ENOENT) + goto out; + } + +-- +1.8.1.6 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfs_sb_teardown-NULL-pointer-deref.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfs_sb_teardown-NULL-pointer-deref.patch new file mode 100644 index 000000000000..e59c869eed04 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfs_sb_teardown-NULL-pointer-deref.patch @@ -0,0 +1,58 @@ +From ab68b6e5db29abcd20c0c7b12a8c2fa570031c8b Mon Sep 17 00:00:00 2001 +From: Tim Chase <tim@chase2k.com> +Date: Mon, 24 Jun 2013 22:03:56 -0500 +Subject: [PATCH] Fix zfs_sb_teardown/zfs_resume_fs NULL dereference + +Fix a pair of conditions in which a concurrent umount can cause +NULL pointer dereferences: + +* zfs_sb_teardown - prevent a NULL dereference by not calling + dmu_objset_pool with a null z_os. + +* zfs_resume_fs - don't try to unmount with a null z_os. This + change makes the ZoL code more consistent + with both Illumos and FreeBSD. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Closes #1543 +--- + module/zfs/zfs_vfsops.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/module/zfs/zfs_vfsops.c b/module/zfs/zfs_vfsops.c +index e618f2b..602c332 100644 +--- a/module/zfs/zfs_vfsops.c ++++ b/module/zfs/zfs_vfsops.c +@@ -1056,10 +1056,12 @@ + } + + /* +- * Drain the iput_taskq to ensure all active references to the ++ * If someone has not already unmounted this file system, ++ * drain the iput_taskq to ensure all active references to the + * zfs_sb_t have been handled only then can it be safely destroyed. + */ +- taskq_wait(dsl_pool_iput_taskq(dmu_objset_pool(zsb->z_os))); ++ if (zsb->z_os) ++ taskq_wait(dsl_pool_iput_taskq(dmu_objset_pool(zsb->z_os))); + + /* + * Close the zil. NB: Can't close the zil while zfs_inactive +@@ -1480,10 +1482,11 @@ + + if (err) { + /* +- * Since we couldn't reopen zfs_sb_t, force +- * unmount this file system. ++ * Since we couldn't reopen zfs_sb_t or, setup the ++ * sa framework, force unmount this file system. + */ +- (void) zfs_umount(zsb->z_sb); ++ if (zsb->z_os) ++ (void) zfs_umount(zsb->z_sb); + } + return (err); + } +-- +1.8.1.6 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfsctl_expire_snapshot-deadlock.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfsctl_expire_snapshot-deadlock.patch new file mode 100644 index 000000000000..7cca7d1137c8 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfsctl_expire_snapshot-deadlock.patch @@ -0,0 +1,73 @@ +From 76351672c222f28ea1b681097a9eff58a6791555 Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Thu, 11 Jul 2013 14:11:32 -0700 +Subject: [PATCH] Fix zfsctl_expire_snapshot() deadlock + +It is possible for an automounted snapshot which is expiring to +deadlock with a manual unmount of the snapshot. This can occur +because taskq_cancel_id() will block if the task is currently +executing until it completes. But it will never complete because +zfsctl_unmount_snapshot() is holding the zsb->z_ctldir_lock which +zfsctl_expire_snapshot() must acquire. + +---------------------- z_unmount/0:2153 --------------------- + mutex_lock <blocking on zsb->z_ctldir_lock> + zfsctl_unmount_snapshot + zfsctl_expire_snapshot + taskq_thread + +------------------------- zfs:10690 ------------------------- + taskq_wait_id <waiting for z_unmount to exit> + taskq_cancel_id + __zfsctl_unmount_snapshot + zfsctl_unmount_snapshot <takes zsb->z_ctldir_lock> + zfs_unmount_snap + zfs_ioc_destroy_snaps_nvl + zfsdev_ioctl + do_vfs_ioctl + +We resolve the deadlock by dropping the zsb->z_ctldir_lock before +calling __zfsctl_unmount_snapshot(). The lock is only there to +prevent concurrent modification to the zsb->z_ctldir_snaps AVL +tree. Moreover, we're careful to remove the zfs_snapentry_t from +the AVL tree before dropping the lock which ensures no other tasks +can find it. On failure it's added back to the tree. + +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Signed-off-by: Chris Dunlap <cdunlap@llnl.gov> +Closes #1527 +--- + module/zfs/zfs_ctldir.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/module/zfs/zfs_ctldir.c b/module/zfs/zfs_ctldir.c +index 4fa530b..168f853 100644 +--- a/module/zfs/zfs_ctldir.c ++++ b/module/zfs/zfs_ctldir.c +@@ -732,7 +732,11 @@ struct inode * + sep = avl_find(&zsb->z_ctldir_snaps, &search, NULL); + if (sep) { + avl_remove(&zsb->z_ctldir_snaps, sep); ++ mutex_exit(&zsb->z_ctldir_lock); ++ + error = __zfsctl_unmount_snapshot(sep, flags); ++ ++ mutex_enter(&zsb->z_ctldir_lock); + if (error == EBUSY) + avl_add(&zsb->z_ctldir_snaps, sep); + else +@@ -767,7 +771,11 @@ struct inode * + while (sep != NULL) { + next = AVL_NEXT(&zsb->z_ctldir_snaps, sep); + avl_remove(&zsb->z_ctldir_snaps, sep); ++ mutex_exit(&zsb->z_ctldir_lock); ++ + error = __zfsctl_unmount_snapshot(sep, flags); ++ ++ mutex_enter(&zsb->z_ctldir_lock); + if (error == EBUSY) { + avl_add(&zsb->z_ctldir_snaps, sep); + (*count)++; +-- +1.8.1.6 + diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zvol-initialization-r1.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zvol-initialization-r1.patch new file mode 100644 index 000000000000..b1e7d3736db0 --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zvol-initialization-r1.patch @@ -0,0 +1,167 @@ +diff --git a/module/zfs/spa.c b/module/zfs/spa.c +index e986e92..65f78b7 100644 +--- a/module/zfs/spa.c ++++ b/module/zfs/spa.c +@@ -64,6 +64,7 @@ + #include <sys/zfs_ioctl.h> + #include <sys/dsl_scan.h> + #include <sys/zfeature.h> ++#include <sys/zvol.h> + + #ifdef _KERNEL + #include <sys/bootprops.h> +@@ -2856,6 +2857,7 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy, + spa_load_state_t state = SPA_LOAD_OPEN; + int error; + int locked = B_FALSE; ++ int firstopen = B_FALSE; + + *spapp = NULL; + +@@ -2879,6 +2881,8 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy, + if (spa->spa_state == POOL_STATE_UNINITIALIZED) { + zpool_rewind_policy_t policy; + ++ firstopen = B_TRUE; ++ + zpool_get_rewind_policy(nvpolicy ? nvpolicy : spa->spa_config, + &policy); + if (policy.zrp_request & ZPOOL_DO_REWIND) +@@ -2953,6 +2957,11 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy, + mutex_exit(&spa_namespace_lock); + } + ++#ifdef _KERNEL ++ if (firstopen) ++ zvol_create_minors(spa->spa_name); ++#endif ++ + *spapp = spa; + + return (0); +@@ -4010,6 +4019,10 @@ spa_import(const char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags) + mutex_exit(&spa_namespace_lock); + spa_history_log_version(spa, LOG_POOL_IMPORT); + ++#ifdef _KERNEL ++ zvol_create_minors(pool); ++#endif ++ + return (0); + } + +diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c +index 1226b2c..a9184a1 100644 +--- a/module/zfs/zfs_ioctl.c ++++ b/module/zfs/zfs_ioctl.c +@@ -1268,9 +1268,6 @@ zfs_ioc_pool_import(zfs_cmd_t *zc) + error = err; + } + +- if (error == 0) +- zvol_create_minors(zc->zc_name); +- + nvlist_free(config); + + if (props) +diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c +index 43a7bb6..e35c91b 100644 +--- a/module/zfs/zvol.c ++++ b/module/zfs/zvol.c +@@ -1215,6 +1215,9 @@ zvol_alloc(dev_t dev, const char *name) + + zv = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP); + ++ spin_lock_init(&zv->zv_lock); ++ list_link_init(&zv->zv_next); ++ + zv->zv_queue = blk_init_queue(zvol_request, &zv->zv_lock); + if (zv->zv_queue == NULL) + goto out_kmem; +@@ -1248,9 +1251,6 @@ zvol_alloc(dev_t dev, const char *name) + sizeof (rl_t), offsetof(rl_t, r_node)); + zv->zv_znode.z_is_zvol = TRUE; + +- spin_lock_init(&zv->zv_lock); +- list_link_init(&zv->zv_next); +- + zv->zv_disk->major = zvol_major; + zv->zv_disk->first_minor = (dev & MINORMASK); + zv->zv_disk->fops = &zvol_ops; +@@ -1561,30 +1561,36 @@ zvol_init(void) + { + int error; + ++ list_create(&zvol_state_list, sizeof (zvol_state_t), ++ offsetof(zvol_state_t, zv_next)); ++ mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL); ++ + zvol_taskq = taskq_create(ZVOL_DRIVER, zvol_threads, maxclsyspri, + zvol_threads, INT_MAX, TASKQ_PREPOPULATE); + if (zvol_taskq == NULL) { + printk(KERN_INFO "ZFS: taskq_create() failed\n"); +- return (-ENOMEM); ++ error = -ENOMEM; ++ goto out1; + } + + error = register_blkdev(zvol_major, ZVOL_DRIVER); + if (error) { + printk(KERN_INFO "ZFS: register_blkdev() failed %d\n", error); +- taskq_destroy(zvol_taskq); +- return (error); ++ goto out2; + } + + blk_register_region(MKDEV(zvol_major, 0), 1UL << MINORBITS, + THIS_MODULE, zvol_probe, NULL, NULL); + +- mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL); +- list_create(&zvol_state_list, sizeof (zvol_state_t), +- offsetof(zvol_state_t, zv_next)); ++ return (0); + +- (void) zvol_create_minors(NULL); ++out2: ++ taskq_destroy(zvol_taskq); ++out1: ++ mutex_destroy(&zvol_state_lock); ++ list_destroy(&zvol_state_list); + +- return (0); ++ return (error); + } + + void +diff --git a/scripts/zconfig.sh b/scripts/zconfig.sh +index 141348c..281166c 100755 +--- a/scripts/zconfig.sh ++++ b/scripts/zconfig.sh +@@ -264,8 +264,9 @@ test_4() { + zconfig_zvol_device_stat 0 ${POOL_NAME} ${FULL_ZVOL_NAME} \ + ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 9 + +- # Load the modules, wait 1 second for udev ++ # Load the modules, list the pools to ensure they are opened + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 10 ++ ${ZPOOL} list &>/dev/null + + # Verify the devices were created + zconfig_zvol_device_stat 10 ${POOL_NAME} ${FULL_ZVOL_NAME} \ +diff --git a/udev/rules.d/90-zfs.rules.in b/udev/rules.d/90-zfs.rules.in +index 52e1d63..a2715d2 100644 +--- a/udev/rules.d/90-zfs.rules.in ++++ b/udev/rules.d/90-zfs.rules.in +@@ -1,4 +1,4 @@ +-SUBSYSTEM!="block", GOTO="zfs_end" ++SUBSYSTEM!="block|misc", GOTO="zfs_end" + ACTION!="add|change", GOTO="zfs_end" + + ENV{ID_FS_TYPE}=="zfs", RUN+="/sbin/modprobe zfs" +@@ -7,4 +7,6 @@ ENV{ID_FS_TYPE}=="zfs_member", RUN+="/sbin/modprobe zfs" + KERNEL=="null", SYMLINK+="root" + SYMLINK=="null", SYMLINK+="root" + ++SUBSYSTEM=="misc", KERNEL=="zfs", RUN+="@sbindir@/zpool list" ++ + LABEL="zfs_end" diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-linux-3.10-compat.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-linux-3.10-compat.patch new file mode 100644 index 000000000000..90755a1a527f --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-linux-3.10-compat.patch @@ -0,0 +1,108 @@ +commit a1d9543a39942be56879ca9338078afc77c25cea +Author: Chris Dunlop <chris@onthe.net.au> +Date: Mon Jun 3 16:58:52 2013 +1000 + + 3.10 API change: block_device_operations->release() returns void + + Linux kernel commit torvalds/linux@db2a144 changed the return type + of block_device_operations->release() to void. Detect the expected + prototype and defined our callout accordingly. + + Signed-off-by: Chris Dunlop <chris@onthe.net.au> + Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> + Closes #1494 + +diff --git a/config/kernel-bdev-block-device-operations.m4 b/config/kernel-bdev-block-device-operations.m4 +index 8b5e0a3..faacc19 100644 +--- a/config/kernel-bdev-block-device-operations.m4 ++++ b/config/kernel-bdev-block-device-operations.m4 +@@ -10,7 +10,6 @@ AC_DEFUN([ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS], [ + + int blk_open(struct block_device *bdev, fmode_t mode) + { return 0; } +- int blk_release(struct gendisk *g, fmode_t mode) { return 0; } + int blk_ioctl(struct block_device *bdev, fmode_t mode, + unsigned x, unsigned long y) { return 0; } + int blk_compat_ioctl(struct block_device * bdev, fmode_t mode, +@@ -19,7 +18,7 @@ AC_DEFUN([ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS], [ + static const struct block_device_operations + bops __attribute__ ((unused)) = { + .open = blk_open, +- .release = blk_release, ++ .release = NULL, + .ioctl = blk_ioctl, + .compat_ioctl = blk_compat_ioctl, + }; +diff --git a/config/kernel-block-device-operations-release-void.m4 b/config/kernel-block-device-operations-release-void.m4 +new file mode 100644 +index 0000000..a73f858 +--- /dev/null ++++ b/config/kernel-block-device-operations-release-void.m4 +@@ -0,0 +1,29 @@ ++dnl # ++dnl # 3.10.x API change ++dnl # ++AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID], [ ++ AC_MSG_CHECKING([whether block_device_operations.release is void]) ++ tmp_flags="$EXTRA_KCFLAGS" ++ EXTRA_KCFLAGS="${NO_UNUSED_BUT_SET_VARIABLE}" ++ ZFS_LINUX_TRY_COMPILE([ ++ #include <linux/blkdev.h> ++ ++ void blk_release(struct gendisk *g, fmode_t mode) { return; } ++ ++ static const struct block_device_operations ++ bops __attribute__ ((unused)) = { ++ .open = NULL, ++ .release = blk_release, ++ .ioctl = NULL, ++ .compat_ioctl = NULL, ++ }; ++ ],[ ++ ],[ ++ AC_MSG_RESULT(void) ++ AC_DEFINE(HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID, 1, ++ [struct block_device_operations.release returns void]) ++ ],[ ++ AC_MSG_RESULT(int) ++ ]) ++ EXTRA_KCFLAGS="$tmp_flags" ++]) +diff --git a/config/kernel.m4 b/config/kernel.m4 +index 7b8e3b0..46c0255 100644 +--- a/config/kernel.m4 ++++ b/config/kernel.m4 +@@ -7,6 +7,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ + ZFS_AC_TEST_MODULE + ZFS_AC_KERNEL_CONFIG + ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS ++ ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID + ZFS_AC_KERNEL_TYPE_FMODE_T + ZFS_AC_KERNEL_KOBJ_NAME_LEN + ZFS_AC_KERNEL_3ARG_BLKDEV_GET +diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c +index e35c91b..b516156 100644 +--- a/module/zfs/zvol.c ++++ b/module/zfs/zvol.c +@@ -1024,7 +1024,11 @@ out_mutex: + return (error); + } + ++#ifdef HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID ++static void ++#else + static int ++#endif + zvol_release(struct gendisk *disk, fmode_t mode) + { + zvol_state_t *zv = disk->private_data; +@@ -1044,7 +1048,9 @@ zvol_release(struct gendisk *disk, fmode_t mode) + if (drop_mutex) + mutex_exit(&zvol_state_lock); + ++#ifndef HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID + return (0); ++#endif + } + + static int diff --git a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.5-discard-on-zvol-fix.patch b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.5-discard-on-zvol-fix.patch new file mode 100644 index 000000000000..632d08d28e1f --- /dev/null +++ b/sys-fs/zfs-kmod/files/zfs-kmod-0.6.5-discard-on-zvol-fix.patch @@ -0,0 +1,31 @@ +From 96165264ad0afe7a5d440ef49f9712a188486266 Mon Sep 17 00:00:00 2001 +From: Richard Yao <ryao@gentoo.org> +Date: Fri, 18 Sep 2015 08:32:52 -0400 +Subject: [PATCH] Discard on zvols should not exceed the length of a block + +37f9dac592bf5889c3efb305c48ac39b4c7dd140 replaced the end-start +calculation with a cached value, but neglected to update it on discard +operations. This can cause us to discard data not requested, causing +data loss on zvols. + +Reported-by: Richard Connon <richard.connon@zynstra.com> +Signed-off-by: Richard Yao <ryao@gentoo.org> +--- + module/zfs/zvol.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c +index 492f8ff..c5a8071 100644 +--- a/module/zfs/zvol.c ++++ b/module/zfs/zvol.c +@@ -661,6 +661,7 @@ zvol_discard(struct bio *bio) + if (!(bio->bi_rw & REQ_SECURE)) { + start = P2ROUNDUP(start, zv->zv_volblocksize); + end = P2ALIGN(end, zv->zv_volblocksize); ++ size = end - start; + } + #endif + +-- +2.4.6 + |