Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Sep 2012 20:13:07 +0300
From:      Andriy Gapon <avg@FreeBSD.org>
To:        freebsd-fs@FreeBSD.org
Cc:        freebsd-geom@FreeBSD.org
Subject:   zfs zvol: set geom mediasize right at creation time
Message-ID:  <505DF1A3.1020809@FreeBSD.org>

next in thread | raw e-mail | index | archive | help

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@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?505DF1A3.1020809>