Author: mav
Date: Sun Oct 18 11:23:58 2015
New Revision: 289498
URL: https://svnweb.freebsd.org/changeset/base/289498

Log:
  6298 zfs_create_008_neg and zpool_create_023_neg need to be updated for large 
block support
  
  Reviewed by: Matthew Ahrens <[email protected]>
  Reviewed by: John Kennedy <[email protected]>
  Approved by: Robert Mustacchi <[email protected]>
  Author: Joe Stein <[email protected]>
  
  illumos/illumos-gate@e9316f7696401f3e5e263a5939031cb8d5641a88

Modified:
  vendor/illumos/dist/cmd/zfs/zfs_main.c
  vendor/illumos/dist/lib/libzfs/common/libzfs.h
  vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c
  vendor/illumos/dist/lib/libzfs/common/libzfs_pool.c

Modified: vendor/illumos/dist/cmd/zfs/zfs_main.c
==============================================================================
--- vendor/illumos/dist/cmd/zfs/zfs_main.c      Sun Oct 18 11:21:08 2015        
(r289497)
+++ vendor/illumos/dist/cmd/zfs/zfs_main.c      Sun Oct 18 11:23:58 2015        
(r289498)
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
  * Copyright 2012 Milan Jurik. All rights reserved.
  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  * Copyright (c) 2013 Steven Hartland.  All rights reserved.
@@ -809,7 +809,6 @@ zfs_do_create(int argc, char **argv)
                        goto error;
                spa_version = zpool_get_prop_int(zpool_handle,
                    ZPOOL_PROP_VERSION, NULL);
-               zpool_close(zpool_handle);
                if (spa_version >= SPA_VERSION_REFRESERVATION)
                        resv_prop = ZFS_PROP_REFRESERVATION;
                else
@@ -818,8 +817,11 @@ zfs_do_create(int argc, char **argv)
                (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)
+                   props, 0, NULL, zpool_handle, msg)) == NULL) {
+                       zpool_close(zpool_handle);
                        goto error;
+               }
+               zpool_close(zpool_handle);
 
                volsize = zvol_volsize_to_reservation(volsize, real_props);
                nvlist_free(real_props);

Modified: vendor/illumos/dist/lib/libzfs/common/libzfs.h
==============================================================================
--- vendor/illumos/dist/lib/libzfs/common/libzfs.h      Sun Oct 18 11:21:08 
2015        (r289497)
+++ vendor/illumos/dist/lib/libzfs/common/libzfs.h      Sun Oct 18 11:23:58 
2015        (r289498)
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  * Copyright (c) 2013 Steven Hartland. All rights reserved.
  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
@@ -421,7 +421,7 @@ extern const char *zfs_prop_column_name(
 extern boolean_t zfs_prop_align_right(zfs_prop_t);
 
 extern nvlist_t *zfs_valid_proplist(libzfs_handle_t *, zfs_type_t,
-    nvlist_t *, uint64_t, zfs_handle_t *, const char *);
+    nvlist_t *, uint64_t, zfs_handle_t *, zpool_handle_t *, const char *);
 
 extern const char *zfs_prop_to_name(zfs_prop_t);
 extern int zfs_prop_set(zfs_handle_t *, const char *, const char *);

Modified: vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c      Sun Oct 18 
11:21:08 2015        (r289497)
+++ vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c      Sun Oct 18 
11:23:58 2015        (r289498)
@@ -22,7 +22,7 @@
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2013, Joyent, Inc. All rights reserved.
- * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
  * Copyright (c) 2012 DEY Storage Systems, Inc.  All rights reserved.
  * Copyright (c) 2013 Martin Matuska. All rights reserved.
  * Copyright (c) 2013 Steven Hartland. All rights reserved.
