diff options
author | Richard Yao <ryao@gentoo.org> | 2012-06-25 00:50:51 +0000 |
---|---|---|
committer | Richard Yao <ryao@gentoo.org> | 2012-06-25 00:50:51 +0000 |
commit | 3e313fb7bd63a809ac930fef68cc01a50d5c2477 (patch) | |
tree | f7c02bd16654b01fde30e6316059a52351d13823 /sys-fs | |
parent | Add myself as maintainer (diff) | |
download | gentoo-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/ChangeLog | 9 | ||||
-rw-r--r-- | sys-fs/zfs/files/zfs-0.6.0_rc9-range-lock-caller-allocate.patch | 122 | ||||
-rw-r--r-- | sys-fs/zfs/zfs-0.6.0_rc9-r1.ebuild | 144 |
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.') + +} |