mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-01-25 10:12:13 +03:00
Accidentally introduced by dc04a8c which now takes the SCL_VDEV lock
as a reader in zfs_blkptr_verify(). A deadlock can occur if the
/etc/hostid file resides on a dataset in the same pool. This is
because reading the /etc/hostid file may occur while the caller is
holding the SCL_VDEV lock as a writer. For example, to perform a
`zpool attach` as shown in the abbreviated stack below.
To resolve the issue we cache the system's hostid when initializing
the spa_t, or when modifying the multihost property. The cached
value is then relied upon for subsequent accesses.
Call Trace:
spa_config_enter+0x1e8/0x350 [zfs]
zfs_blkptr_verify+0x33c/0x4f0 [zfs] <--- trying read lock
zio_read+0x6c/0x140 [zfs]
...
vfs_read+0xfc/0x1e0
kernel_read+0x50/0x90
...
spa_get_hostid+0x1c/0x38 [zfs]
spa_config_generate+0x1a0/0x610 [zfs]
vdev_label_init+0xa0/0xc80 [zfs]
vdev_create+0x98/0xe0 [zfs]
spa_vdev_attach+0x14c/0xb40 [zfs] <--- grabbed write lock
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #9256
Closes #9285
22 lines
470 B
Makefile
22 lines
470 B
Makefile
pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/mmp
|
|
dist_pkgdata_SCRIPTS = \
|
|
multihost_history.ksh \
|
|
mmp_on_thread.ksh \
|
|
mmp_on_uberblocks.ksh \
|
|
mmp_on_off.ksh \
|
|
mmp_interval.ksh \
|
|
mmp_active_import.ksh \
|
|
mmp_inactive_import.ksh \
|
|
mmp_exported_import.ksh \
|
|
mmp_write_uberblocks.ksh \
|
|
mmp_reset_interval.ksh \
|
|
mmp_on_zdb.ksh \
|
|
mmp_write_distribution.ksh \
|
|
mmp_hostid.ksh \
|
|
setup.ksh \
|
|
cleanup.ksh
|
|
|
|
dist_pkgdata_DATA = \
|
|
mmp.kshlib \
|
|
mmp.cfg
|