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);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to