Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 23 Feb 2013 09:06:36 +0000 (UTC)
From:      Martin Matuska <mm@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org
Subject:   svn commit: r247180 - vendor-sys/illumos/dist/uts/common/fs/zfs vendor-sys/illumos/dist/uts/common/fs/zfs/sys vendor/illumos/dist/cmd/zfs vendor/illumos/dist/lib/libzfs/common
Message-ID:  <201302230906.r1N96arJ032415@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mm
Date: Sat Feb 23 09:06:36 2013
New Revision: 247180
URL: http://svnweb.freebsd.org/changeset/base/247180

Log:
  Update vendor/illumos/dist and vendor-sys/illumos/dist
  to illumos-gate 13967:92bec6d87f59
  
  Illumos ZFS issues:
    3557 dumpvp_size is not updated correctly when a dump zvol's size is
         changed
    3558 setting the volsize on a dump device does not return back ENOSPC
    3559 setting a volsize larger than the space available sometimes succeeds

Modified:
  vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zvol.h
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c
  vendor-sys/illumos/dist/uts/common/fs/zfs/zvol.c

Changes in other areas also in this revision:
Modified:
  vendor/illumos/dist/cmd/zfs/zfs_main.c
  vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zvol.h
==============================================================================
--- vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zvol.h	Sat Feb 23 09:02:55 2013	(r247179)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/sys/zvol.h	Sat Feb 23 09:06:36 2013	(r247180)
@@ -43,7 +43,7 @@ extern void zvol_create_cb(objset_t *os,
 extern int zvol_create_minor(const char *);
 extern int zvol_remove_minor(const char *);
 extern void zvol_remove_minors(const char *);
-extern int zvol_set_volsize(const char *, major_t, uint64_t);
+extern int zvol_set_volsize(const char *, uint64_t);
 
 extern int zvol_open(dev_t *devp, int flag, int otyp, cred_t *cr);
 extern int zvol_dump(dev_t dev, caddr_t addr, daddr_t offset, int nblocks);

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c
==============================================================================
--- vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c	Sat Feb 23 09:02:55 2013	(r247179)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c	Sat Feb 23 09:06:36 2013	(r247180)
@@ -2368,8 +2368,7 @@ zfs_prop_set_special(const char *dsname,
 		err = dsl_dataset_set_reservation(dsname, source, intval);
 		break;
 	case ZFS_PROP_VOLSIZE:
-		err = zvol_set_volsize(dsname, ddi_driver_major(zfs_dip),
-		    intval);
+		err = zvol_set_volsize(dsname, intval);
 		break;
 	case ZFS_PROP_VERSION:
 	{

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/zvol.c
==============================================================================
--- vendor-sys/illumos/dist/uts/common/fs/zfs/zvol.c	Sat Feb 23 09:02:55 2013	(r247179)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/zvol.c	Sat Feb 23 09:06:36 2013	(r247180)
@@ -145,10 +145,11 @@ static int zvol_dump_fini(zvol_state_t *
 static int zvol_dump_init(zvol_state_t *zv, boolean_t resize);
 
 static void
-zvol_size_changed(uint64_t volsize, major_t maj, minor_t min)
+zvol_size_changed(zvol_state_t *zv, uint64_t volsize)
 {
-	dev_t dev = makedevice(maj, min);
+	dev_t dev = makedevice(ddi_driver_major(zfs_dip), zv->zv_minor);
 
+	zv->zv_volsize = volsize;
 	VERIFY(ddi_prop_update_int64(dev, zfs_dip,
 	    "Size", volsize) == DDI_SUCCESS);
 	VERIFY(ddi_prop_update_int64(dev, zfs_dip,
@@ -610,22 +611,22 @@ zvol_first_open(zvol_state_t *zv)
 	if (error)
 		return (error);
 
+	zv->zv_objset = os;
 	error = zap_lookup(os, ZVOL_ZAP_OBJ, "size", 8, 1, &volsize);
 	if (error) {
 		ASSERT(error == 0);
 		dmu_objset_disown(os, zvol_tag);
 		return (error);
 	}
-	zv->zv_objset = os;
+
 	error = dmu_bonus_hold(os, ZVOL_OBJ, zvol_tag, &zv->zv_dbuf);
 	if (error) {
 		dmu_objset_disown(os, zvol_tag);
 		return (error);
 	}
-	zv->zv_volsize = volsize;
+
+	zvol_size_changed(zv, volsize);
 	zv->zv_zilog = zil_open(os, zvol_get_data);
-	zvol_size_changed(zv->zv_volsize, ddi_driver_major(zfs_dip),
-	    zv->zv_minor);
 
 	VERIFY(dsl_prop_get_integer(zv->zv_name, "readonly", &readonly,
 	    NULL) == 0);
@@ -747,56 +748,37 @@ zvol_remove_minors(const char *name)
 	mutex_exit(&zfsdev_state_lock);
 }
 
-int
-zvol_set_volsize(const char *name, major_t maj, uint64_t volsize)
+static int
+zvol_set_volsize_impl(objset_t *os, zvol_state_t *zv, uint64_t volsize)
 {
-	zvol_state_t *zv = NULL;
-	objset_t *os;
-	int error;
-	dmu_object_info_t doi;
 	uint64_t old_volsize = 0ULL;
-	uint64_t readonly;
-
-	mutex_enter(&zfsdev_state_lock);
-	zv = zvol_minor_lookup(name);
-	if ((error = dmu_objset_hold(name, FTAG, &os)) != 0) {
-		mutex_exit(&zfsdev_state_lock);
-		return (error);
-	}
-
-	if ((error = dmu_object_info(os, ZVOL_OBJ, &doi)) != 0 ||
-	    (error = zvol_check_volsize(volsize,
-	    doi.doi_data_block_size)) != 0)
-		goto out;
-
-	VERIFY(dsl_prop_get_integer(name, "readonly", &readonly,
-	    NULL) == 0);
-	if (readonly) {
-		error = EROFS;
-		goto out;
-	}
+	int error;
 
+	ASSERT(MUTEX_HELD(&zfsdev_state_lock));
 	error = zvol_update_volsize(os, volsize);
+
 	/*
 	 * Reinitialize the dump area to the new size. If we
 	 * failed to resize the dump area then restore it back to
-	 * its original size.
+	 * its original size.  We must set the new volsize prior
+	 * to calling dumpvp_resize() to ensure that the devices'
+	 * size(9P) is not visible by the dump subsystem.
 	 */
 	if (zv && error == 0) {
+		old_volsize = zv->zv_volsize;
+		zvol_size_changed(zv, volsize);
+
 		if (zv->zv_flags & ZVOL_DUMPIFIED) {
-			old_volsize = zv->zv_volsize;
-			zv->zv_volsize = volsize;
 			if ((error = zvol_dumpify(zv)) != 0 ||
 			    (error = dumpvp_resize()) != 0) {
+				int dumpify_error;
+
 				(void) zvol_update_volsize(os, old_volsize);
-				zv->zv_volsize = old_volsize;
-				error = zvol_dumpify(zv);
+				zvol_size_changed(zv, old_volsize);
+				dumpify_error = zvol_dumpify(zv);
+				error = dumpify_error ? dumpify_error : error;
 			}
 		}
-		if (error == 0) {
-			zv->zv_volsize = volsize;
-			zvol_size_changed(volsize, maj, zv->zv_minor);
-		}
 	}
 
 	/*
@@ -819,12 +801,41 @@ zvol_set_volsize(const char *name, major
 		nvlist_free(attr);
 		kmem_free(physpath, MAXPATHLEN);
 	}
+	return (error);
+}
 
+int
+zvol_set_volsize(const char *name, uint64_t volsize)
+{
+	zvol_state_t *zv = NULL;
+	objset_t *os;
+	int error;
+	dmu_object_info_t doi;
+	uint64_t readonly;
+
+	mutex_enter(&zfsdev_state_lock);
+	zv = zvol_minor_lookup(name);
+	if ((error = dmu_objset_hold(name, FTAG, &os)) != 0) {
+		mutex_exit(&zfsdev_state_lock);
+		return (error);
+	}
+
+	if ((error = dmu_object_info(os, ZVOL_OBJ, &doi)) != 0 ||
+	    (error = zvol_check_volsize(volsize,
+	    doi.doi_data_block_size)) != 0)
+		goto out;
+
+	VERIFY3U(dsl_prop_get_integer(name,
+	    zfs_prop_to_name(ZFS_PROP_READONLY), &readonly, NULL), ==, 0);
+	if (readonly) {
+		error = EROFS;
+		goto out;
+	}
+
+	error = zvol_set_volsize_impl(os, zv, volsize);
 out:
 	dmu_objset_rele(os, FTAG);
-
 	mutex_exit(&zfsdev_state_lock);
-
 	return (error);
 }
 



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