aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Gapon <avg@FreeBSD.org>2012-10-06 19:57:27 +0000
committerAndriy Gapon <avg@FreeBSD.org>2012-10-06 19:57:27 +0000
commit8bf749ef3a7a8c46811f68c985612e84501d23a0 (patch)
tree0c07d150af9ee0a7afe6e99318ccc5be5325268e
parenta90c9dfeab0a56e94ac81ffc9d77f9d4a19255c7 (diff)
downloadsrc-8bf749ef3a7a8c46811f68c985612e84501d23a0.tar.gz
src-8bf749ef3a7a8c46811f68c985612e84501d23a0.zip
zvol: set mediasize in geom provider right upon its creation
... instead of deferring the action until first open. Unlike upstream this has no benefit on FreeBSD. We know that as soon as the provider is created it is going to be tasted and thus opened. Initial mediasize of zero causes tasting failure and subsequent retasting because of the size change. MFC after: 14 days
Notes
Notes: svn path=/head/; revision=241297
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
index be4f5181fbdc..07fd3c68996b 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
@@ -475,6 +475,7 @@ zvol_create_minor(const char *name)
zvol_state_t *zv;
objset_t *os;
dmu_object_info_t doi;
+ uint64_t volsize;
int error;
ZFS_LOG(1, "Creating ZVOL %s...", name);
@@ -535,9 +536,20 @@ zvol_create_minor(const char *name)
zv = zs->zss_data = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP);
#else /* !sun */
+ error = zap_lookup(os, ZVOL_ZAP_OBJ, "size", 8, 1, &volsize);
+ if (error) {
+ ASSERT(error == 0);
+ dmu_objset_disown(os, zvol_tag);
+ mutex_exit(&spa_namespace_lock);
+ return (error);
+ }
+
DROP_GIANT();
g_topology_lock();
zv = zvol_geom_create(name);
+ zv->zv_volsize = volsize;
+ zv->zv_provider->mediasize = zv->zv_volsize;
+
#endif /* !sun */
(void) strlcpy(zv->zv_name, name, MAXPATHLEN);