summaryrefslogtreecommitdiff
path: root/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfsctl_expire_snapshot-deadlock.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfsctl_expire_snapshot-deadlock.patch')
-rw-r--r--sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfsctl_expire_snapshot-deadlock.patch73
1 files changed, 0 insertions, 73 deletions
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
deleted file mode 100644
index 7cca7d1137c..00000000000
--- a/sys-fs/zfs-kmod/files/zfs-kmod-0.6.1-fix-zfsctl_expire_snapshot-deadlock.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-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
-