Update to ZFS 2.1.3
This change updates the ZFS project to version 2.1.3.
This commit is contained in:
parent
593f0d2b95
commit
7b237c1d85
6 changed files with 9 additions and 231 deletions
1
debian/patches/series.zfs
vendored
1
debian/patches/series.zfs
vendored
|
@ -9,4 +9,3 @@ zfs/0008-Add-systemd-unit-for-importing-specific-pools.patch
|
|||
zfs/0009-Patch-move-manpage-arcstat-1-to-arcstat-8.patch
|
||||
zfs/0010-arcstat-Fix-integer-division-with-python3.patch
|
||||
zfs/0011-arc-stat-summary-guard-access-to-l2arc-MFU-MRU-stats.patch
|
||||
zfs/0012-Fix-zvol_open-lock-inversion.patch
|
||||
|
|
|
@ -10,7 +10,7 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||
1 file changed, 29 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/config/zfs-meta.m4 b/config/zfs-meta.m4
|
||||
index b3c1befaa..660d8ccb9 100644
|
||||
index 20064a0fb..4d5f545ad 100644
|
||||
--- a/config/zfs-meta.m4
|
||||
+++ b/config/zfs-meta.m4
|
||||
@@ -1,9 +1,10 @@
|
||||
|
@ -67,4 +67,4 @@ index b3c1befaa..660d8ccb9 100644
|
|||
+ elif test ! -f ".nogitrelease" && git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
_match="${ZFS_META_NAME}-${ZFS_META_VERSION}"
|
||||
_alias=$(git describe --match=${_match} 2>/dev/null)
|
||||
_release=$(echo ${_alias}|cut -f3- -d'-'|sed 's/-/_/g')
|
||||
_release=$(echo ${_alias}|sed "s/${ZFS_META_NAME}//"|cut -f3- -d'-'|tr - _)
|
19
debian/patches/zfs/0005-Enable-zed-emails.patch
vendored
19
debian/patches/zfs/0005-Enable-zed-emails.patch
vendored
|
@ -9,23 +9,14 @@ behavior of mdadm.
|
|||
|
||||
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||
---
|
||||
cmd/zed/zed.d/zed.rc | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
cmd/zed/zed.d/zed.rc | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/cmd/zed/zed.d/zed.rc b/cmd/zed/zed.d/zed.rc
|
||||
index df560f921..4ce7af744 100644
|
||||
index 9ac77f929..672617f54 100644
|
||||
--- a/cmd/zed/zed.d/zed.rc
|
||||
+++ b/cmd/zed/zed.d/zed.rc
|
||||
@@ -15,7 +15,7 @@
|
||||
# Email will only be sent if ZED_EMAIL_ADDR is defined.
|
||||
# Disabled by default; uncomment to enable.
|
||||
#
|
||||
-#ZED_EMAIL_ADDR="root"
|
||||
+ZED_EMAIL_ADDR="root"
|
||||
|
||||
##
|
||||
# Name or path of executable responsible for sending notifications via email;
|
||||
@@ -41,7 +41,7 @@
|
||||
@@ -41,7 +41,7 @@ ZED_EMAIL_ADDR="root"
|
||||
##
|
||||
# Minimum number of seconds between notifications for a similar event.
|
||||
#
|
||||
|
@ -33,4 +24,4 @@ index df560f921..4ce7af744 100644
|
|||
+ZED_NOTIFY_INTERVAL_SECS=3600
|
||||
|
||||
##
|
||||
# Notification verbosity.
|
||||
# Notification verbosity.
|
|
@ -31,7 +31,7 @@ index e4056a92c..030611419 100644
|
|||
enable zfs-mount.service
|
||||
enable zfs-share.service
|
||||
diff --git a/etc/systemd/system/Makefile.am b/etc/systemd/system/Makefile.am
|
||||
index c374a52ac..25d1b99d7 100644
|
||||
index 5e65e1db4..8e6baeb68 100644
|
||||
--- a/etc/systemd/system/Makefile.am
|
||||
+++ b/etc/systemd/system/Makefile.am
|
||||
@@ -7,6 +7,7 @@ systemdunit_DATA = \
|
||||
|
|
|
@ -1,212 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Date: Fri, 17 Dec 2021 09:52:13 -0800
|
||||
Subject: [PATCH] Fix zvol_open() lock inversion
|
||||
|
||||
When restructuring the zvol_open() logic for the Linux 5.13 kernel
|
||||
a lock inversion was accidentally introduced. In the updated code
|
||||
the spa_namespace_lock is now taken before the zv_suspend_lock
|
||||
allowing the following scenario to occur:
|
||||
|
||||
down_read <=== waiting for zv_suspend_lock
|
||||
zvol_open <=== holds spa_namespace_lock
|
||||
__blkdev_get
|
||||
blkdev_get_by_dev
|
||||
blkdev_open
|
||||
...
|
||||
|
||||
mutex_lock <== waiting for spa_namespace_lock
|
||||
spa_open_common
|
||||
spa_open
|
||||
dsl_pool_hold
|
||||
dmu_objset_hold_flags
|
||||
dmu_objset_hold
|
||||
dsl_prop_get
|
||||
dsl_prop_get_integer
|
||||
zvol_create_minor
|
||||
dmu_recv_end
|
||||
zfs_ioc_recv_impl <=== holds zv_suspend_lock via zvol_suspend()
|
||||
zfs_ioc_recv
|
||||
...
|
||||
|
||||
This commit resolves the issue by moving the acquisition of the
|
||||
spa_namespace_lock back to after the zv_suspend_lock which restores
|
||||
the original ordering.
|
||||
|
||||
Additionally, as part of this change the error exit paths were
|
||||
simplified where possible.
|
||||
|
||||
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
|
||||
Reviewed-by: Rich Ercolani <rincebrain@gmail.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #12863
|
||||
(cherry picked from commit 8a02d01e85556bbe3a1c6947bc11b8ef028d4023)
|
||||
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||
---
|
||||
module/os/linux/zfs/zvol_os.c | 121 ++++++++++++++++------------------
|
||||
1 file changed, 58 insertions(+), 63 deletions(-)
|
||||
|
||||
diff --git a/module/os/linux/zfs/zvol_os.c b/module/os/linux/zfs/zvol_os.c
|
||||
index 44caadd58..69479b3f7 100644
|
||||
--- a/module/os/linux/zfs/zvol_os.c
|
||||
+++ b/module/os/linux/zfs/zvol_os.c
|
||||
@@ -496,8 +496,7 @@ zvol_open(struct block_device *bdev, fmode_t flag)
|
||||
{
|
||||
zvol_state_t *zv;
|
||||
int error = 0;
|
||||
- boolean_t drop_suspend = B_TRUE;
|
||||
- boolean_t drop_namespace = B_FALSE;
|
||||
+ boolean_t drop_suspend = B_FALSE;
|
||||
#ifndef HAVE_BLKDEV_GET_ERESTARTSYS
|
||||
hrtime_t timeout = MSEC2NSEC(zvol_open_timeout_ms);
|
||||
hrtime_t start = gethrtime();
|
||||
@@ -517,7 +516,36 @@ retry:
|
||||
return (SET_ERROR(-ENXIO));
|
||||
}
|
||||
|
||||
- if (zv->zv_open_count == 0 && !mutex_owned(&spa_namespace_lock)) {
|
||||
+ mutex_enter(&zv->zv_state_lock);
|
||||
+ /*
|
||||
+ * Make sure zvol is not suspended during first open
|
||||
+ * (hold zv_suspend_lock) and respect proper lock acquisition
|
||||
+ * ordering - zv_suspend_lock before zv_state_lock
|
||||
+ */
|
||||
+ if (zv->zv_open_count == 0) {
|
||||
+ if (!rw_tryenter(&zv->zv_suspend_lock, RW_READER)) {
|
||||
+ mutex_exit(&zv->zv_state_lock);
|
||||
+ rw_enter(&zv->zv_suspend_lock, RW_READER);
|
||||
+ mutex_enter(&zv->zv_state_lock);
|
||||
+ /* check to see if zv_suspend_lock is needed */
|
||||
+ if (zv->zv_open_count != 0) {
|
||||
+ rw_exit(&zv->zv_suspend_lock);
|
||||
+ } else {
|
||||
+ drop_suspend = B_TRUE;
|
||||
+ }
|
||||
+ } else {
|
||||
+ drop_suspend = B_TRUE;
|
||||
+ }
|
||||
+ }
|
||||
+ rw_exit(&zvol_state_lock);
|
||||
+
|
||||
+ ASSERT(MUTEX_HELD(&zv->zv_state_lock));
|
||||
+
|
||||
+ if (zv->zv_open_count == 0) {
|
||||
+ boolean_t drop_namespace = B_FALSE;
|
||||
+
|
||||
+ ASSERT(RW_READ_HELD(&zv->zv_suspend_lock));
|
||||
+
|
||||
/*
|
||||
* In all other call paths the spa_namespace_lock is taken
|
||||
* before the bdev->bd_mutex lock. However, on open(2)
|
||||
@@ -542,84 +570,51 @@ retry:
|
||||
* the kernel so the only option is to return the error for
|
||||
* the caller to handle it.
|
||||
*/
|
||||
- if (!mutex_tryenter(&spa_namespace_lock)) {
|
||||
- rw_exit(&zvol_state_lock);
|
||||
+ if (!mutex_owned(&spa_namespace_lock)) {
|
||||
+ if (!mutex_tryenter(&spa_namespace_lock)) {
|
||||
+ mutex_exit(&zv->zv_state_lock);
|
||||
+ rw_exit(&zv->zv_suspend_lock);
|
||||
|
||||
#ifdef HAVE_BLKDEV_GET_ERESTARTSYS
|
||||
- schedule();
|
||||
- return (SET_ERROR(-ERESTARTSYS));
|
||||
-#else
|
||||
- if ((gethrtime() - start) > timeout)
|
||||
+ schedule();
|
||||
return (SET_ERROR(-ERESTARTSYS));
|
||||
+#else
|
||||
+ if ((gethrtime() - start) > timeout)
|
||||
+ return (SET_ERROR(-ERESTARTSYS));
|
||||
|
||||
- schedule_timeout(MSEC_TO_TICK(10));
|
||||
- goto retry;
|
||||
+ schedule_timeout(MSEC_TO_TICK(10));
|
||||
+ goto retry;
|
||||
#endif
|
||||
- } else {
|
||||
- drop_namespace = B_TRUE;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- mutex_enter(&zv->zv_state_lock);
|
||||
- /*
|
||||
- * make sure zvol is not suspended during first open
|
||||
- * (hold zv_suspend_lock) and respect proper lock acquisition
|
||||
- * ordering - zv_suspend_lock before zv_state_lock
|
||||
- */
|
||||
- if (zv->zv_open_count == 0) {
|
||||
- if (!rw_tryenter(&zv->zv_suspend_lock, RW_READER)) {
|
||||
- mutex_exit(&zv->zv_state_lock);
|
||||
- rw_enter(&zv->zv_suspend_lock, RW_READER);
|
||||
- mutex_enter(&zv->zv_state_lock);
|
||||
- /* check to see if zv_suspend_lock is needed */
|
||||
- if (zv->zv_open_count != 0) {
|
||||
- rw_exit(&zv->zv_suspend_lock);
|
||||
- drop_suspend = B_FALSE;
|
||||
+ } else {
|
||||
+ drop_namespace = B_TRUE;
|
||||
}
|
||||
}
|
||||
- } else {
|
||||
- drop_suspend = B_FALSE;
|
||||
- }
|
||||
- rw_exit(&zvol_state_lock);
|
||||
-
|
||||
- ASSERT(MUTEX_HELD(&zv->zv_state_lock));
|
||||
|
||||
- if (zv->zv_open_count == 0) {
|
||||
- ASSERT(RW_READ_HELD(&zv->zv_suspend_lock));
|
||||
error = -zvol_first_open(zv, !(flag & FMODE_WRITE));
|
||||
- if (error)
|
||||
- goto out_mutex;
|
||||
- }
|
||||
|
||||
- if ((flag & FMODE_WRITE) && (zv->zv_flags & ZVOL_RDONLY)) {
|
||||
- error = -EROFS;
|
||||
- goto out_open_count;
|
||||
+ if (drop_namespace)
|
||||
+ mutex_exit(&spa_namespace_lock);
|
||||
}
|
||||
|
||||
- zv->zv_open_count++;
|
||||
-
|
||||
- mutex_exit(&zv->zv_state_lock);
|
||||
- if (drop_namespace)
|
||||
- mutex_exit(&spa_namespace_lock);
|
||||
- if (drop_suspend)
|
||||
- rw_exit(&zv->zv_suspend_lock);
|
||||
-
|
||||
- zfs_check_media_change(bdev);
|
||||
-
|
||||
- return (0);
|
||||
+ if (error == 0) {
|
||||
+ if ((flag & FMODE_WRITE) && (zv->zv_flags & ZVOL_RDONLY)) {
|
||||
+ if (zv->zv_open_count == 0)
|
||||
+ zvol_last_close(zv);
|
||||
|
||||
-out_open_count:
|
||||
- if (zv->zv_open_count == 0)
|
||||
- zvol_last_close(zv);
|
||||
+ error = SET_ERROR(-EROFS);
|
||||
+ } else {
|
||||
+ zv->zv_open_count++;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
-out_mutex:
|
||||
mutex_exit(&zv->zv_state_lock);
|
||||
- if (drop_namespace)
|
||||
- mutex_exit(&spa_namespace_lock);
|
||||
if (drop_suspend)
|
||||
rw_exit(&zv->zv_suspend_lock);
|
||||
|
||||
- return (SET_ERROR(error));
|
||||
+ if (error == 0)
|
||||
+ zfs_check_media_change(bdev);
|
||||
+
|
||||
+ return (error);
|
||||
}
|
||||
|
||||
static void
|
2
zfs
2
zfs
|
@ -1 +1 @@
|
|||
Subproject commit af88d47f1ee86fae4abcfe0dabca67ea3c94d377
|
||||
Subproject commit ef83e07db53e5d1017d3afbf376f4dbb2f6feada
|
Loading…
Reference in a new issue