Skip site navigation (1)Skip section navigation (2)
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>