summaryrefslogtreecommitdiffstats
path: root/sys/cddl
diff options
context:
space:
mode:
authorasomers <asomers@FreeBSD.org>2014-01-10 16:56:59 +0000
committerasomers <asomers@FreeBSD.org>2014-01-10 16:56:59 +0000
commitd1a85fc0d902ec64935b883e4d168a9150ef7822 (patch)
tree485c35d6e2805b0573a2348c81582acd95d2e663 /sys/cddl
parent65169ca8a03275870336017f91b02d8d16abdd24 (diff)
downloadFreeBSD-src-d1a85fc0d902ec64935b883e4d168a9150ef7822.zip
FreeBSD-src-d1a85fc0d902ec64935b883e4d168a9150ef7822.tar.gz
MFC 259240
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c When a da or ada device dissappears, outstanding IOs fail with ENXIO, not EIO. The check for EIO was probably copied from Illumos, where that is indeed the correct errno. Without this change, pulling a busy drive from a zpool would usually turn it into UNAVAIL, even though pulling an idle drive would turn it into REMOVED. With this change, it is REMOVED every time. Also, vdev_geom_io_intr shouldn't do zfs_post_remove, because that results in devd getting two resource.fs.zfs.removed events. The comment said that the event had to be sent directly instead of through the async removal thread because "the DE engine is using this information to discard prevoius I/O errors". However, the fact that vdev_geom_io_intr was never actually sending the events until now, and that vdev_geom_orphan never sent them at all, and that vdev_geom_orphan usually gets called about 2 seconds after the actual removal, means that FreeBSD's userland can cope with a late event just fine.
Diffstat (limited to 'sys/cddl')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c10
1 files changed, 1 insertions, 9 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
index 741a60b..55bf229 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
@@ -735,20 +735,12 @@ vdev_geom_io_intr(struct bio *bp)
*/
vd->vdev_notrim = B_TRUE;
}
- if (zio->io_error == EIO && !vd->vdev_remove_wanted) {
+ if (zio->io_error == ENXIO && !vd->vdev_remove_wanted) {
/*
* If provider's error is set we assume it is being
* removed.
*/
if (bp->bio_to->error != 0) {
- /*
- * We post the resource as soon as possible, instead of
- * when the async removal actually happens, because the
- * DE is using this information to discard previous I/O
- * errors.
- */
- /* XXX: zfs_post_remove() can sleep. */
- zfs_post_remove(zio->io_spa, vd);
vd->vdev_remove_wanted = B_TRUE;
spa_async_request(zio->io_spa, SPA_ASYNC_REMOVE);
} else if (!vd->vdev_delayed_close) {
OpenPOWER on IntegriCloud