summaryrefslogtreecommitdiffstats
path: root/sys/cddl
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2016-11-12 23:39:08 +0000
committermav <mav@FreeBSD.org>2016-11-12 23:39:08 +0000
commite281de74a57a5566caf99310cb0d33960303f288 (patch)
tree538aac9975575e907d84f5207a9427cce80dd97e /sys/cddl
parent17939f01f93e387810392a507abcd29251d405fb (diff)
downloadFreeBSD-src-e281de74a57a5566caf99310cb0d33960303f288.zip
FreeBSD-src-e281de74a57a5566caf99310cb0d33960303f288.tar.gz
MFC r308055: Add vdev_reopening support to vdev_geom.
It allows to avoid extra GEOM providers flapping without significant need. Since GEOM got resize support, we don't need to reopen provider to get new size. If provider was orphaned and no longer valid, ZFS should already know that, and in such case reopen should be done in full as expected.
Diffstat (limited to 'sys/cddl')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c13
1 files changed, 12 insertions, 1 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 fb0df0a..2529487 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
@@ -776,7 +776,14 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
return (EINVAL);
}
- vd->vdev_tsd = NULL;
+ /*
+ * Reopen the device if it's not currently open. Otherwise,
+ * just update the physical size of the device.
+ */
+ if ((cp = vd->vdev_tsd) != NULL) {
+ ASSERT(vd->vdev_reopening);
+ goto skip_open;
+ }
DROP_GIANT();
g_topology_lock();
@@ -861,6 +868,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *max_psize,
vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
return (error);
}
+skip_open:
pp = cp->provider;
/*
@@ -896,6 +904,9 @@ static void
vdev_geom_close(vdev_t *vd)
{
+ if (vd->vdev_reopening)
+ return;
+
DROP_GIANT();
g_topology_lock();
vdev_geom_close_locked(vd);
OpenPOWER on IntegriCloud