Date: Wed, 3 Mar 2021 02:00:48 GMT From: Martin Matuska <mm@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: f08e17c8a251 - stable/13 - zfs: fix overly broad locking in spa_vdev_config_exit() Message-ID: <202103030200.12320mCi096499@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by mm: URL: https://cgit.FreeBSD.org/src/commit/?id=f08e17c8a251210b58d63b52bfe1a77dccff6e78 commit f08e17c8a251210b58d63b52bfe1a77dccff6e78 Author: Martin Matuska <mm@FreeBSD.org> AuthorDate: 2021-03-03 01:25:03 +0000 Commit: Martin Matuska <mm@FreeBSD.org> CommitDate: 2021-03-03 01:25:03 +0000 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 MFS after: 3 days (direct commit) --- sys/contrib/openzfs/module/zfs/spa_misc.c | 4 ++-- 1 file 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); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202103030200.12320mCi096499>