@@ -858,7 +858,8 @@ zfs_which_resv_prop(zfs_handle_t *zhp, z
  */
 nvlist_t *
 zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
-    uint64_t zoned, zfs_handle_t *zhp, const char *errbuf)
+    uint64_t zoned, zfs_handle_t *zhp, zpool_handle_t *zpool_hdl,
+    const char *errbuf)
 {
        nvpair_t *elem;
        uint64_t intval;
@@ -1052,8 +1053,8 @@ zfs_valid_proplist(libzfs_handle_t *hdl,
                case ZFS_PROP_RECORDSIZE:
                {
                        int maxbs = SPA_MAXBLOCKSIZE;
-                       if (zhp != NULL) {
-                               maxbs = zpool_get_prop_int(zhp->zpool_hdl,
+                       if (zpool_hdl != NULL) {
+                               maxbs = zpool_get_prop_int(zpool_hdl,
                                    ZPOOL_PROP_MAXBLOCKSIZE, NULL);
                        }
                        /*
@@ -1545,7 +1546,8 @@ zfs_prop_set_list(zfs_handle_t *zhp, nvl
            zhp->zfs_name);
 
        if ((nvl = zfs_valid_proplist(hdl, zhp->zfs_type, props,
-           zfs_prop_get_int(zhp, ZFS_PROP_ZONED), zhp, errbuf)) == NULL)
+           zfs_prop_get_int(zhp, ZFS_PROP_ZONED), zhp, zhp->zpool_hdl,
+           errbuf)) == NULL)
                goto error;
 
        /*
@@ -3181,9 +3183,23 @@ zfs_create(libzfs_handle_t *hdl, const c
        else
                ost = DMU_OST_ZFS;
 
+       /* open zpool handle for prop validation */
+       char pool_path[MAXNAMELEN];
+       (void) strlcpy(pool_path, path, sizeof (pool_path));
+
+       /* truncate pool_path at first slash */
+       char *p = strchr(pool_path, '/');
+       if (p != NULL)
+               *p = '\0';
+
+       zpool_handle_t *zpool_handle = zpool_open(hdl, pool_path);
+
        if (props && (props = zfs_valid_proplist(hdl, type, props,
-           zoned, NULL, errbuf)) == 0)
+           zoned, NULL, zpool_handle, errbuf)) == 0) {
+               zpool_close(zpool_handle);
                return (-1);
+       }
+       zpool_close(zpool_handle);
 
        if (type == ZFS_TYPE_VOLUME) {
                /*
@@ -3251,13 +3267,6 @@ zfs_create(libzfs_handle_t *hdl, const c
                            "parent '%s' is not a filesystem"), parent);
                        return (zfs_error(hdl, EZFS_BADTYPE, errbuf));
 
-               case EDOM:
-                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
-                           "volume block size must be power of 2 from "
-                           "512B to 128KB"));
-
-                       return (zfs_error(hdl, EZFS_BADPROP, errbuf));
-
                case ENOTSUP:
                        zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
                            "pool must be upgraded to set this "
@@ -3452,7 +3461,7 @@ zfs_clone(zfs_handle_t *zhp, const char 
                        type = ZFS_TYPE_FILESYSTEM;
                }
                if ((props = zfs_valid_proplist(hdl, type, props, zoned,
-                   zhp, errbuf)) == NULL)
+                   zhp, zhp->zpool_hdl, errbuf)) == NULL)
                        return (-1);
        }
 
@@ -3596,11 +3605,23 @@ zfs_snapshot_nvl(libzfs_handle_t *hdl, n
                }
        }
 
+       /*
+        * get pool handle for prop validation. assumes all snaps are in the
+        * same pool, as does lzc_snapshot (below).
+        */
+       char pool[MAXNAMELEN];
+       elem = nvlist_next_nvpair(snaps, NULL);
+       (void) strlcpy(pool, nvpair_name(elem), sizeof (pool));
+       pool[strcspn(pool, "/@")] = '\0';
+       zpool_handle_t *zpool_hdl = zpool_open(hdl, pool);
+
        if (props != NULL &&
            (props = zfs_valid_proplist(hdl, ZFS_TYPE_SNAPSHOT,
-           props, B_FALSE, NULL, errbuf)) == NULL) {
+           props, B_FALSE, NULL, zpool_hdl, errbuf)) == NULL) {
+               zpool_close(zpool_hdl);
                return (-1);
        }
+       zpool_close(zpool_hdl);
 
        ret = lzc_snapshot(snaps, props, &errors);
 

Modified: vendor/illumos/dist/lib/libzfs/common/libzfs_pool.c
==============================================================================
--- vendor/illumos/dist/lib/libzfs/common/libzfs_pool.c Sun Oct 18 11:21:08 
2015        (r289497)
+++ vendor/illumos/dist/lib/libzfs/common/libzfs_pool.c Sun Oct 18 11:23:58 
2015        (r289498)
@@ -1131,8 +1131,8 @@ zpool_create(libzfs_handle_t *hdl, const
                    zfs_prop_to_name(ZFS_PROP_ZONED), &zonestr) == 0) &&
                    strcmp(zonestr, "on") == 0);
 
-               if ((zc_fsprops = zfs_valid_proplist(hdl,
-                   ZFS_TYPE_FILESYSTEM, fsprops, zoned, NULL, msg)) == NULL) {
+               if ((zc_fsprops = zfs_valid_proplist(hdl, ZFS_TYPE_FILESYSTEM,
+                   fsprops, zoned, NULL, NULL, msg)) == NULL) {
                        goto create_failed;
                }
                if (!zc_props &&
@@ -1168,6 +1168,21 @@ zpool_create(libzfs_handle_t *hdl, const
                            "one or more vdevs refer to the same device"));
                        return (zfs_error(hdl, EZFS_BADDEV, msg));
 
+               case ERANGE:
+                       /*
+                        * This happens if the record size is smaller or larger
+                        * than the allowed size range, or not a power of 2.
+                        *
+                        * NOTE: although zfs_valid_proplist is called earlier,
+                        * this case may have slipped through since the
+                        * pool does not exist yet and it is therefore
+                        * impossible to read properties e.g. max blocksize
+                        * from the pool.
+                        */
+                       zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+                           "record size invalid"));
+                       return (zfs_error(hdl, EZFS_BADPROP, msg));
+
                case EOVERFLOW:
                        /*
                         * This occurs when one of the devices is below
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to