zfs zvol: set geom mediasize right at creation time

Andriy Gapon avg at FreeBSD.org
Sat Sep 22 17:13:11 UTC 2012


Please review the following patch.

In addition to what the description says I almost by accident sneaked another
change into the patch.  It's setting of stripesize to volblocksize.  I think
that the change should make sense, but it is really a different change.


A side note: setting sectorsize to volblocksize seemed like an overkill and it
would certainly mess the existing zvols in use.  Maybe there should be another
property like reportedblocksize or something.

commit 1585e6cfb602c2a2647b9f802445bb174bc430a4
Author: Andriy Gapon <avg at icyb.net.ua>
Date:   Wed Sep 19 20:49:28 2012 +0300

    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.

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 d47d270..6e9e7a3 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 volblocksize, 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);
@@ -554,6 +566,7 @@ zvol_create_minor(const char *name)
 	error = dmu_object_info(os, ZVOL_OBJ, &doi);
 	ASSERT(error == 0);
 	zv->zv_volblocksize = doi.doi_data_block_size;
+	zv->zv_provider->stripesize = zv->zv_volblocksize;

 	if (spa_writeable(dmu_objset_spa(os))) {
 		if (zil_replay_disable)

-- 
Andriy Gapon


More information about the freebsd-fs mailing list