diff options
author | Martin Matuska <mm@FreeBSD.org> | 2021-03-03 01:25:03 +0000 |
---|---|---|
committer | Martin Matuska <mm@FreeBSD.org> | 2021-03-06 20:23:22 +0000 |
commit | 2fa2d50ead44d148482a05284f5c3524475c8e6e (patch) | |
tree | 957a54fd8faa84e5f7fa14a37d0260ca8b54aa2a | |
parent | 8d25741b633af6652fe8bfff1cb157a31e66cc60 (diff) | |
download | src-2fa2d50ead44d148482a05284f5c3524475c8e6e.tar.gz src-2fa2d50ead44d148482a05284f5c3524475c8e6e.zip |
zfs: fix overly broad locking in spa_vdev_config_exit()
Resolves a deadlock which can occur when the ZED or zpool
command attaches a new device.
From the openzfs 75a089ed3 commit message:
Calling vdev_free() only requires the we acquire the spa config
SCL_STATE_ALL locks, not the SCL_ALL locks. In particular, we need
need to avoid taking the SCL_CONFIG lock (included in SCL_ALL) as a
writer since this can lead to a deadlock. The txg_sync_thread() may
block in spa_txg_history_init_io() when taking the SCL_CONFIG lock
as a reading when it detects there's a pending writer.
Obtained from: openzfs/zfs@75a089ed34befb8d11df9be92a4438cc49554bf6
Approved by: re (delphij)
(cherry picked from commit f08e17c8a251210b58d63b52bfe1a77dccff6e78)
-rw-r--r-- | sys/contrib/openzfs/module/zfs/spa_misc.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/contrib/openzfs/module/zfs/spa_misc.c b/sys/contrib/openzfs/module/zfs/spa_misc.c index f49be8eec01a..f11ec0f60574 100644 --- a/sys/contrib/openzfs/module/zfs/spa_misc.c +++ b/sys/contrib/openzfs/module/zfs/spa_misc.c @@ -1275,9 +1275,9 @@ spa_vdev_config_exit(spa_t *spa, vdev_t *vd, uint64_t txg, int error, char *tag) */ vdev_autotrim_stop_wait(vd); - spa_config_enter(spa, SCL_ALL, spa, RW_WRITER); + spa_config_enter(spa, SCL_STATE_ALL, spa, RW_WRITER); vdev_free(vd); - spa_config_exit(spa, SCL_ALL, spa); + spa_config_exit(spa, SCL_STATE_ALL, spa); } /* |