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
Martin Matuska
mm at FreeBSD.org
Sat Feb 23 09:06:37 UTC 2013
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);
}
More information about the svn-src-vendor
mailing list