mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 03:08:51 +03:00
vdev probe to slow disk can stall mmp write checker
Simplify vdev probes in the zio_vdev_io_done context to avoid holding the spa config lock for a long duration. Also allow zpool clear if no evidence of another host is using the pool. Sponsored-by: Klara, Inc. Sponsored-by: Wasabi Technology, Inc. Reviewed-by: Olaf Faaland <faaland1@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Don Brady <don.brady@klarasystems.com> Closes #15839
This commit is contained in:
+13
-9
@@ -1664,6 +1664,7 @@ vdev_metaslab_fini(vdev_t *vd)
|
||||
typedef struct vdev_probe_stats {
|
||||
boolean_t vps_readable;
|
||||
boolean_t vps_writeable;
|
||||
boolean_t vps_zio_done_probe;
|
||||
int vps_flags;
|
||||
} vdev_probe_stats_t;
|
||||
|
||||
@@ -1709,6 +1710,17 @@ vdev_probe_done(zio_t *zio)
|
||||
(void) zfs_ereport_post(FM_EREPORT_ZFS_PROBE_FAILURE,
|
||||
spa, vd, NULL, NULL, 0);
|
||||
zio->io_error = SET_ERROR(ENXIO);
|
||||
|
||||
/*
|
||||
* If this probe was initiated from zio pipeline, then
|
||||
* change the state in a spa_async_request. Probes that
|
||||
* were initiated from a vdev_open can change the state
|
||||
* as part of the open call.
|
||||
*/
|
||||
if (vps->vps_zio_done_probe) {
|
||||
vd->vdev_fault_wanted = B_TRUE;
|
||||
spa_async_request(spa, SPA_ASYNC_FAULT_VDEV);
|
||||
}
|
||||
}
|
||||
|
||||
mutex_enter(&vd->vdev_probe_lock);
|
||||
@@ -1759,6 +1771,7 @@ vdev_probe(vdev_t *vd, zio_t *zio)
|
||||
|
||||
vps->vps_flags = ZIO_FLAG_CANFAIL | ZIO_FLAG_PROBE |
|
||||
ZIO_FLAG_DONT_AGGREGATE | ZIO_FLAG_TRYHARD;
|
||||
vps->vps_zio_done_probe = (zio != NULL);
|
||||
|
||||
if (spa_config_held(spa, SCL_ZIO, RW_WRITER)) {
|
||||
/*
|
||||
@@ -1785,15 +1798,6 @@ vdev_probe(vdev_t *vd, zio_t *zio)
|
||||
vd->vdev_probe_zio = pio = zio_null(NULL, spa, vd,
|
||||
vdev_probe_done, vps,
|
||||
vps->vps_flags | ZIO_FLAG_DONT_PROPAGATE);
|
||||
|
||||
/*
|
||||
* We can't change the vdev state in this context, so we
|
||||
* kick off an async task to do it on our behalf.
|
||||
*/
|
||||
if (zio != NULL) {
|
||||
vd->vdev_probe_wanted = B_TRUE;
|
||||
spa_async_request(spa, SPA_ASYNC_PROBE);
|
||||
}
|
||||
}
|
||||
|
||||
if (zio != NULL)
|
||||
|
||||
Reference in New Issue
Block a user