mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
nopwrites on dmu_sync-ed blocks can result in a panic
After device removal, performing nopwrites on a dmu_sync-ed block will result in a panic. This panic can show up in two ways: 1. an attempt to issue an IOCTL in vdev_indirect_io_start() 2. a failed comparison of zio->io_bp and zio->io_bp_orig in zio_done() To resolve both of these panics, nopwrites of blocks on indirect vdevs should be ignored and new allocations should be performed on concrete vdevs. Reviewed-by: Igor Kozhukhov <igor@dilos.org> Reviewed-by: Pavel Zakharov <pavel.zakharov@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Don Brady <don.brady@delphix.com> Signed-off-by: George Wilson <gwilson@delphix.com> Closes #8957
This commit is contained in:
committed by
Tony Hutter
parent
04d4df89f4
commit
7d2489cfad
@@ -2862,6 +2862,20 @@ zio_nop_write(zio_t *zio)
|
||||
ASSERT(bcmp(&bp->blk_prop, &bp_orig->blk_prop,
|
||||
sizeof (uint64_t)) == 0);
|
||||
|
||||
/*
|
||||
* If we're overwriting a block that is currently on an
|
||||
* indirect vdev, then ignore the nopwrite request and
|
||||
* allow a new block to be allocated on a concrete vdev.
|
||||
*/
|
||||
spa_config_enter(zio->io_spa, SCL_VDEV, FTAG, RW_READER);
|
||||
vdev_t *tvd = vdev_lookup_top(zio->io_spa,
|
||||
DVA_GET_VDEV(&bp->blk_dva[0]));
|
||||
if (tvd->vdev_ops == &vdev_indirect_ops) {
|
||||
spa_config_exit(zio->io_spa, SCL_VDEV, FTAG);
|
||||
return (zio);
|
||||
}
|
||||
spa_config_exit(zio->io_spa, SCL_VDEV, FTAG);
|
||||
|
||||
*bp = *bp_orig;
|
||||
zio->io_pipeline = ZIO_INTERLOCK_PIPELINE;
|
||||
zio->io_flags |= ZIO_FLAG_NOPWRITE;
|
||||
|
||||
Reference in New Issue
Block a user