summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/uts/common
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2016-11-12 23:40:40 +0000
committermav <mav@FreeBSD.org>2016-11-12 23:40:40 +0000
commit0def80e6a75e92dc2208ccf49c4fd260d22338d6 (patch)
treeca8ec2472ead73a049c9b6f7c731d13449ffdaa9 /sys/cddl/contrib/opensolaris/uts/common
parent23b24d7851fedef579b27b1018e8d102bbd75263 (diff)
downloadFreeBSD-src-0def80e6a75e92dc2208ccf49c4fd260d22338d6.zip
FreeBSD-src-0def80e6a75e92dc2208ccf49c4fd260d22338d6.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/contrib/opensolaris/uts/common')
-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 e1fe202..5a78b9e 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
@@ -778,7 +778,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();
@@ -863,6 +870,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;
/*
@@ -898,6 +906,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