diff options
-rw-r--r-- | .SRCINFO | 10 | ||||
-rw-r--r-- | PKGBUILD | 22 | ||||
-rw-r--r-- | upstream-ac09630-Fix-zpl_mount-deadlock.patch | 89 | ||||
-rw-r--r-- | zfs.install | 2 |
4 files changed, 109 insertions, 14 deletions
@@ -1,17 +1,19 @@ pkgbase = zfs-linux - pkgver = 0.7.9.4.17.8.1 - pkgrel = 1 + pkgver = 0.7.9.4.17.9.1 + pkgrel = 2 url = http://zfsonlinux.org/ arch = x86_64 license = CDDL - makedepends = linux-headers=4.17.8-1 + makedepends = linux-headers=4.17.9-1 makedepends = spl-linux-headers depends = kmod depends = spl-linux depends = zfs-utils-common=0.7.9 - depends = linux=4.17.8-1 + depends = linux=4.17.9-1 source = https://github.com/zfsonlinux/zfs/releases/download/zfs-0.7.9/zfs-0.7.9.tar.gz + source = upstream-ac09630-Fix-zpl_mount-deadlock.patch sha256sums = f50ca2441c6abde4fe6b9f54d5583a45813031d6bb72b0011b00fc2683cd9f7a + sha256sums = 1799f6f7b2a60a23b66106c9470414628398f6bfc10da3d0f41c548bba6130e8 pkgname = zfs-linux pkgdesc = Kernel modules for the Zettabyte File System. @@ -19,15 +19,19 @@ pkgbase="zfs-linux" pkgname=("zfs-linux" "zfs-linux-headers") -pkgver=0.7.9.4.17.8.1 -pkgrel=1 -makedepends=("linux-headers=4.17.8-1" "spl-linux-headers") +pkgver=0.7.9.4.17.9.1 +pkgrel=2 +makedepends=("linux-headers=4.17.9-1" "spl-linux-headers") arch=("x86_64") url="http://zfsonlinux.org/" -source=("https://github.com/zfsonlinux/zfs/releases/download/zfs-0.7.9/zfs-0.7.9.tar.gz") -sha256sums=("f50ca2441c6abde4fe6b9f54d5583a45813031d6bb72b0011b00fc2683cd9f7a") +source=("https://github.com/zfsonlinux/zfs/releases/download/zfs-0.7.9/zfs-0.7.9.tar.gz" "upstream-ac09630-Fix-zpl_mount-deadlock.patch") +sha256sums=("f50ca2441c6abde4fe6b9f54d5583a45813031d6bb72b0011b00fc2683cd9f7a" "1799f6f7b2a60a23b66106c9470414628398f6bfc10da3d0f41c548bba6130e8") license=("CDDL") -depends=("kmod" 'spl-linux' "zfs-utils-common=0.7.9" "linux=4.17.8-1") +depends=("kmod" 'spl-linux' "zfs-utils-common=0.7.9" "linux=4.17.9-1") +prepare() { + cd "${srcdir}/zfs-0.7.9" + patch -Np1 -i ${srcdir}/upstream-ac09630-Fix-zpl_mount-deadlock.patch +} build() { cd "${srcdir}/zfs-0.7.9" @@ -35,8 +39,8 @@ build() { ./configure --prefix=/usr --sysconfdir=/etc --sbindir=/usr/bin --libdir=/usr/lib \ --datadir=/usr/share --includedir=/usr/include --with-udevdir=/lib/udev \ --libexecdir=/usr/lib/zfs-0.7.9 --with-config=kernel \ - --with-linux=/usr/lib/modules/4.17.8-1-ARCH/build \ - --with-linux-obj=/usr/lib/modules/4.17.8-1-ARCH/build + --with-linux=/usr/lib/modules/4.17.9-1-ARCH/build \ + --with-linux-obj=/usr/lib/modules/4.17.9-1-ARCH/build make } @@ -62,5 +66,5 @@ package_zfs-linux-headers() { make DESTDIR="${pkgdir}" install rm -r "${pkgdir}/lib" # Remove reference to ${srcdir} - sed -i "s+${srcdir}++" ${pkgdir}/usr/src/zfs-*/4.17.8-1-ARCH/Module.symvers + sed -i "s+${srcdir}++" ${pkgdir}/usr/src/zfs-*/4.17.9-1-ARCH/Module.symvers } diff --git a/upstream-ac09630-Fix-zpl_mount-deadlock.patch b/upstream-ac09630-Fix-zpl_mount-deadlock.patch new file mode 100644 index 000000000000..082964ca5641 --- /dev/null +++ b/upstream-ac09630-Fix-zpl_mount-deadlock.patch @@ -0,0 +1,89 @@ +From ac09630d8b0bf6c92084a30fdaefd03fd0adbdc1 Mon Sep 17 00:00:00 2001 +From: Brian Behlendorf <behlendorf1@llnl.gov> +Date: Wed, 11 Jul 2018 15:49:10 -0700 +Subject: [PATCH] Fix zpl_mount() deadlock + +Commit 93b43af10 inadvertently introduced the following scenario which +can result in a deadlock. This issue was most easily reproduced by +LXD containers using a ZFS storage backend but should be reproducible +under any workload which is frequently mounting and unmounting. + +-- THREAD A -- +spa_sync() + spa_sync_upgrades() + rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG); <- Waiting on B + +-- THREAD B -- +mount_fs() + zpl_mount() + zpl_mount_impl() + dmu_objset_hold() + dmu_objset_hold_flags() + dsl_pool_hold() + dsl_pool_config_enter() + rrw_enter(&dp->dp_config_rwlock, RW_READER, tag); + sget() + sget_userns() + grab_super() + down_write(&s->s_umount); <- Waiting on C + +-- THREAD C -- +cleanup_mnt() + deactivate_super() + down_write(&s->s_umount); + deactivate_locked_super() + zpl_kill_sb() + kill_anon_super() + generic_shutdown_super() + sync_filesystem() + zpl_sync_fs() + zfs_sync() + zil_commit() + txg_wait_synced() <- Waiting on A + +Reviewed by: Alek Pinchuk <apinchuk@datto.com> +Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> +Closes #7598 +Closes #7659 +Closes #7691 +Closes #7693 +--- + include/sys/zfs_vfsops.h | 1 + + module/zfs/zpl_super.c | 11 ++++++++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +diff --git a/include/sys/zfs_vfsops.h b/include/sys/zfs_vfsops.h +index febfdff97f2..31c9c6d7f74 100644 +--- a/include/sys/zfs_vfsops.h ++++ b/include/sys/zfs_vfsops.h +@@ -32,6 +32,7 @@ + #include <sys/zil.h> + #include <sys/sa.h> + #include <sys/rrwlock.h> ++#include <sys/dsl_dataset.h> + #include <sys/zfs_ioctl.h> + + #ifdef __cplusplus +diff --git a/module/zfs/zpl_super.c b/module/zfs/zpl_super.c +index fc10271b787..5c426b0a9fb 100644 +--- a/module/zfs/zpl_super.c ++++ b/module/zfs/zpl_super.c +@@ -271,8 +271,17 @@ zpl_mount_impl(struct file_system_type *fs_type, int flags, zfs_mnt_t *zm) + if (err) + return (ERR_PTR(-err)); + ++ /* ++ * The dsl pool lock must be released prior to calling sget(). ++ * It is possible sget() may block on the lock in grab_super() ++ * while deactivate_super() holds that same lock and waits for ++ * a txg sync. If the dsl_pool lock is held over over sget() ++ * this can prevent the pool sync and cause a deadlock. ++ */ ++ dsl_pool_rele(dmu_objset_pool(os), FTAG); + s = zpl_sget(fs_type, zpl_test_super, set_anon_super, flags, os); +- dmu_objset_rele(os, FTAG); ++ dsl_dataset_rele(dmu_objset_ds(os), FTAG); ++ + if (IS_ERR(s)) + return (ERR_CAST(s)); + diff --git a/zfs.install b/zfs.install index 19d6cb87b101..2a9468504b8f 100644 --- a/zfs.install +++ b/zfs.install @@ -12,7 +12,7 @@ post_upgrade() { check_initramfs() { echo ">>> Updating ZFS module dependencies" - depmod -a 4.17.8-1-ARCH + depmod -a 4.17.9-1-ARCH MK_CONF=$(grep -v '#' /etc/mkinitcpio.conf | grep zfs >/dev/null; echo $?); if [[ ${MK_CONF} == '0' && $1 == 'remove' ]]; then echo '>>> The ZFS packages have been removed, but "zfs" remains in the "hooks"' |