Index: spa_misc.c =================================================================== --- spa_misc.c (revision 253644) +++ spa_misc.c (working copy) @@ -1134,7 +1134,7 @@ spa_vdev_state_exit(spa_t *spa, vdev_t *vd, int er * are synchronous. This is important for things like zpool offline: * when the command completes, you expect no further I/O from ZFS. */ - if (vd != NULL) + if (vd != NULL && !spa_suspended(spa)) txg_wait_synced(spa->spa_dsl_pool, 0); /* Index: zfs_ioctl.c =================================================================== --- zfs_ioctl.c (revision 253644) +++ zfs_ioctl.c (working copy) @@ -1884,6 +1884,9 @@ zfs_ioc_vdev_set_state(zfs_cmd_t *zc) switch (zc->zc_cookie) { case VDEV_STATE_ONLINE: error = vdev_online(spa, zc->zc_guid, zc->zc_obj, &newstate); + if (error == 0 && newstate == VDEV_STATE_HEALTHY) + if (zio_resume(spa) != 0) + error = SET_ERROR(EIO); break; case VDEV_STATE_OFFLINE: @@ -3384,6 +3387,8 @@ zfs_ioc_log_history(const char *unused, nvlist_t * strfree(poolname); if (error != 0) return (error); + if (spa_suspended(spa)) + return (SET_ERROR(EAGAIN)); if (nvlist_lookup_string(innvl, "message", &message) != 0) { spa_close(spa, FTAG); @@ -5451,8 +5456,8 @@ zfs_ioctl_init(void) zfs_ioc_vdev_add); zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_REMOVE, zfs_ioc_vdev_remove); - zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_SET_STATE, - zfs_ioc_vdev_set_state); + zfs_ioctl_register_pool(ZFS_IOC_VDEV_SET_STATE, zfs_ioc_vdev_set_state, + zfs_secpolicy_config, B_TRUE, POOL_CHECK_NONE); zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_ATTACH, zfs_ioc_vdev_attach); zfs_ioctl_register_pool_modify(ZFS_IOC_VDEV_DETACH,