summaryrefslogtreecommitdiff
path: root/sys-fs
diff options
context:
space:
mode:
authorRichard Yao <ryao@gentoo.org>2012-06-25 00:50:51 +0000
committerRichard Yao <ryao@gentoo.org>2012-06-25 00:50:51 +0000
commit3e313fb7bd63a809ac930fef68cc01a50d5c2477 (patch)
treef7c02bd16654b01fde30e6316059a52351d13823 /sys-fs
parentAdd myself as maintainer (diff)
downloadgentoo-2-3e313fb7bd63a809ac930fef68cc01a50d5c2477.tar.gz
gentoo-2-3e313fb7bd63a809ac930fef68cc01a50d5c2477.tar.bz2
gentoo-2-3e313fb7bd63a809ac930fef68cc01a50d5c2477.zip
Fix swap deadlock involving zfs_range_lock() and zvols
(Portage version: 2.1.10.49/cvs/Linux x86_64)
Diffstat (limited to 'sys-fs')
-rw-r--r--sys-fs/zfs/ChangeLog9
-rw-r--r--sys-fs/zfs/files/zfs-0.6.0_rc9-range-lock-caller-allocate.patch122
-rw-r--r--sys-fs/zfs/zfs-0.6.0_rc9-r1.ebuild144
3 files changed, 274 insertions, 1 deletions
diff --git a/sys-fs/zfs/ChangeLog b/sys-fs/zfs/ChangeLog
index 80acf821abc5..56b526b19459 100644
--- a/sys-fs/zfs/ChangeLog
+++ b/sys-fs/zfs/ChangeLog
@@ -1,6 +1,13 @@
# ChangeLog for sys-fs/zfs
# Copyright 1999-2012 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-fs/zfs/ChangeLog,v 1.27 2012/06/18 15:19:14 ryao Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-fs/zfs/ChangeLog,v 1.28 2012/06/25 00:50:51 ryao Exp $
+
+*zfs-0.6.0_rc9-r1 (25 Jun 2012)
+
+ 25 Jun 2012; Richard Yao <ryao@gentoo.org>
+ +files/zfs-0.6.0_rc9-range-lock-caller-allocate.patch,
+ +zfs-0.6.0_rc9-r1.ebuild:
+ Fix swap deadlock involving zfs_range_lock() and zvols
18 Jun 2012; Richard Yao <ryao@gentoo.org> zfs-0.6.0_rc9.ebuild,
zfs-9999.ebuild:
diff --git a/sys-fs/zfs/files/zfs-0.6.0_rc9-range-lock-caller-allocate.patch b/sys-fs/zfs/files/zfs-0.6.0_rc9-range-lock-caller-allocate.patch
new file mode 100644
index 000000000000..e67b84661dad
--- /dev/null
+++ b/sys-fs/zfs/files/zfs-0.6.0_rc9-range-lock-caller-allocate.patch
@@ -0,0 +1,122 @@
+commit 59c247716c71837b0071fb933f731e7b82c98dd8
+Author: Gunnar Beutner <gunnar@beutner.name>
+Date: Mon Jun 18 11:44:34 2012 -0400
+
+ Fix znode corruption when using xattr=sa.
+
+ Using a separate SA handle (rather than zp->z_sa_hdl) to update
+ attributes corrupts the znode's mode flags (and possibly other
+ attributes as well).
+
+ This patch changes the zfs_sa_get_xattr/zfs_sa_set_xattr functions
+ so that they use zp->z_sa_hdl.
+
+ Signed-off-by: Richard Yao <ryao@cs.stonybrook.edu>
+
+diff --git a/module/zfs/zfs_sa.c b/module/zfs/zfs_sa.c
+index f35f6f6..7f14706 100644
+--- a/module/zfs/zfs_sa.c
++++ b/module/zfs/zfs_sa.c
+@@ -188,7 +188,6 @@ int
+ zfs_sa_get_xattr(znode_t *zp)
+ {
+ zfs_sb_t *zsb = ZTOZSB(zp);
+- sa_handle_t *sa;
+ char *obj;
+ int size;
+ int error;
+@@ -197,14 +196,8 @@ zfs_sa_get_xattr(znode_t *zp)
+ ASSERT(!zp->z_xattr_cached);
+ ASSERT(zp->z_is_sa);
+
+- error = sa_handle_get(zsb->z_os, zp->z_id, NULL, SA_HDL_PRIVATE, &sa);
+- if (error)
+- return (error);
+-
+- error = sa_size(sa, SA_ZPL_DXATTR(zsb), &size);
++ error = sa_size(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb), &size);
+ if (error) {
+- sa_handle_destroy(sa);
+-
+ if (error == ENOENT)
+ return nvlist_alloc(&zp->z_xattr_cached,
+ NV_UNIQUE_NAME, KM_SLEEP);
+@@ -212,14 +205,13 @@ zfs_sa_get_xattr(znode_t *zp)
+ return (error);
+ }
+
+- obj = sa_spill_alloc(KM_SLEEP);
++ obj = kmem_alloc(size, KM_SLEEP);
+
+- error = sa_lookup(sa, SA_ZPL_DXATTR(zsb), obj, size);
++ error = sa_lookup(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb), obj, size);
+ if (error == 0)
+ error = nvlist_unpack(obj, size, &zp->z_xattr_cached, KM_SLEEP);
+
+- sa_spill_free(obj);
+- sa_handle_destroy(sa);
++ kmem_free(obj, size);
+
+ return (error);
+ }
+@@ -228,7 +220,6 @@ int
+ zfs_sa_set_xattr(znode_t *zp)
+ {
+ zfs_sb_t *zsb = ZTOZSB(zp);
+- sa_handle_t *sa;
+ dmu_tx_t *tx;
+ char *obj;
+ size_t size;
+@@ -242,44 +233,27 @@ zfs_sa_set_xattr(znode_t *zp)
+ if (error)
+ goto out;
+
+- obj = sa_spill_alloc(KM_SLEEP);
++ obj = kmem_alloc(size, KM_SLEEP);
+
+ error = nvlist_pack(zp->z_xattr_cached, &obj, &size,
+ NV_ENCODE_XDR, KM_SLEEP);
+ if (error)
+- goto out_free;
+-
+- /*
+- * A private SA handle must be used to ensure we can drop the hold
+- * on the spill block prior to calling dmu_tx_commit(). If we call
+- * dmu_tx_commit() before sa_handle_destroy(), then our hold will
+- * trigger a copy of the buffer at txg sync time. This is done to
+- * prevent data from leaking in to the syncing txg. As a result
+- * the original dirty spill block will be remain dirty in the arc
+- * while the copy is written and laundered.
+- */
+- error = sa_handle_get(zsb->z_os, zp->z_id, NULL, SA_HDL_PRIVATE, &sa);
+- if (error)
+- goto out_free;
++ goto out;
+
+ tx = dmu_tx_create(zsb->z_os);
+ dmu_tx_hold_sa_create(tx, size);
+- dmu_tx_hold_sa(tx, sa, B_TRUE);
++ dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE);
+
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ if (error) {
+ dmu_tx_abort(tx);
+- sa_handle_destroy(sa);
+ } else {
+- error = sa_update(sa, SA_ZPL_DXATTR(zsb), obj, size, tx);
+- sa_handle_destroy(sa);
+- if (error)
+- dmu_tx_abort(tx);
+- else
+- dmu_tx_commit(tx);
++ VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb), obj,
++ size, tx));
++ dmu_tx_commit(tx);
+ }
+-out_free:
+- sa_spill_free(obj);
++
++ kmem_free(obj, size);
+ out:
+ return (error);
+ }
diff --git a/sys-fs/zfs/zfs-0.6.0_rc9-r1.ebuild b/sys-fs/zfs/zfs-0.6.0_rc9-r1.ebuild
new file mode 100644
index 000000000000..dab1249affb8
--- /dev/null
+++ b/sys-fs/zfs/zfs-0.6.0_rc9-r1.ebuild
@@ -0,0 +1,144 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-fs/zfs/zfs-0.6.0_rc9-r1.ebuild,v 1.1 2012/06/25 00:50:51 ryao Exp $
+
+EAPI="4"
+
+AT_M4DIR="config"
+AUTOTOOLS_AUTORECONF="1"
+AUTOTOOLS_IN_SOURCE_BUILD="1"
+
+inherit flag-o-matic linux-mod toolchain-funcs autotools-utils
+
+if [ ${PV} == "9999" ] ; then
+ inherit git-2
+ EGIT_REPO_URI="git://github.com/zfsonlinux/${PN}.git"
+else
+ inherit eutils versionator
+ MY_PV=$(replace_version_separator 3 '-')
+ SRC_URI="https://github.com/downloads/zfsonlinux/${PN}/${PN}-${MY_PV}.tar.gz"
+ S="${WORKDIR}/${PN}-${MY_PV}"
+ KEYWORDS="~amd64"
+fi
+
+DESCRIPTION="Native ZFS for Linux"
+HOMEPAGE="http://zfsonlinux.org/"
+
+LICENSE="CDDL GPL-2"
+SLOT="0"
+IUSE="custom-cflags debug dracut +rootfs test test-suite static-libs"
+
+DEPEND="
+ =sys-kernel/spl-${PV}*
+ sys-apps/util-linux[static-libs?]
+ sys-libs/zlib[static-libs(+)?]
+"
+RDEPEND="${DEPEND}
+ !sys-fs/zfs-fuse
+ !prefix? ( sys-fs/udev )
+ test-suite? (
+ sys-apps/gawk
+ sys-apps/util-linux
+ sys-devel/bc
+ sys-block/parted
+ sys-fs/lsscsi
+ sys-fs/mdadm
+ sys-process/procps
+ virtual/modutils
+ )
+ rootfs? (
+ app-arch/cpio
+ app-misc/pax-utils
+ )
+"
+DEPEND+="
+ test? ( sys-fs/mdadm )
+"
+
+pkg_setup() {
+ CONFIG_CHECK="!DEBUG_LOCK_ALLOC
+ !PREEMPT
+ !PREEMPT_VOLUNTARY
+ BLK_DEV_LOOP
+ EFI_PARTITION
+ MODULES
+ ZLIB_DEFLATE
+ ZLIB_INFLATE"
+ use rootfs && CONFIG_CHECK="${CONFIG_CHECK} DEVTMPFS"
+ kernel_is ge 2 6 26 || die "Linux 2.6.26 or newer required"
+ check_extra_config
+}
+
+src_prepare() {
+ # Workaround for hard coded path
+ sed -i "s|/sbin/lsmod|/bin/lsmod|" scripts/common.sh.in || die
+ # Workaround rename
+ sed -i "s|/usr/bin/scsi-rescan|/usr/sbin/rescan-scsi-bus|" scripts/common.sh.in || die
+
+ if [ ${PV} != "9999" ]
+ then
+ epatch "${FILESDIR}/${P}-hardened-support.patch"
+
+ # Fix various deadlocks
+ epatch "${FILESDIR}/${P}-use-pushpage.patch"
+ epatch "${FILESDIR}/${P}-remove-pfmalloc-1-of-3.patch"
+ epatch "${FILESDIR}/${P}-remove-pfmalloc-2-of-3.patch"
+ epatch "${FILESDIR}/${P}-remove-pfmalloc-3-of-3.patch"
+ epatch "${FILESDIR}/${P}-range-lock-caller-allocate.patch"
+ fi
+
+ autotools-utils_src_prepare
+}
+
+src_configure() {
+ use custom-cflags || strip-flags
+ set_arch_to_kernel
+ local myeconfargs=(
+ --bindir="${EPREFIX}/bin"
+ --sbindir="${EPREFIX}/sbin"
+ --with-config=all
+ --with-linux="${KV_DIR}"
+ --with-linux-obj="${KV_OUT_DIR}"
+ --with-udevdir="${EPREFIX}/lib/udev"
+ $(use_enable debug)
+ )
+ autotools-utils_src_configure
+}
+
+src_test() {
+ if [ $UID -ne 0 ]
+ then
+ ewarn "Cannot run make check tests with FEATURES=userpriv."
+ ewarn "Skipping make check tests."
+ else
+ autotools-utils_src_test
+ fi
+}
+
+src_install() {
+ autotools-utils_src_install
+ gen_usr_ldscript -a uutil nvpair zpool zfs
+ use dracut || rm -rf "${ED}usr/share/dracut"
+ use test-suite || rm -rf "${ED}usr/libexec"
+
+ if use rootfs
+ then
+ doinitd "${FILESDIR}/zfs-shutdown"
+ exeinto /usr/share/zfs
+ doexe "${FILESDIR}/linuxrc"
+ fi
+
+}
+
+pkg_postinst() {
+ linux-mod_pkg_postinst
+
+ use x86 && ewarn "32-bit kernels are unsupported by ZFSOnLinux upstream. Do not file bug reports."
+
+ [ -e "${EROOT}/etc/runlevels/boot/zfs" ] \
+ || ewarn 'You should add zfs to the boot runlevel.'
+
+ use rootfs && ([ -e "${EROOT}/etc/runlevels/shutdown/zfs-shutdown" ] \
+ || ewarn 'You should add zfs-shutdown to the shutdown runlevel.')
+
+}