]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
MFV r247180: Update vendor/illumos/dist and vendor-sys/illumos/dist
authormav <mav@FreeBSD.org>
Sun, 18 Oct 2015 11:36:43 +0000 (11:36 +0000)
committermav <mav@FreeBSD.org>
Sun, 18 Oct 2015 11:36:43 +0000 (11:36 +0000)
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

cddl/contrib/opensolaris/cmd/zfs/zfs_main.c
cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c

index e3ac1ca30d1abf052355a9027e4a53d64419c5d9..ffc1a099d999097cf75b7f4212d665a18ad01251 100644 (file)
@@ -845,10 +845,12 @@ zfs_do_create(int argc, char **argv)
 
        if (type == ZFS_TYPE_VOLUME && !noreserve) {
                zpool_handle_t *zpool_handle;
+               nvlist_t *real_props;
                uint64_t spa_version;
                char *p;
                zfs_prop_t resv_prop;
                char *strval;
+               char msg[1024];
 
                if (p = strchr(argv[0], '/'))
                        *p = '\0';
@@ -864,7 +866,15 @@ zfs_do_create(int argc, char **argv)
                        resv_prop = ZFS_PROP_REFRESERVATION;
                else
                        resv_prop = ZFS_PROP_RESERVATION;
-               volsize = zvol_volsize_to_reservation(volsize, props);
+
+               (void) snprintf(msg, sizeof (msg),
+                   gettext("cannot create '%s'"), argv[0]);
+               if (props && (real_props = zfs_valid_proplist(g_zfs, type,
+                   props, 0, NULL, msg)) == NULL)
+                       goto error;
+
+               volsize = zvol_volsize_to_reservation(volsize, real_props);
+               nvlist_free(real_props);
 
                if (nvlist_lookup_string(props, zfs_prop_to_name(resv_prop),
                    &strval) != 0) {
index 11b3df37bbe46bed9619e3bdb08441e30d96d231..74b0cb9d0bd270832b1a8e1482453bbdacce4722 100644 (file)
@@ -1403,6 +1403,7 @@ zfs_add_synthetic_resv(zfs_handle_t *zhp, nvlist_t *nvl)
        uint64_t old_reservation;
        uint64_t new_reservation;
        zfs_prop_t resv_prop;
+       nvlist_t *props;
 
        /*
         * If this is an existing volume, and someone is setting the volsize,
@@ -1412,16 +1413,25 @@ zfs_add_synthetic_resv(zfs_handle_t *zhp, nvlist_t *nvl)
        if (zfs_which_resv_prop(zhp, &resv_prop) < 0)
                return (-1);
        old_reservation = zfs_prop_get_int(zhp, resv_prop);
-       if ((zvol_volsize_to_reservation(old_volsize, zhp->zfs_props) !=
-           old_reservation) || nvlist_lookup_uint64(nvl,
-           zfs_prop_to_name(resv_prop), &new_reservation) != ENOENT) {
+
+       props = fnvlist_alloc();
+       fnvlist_add_uint64(props, zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE),
+           zfs_prop_get_int(zhp, ZFS_PROP_VOLBLOCKSIZE));
+
+       if ((zvol_volsize_to_reservation(old_volsize, props) !=
+           old_reservation) || nvlist_exists(nvl,
+           zfs_prop_to_name(resv_prop))) {
+               fnvlist_free(props);
                return (0);
        }
        if (nvlist_lookup_uint64(nvl, zfs_prop_to_name(ZFS_PROP_VOLSIZE),
-           &new_volsize) != 0)
+           &new_volsize) != 0) {
+               fnvlist_free(props);
                return (-1);
-       new_reservation = zvol_volsize_to_reservation(new_volsize,
-           zhp->zfs_props);
+       }
+       new_reservation = zvol_volsize_to_reservation(new_volsize, props);
+       fnvlist_free(props);
+
        if (nvlist_add_uint64(nvl, zfs_prop_to_name(resv_prop),
            new_reservation) != 0) {
                (void) no_memory(zhp->zfs_hdl);