Print this page
9286 want refreservation=auto

@@ -19,11 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2013, Joyent, Inc. All rights reserved.
+ * Copyright (c) 2018 Joyent, Inc.
  * Copyright (c) 2011, 2017 by Delphix. All rights reserved.
  * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
  * Copyright (c) 2017 Datto Inc.
  */
 

@@ -1182,10 +1182,11 @@
         data_type_t datatype = nvpair_type(elem);
         zprop_type_t proptype;
         const char *propname;
         char *value;
         boolean_t isnone = B_FALSE;
+        boolean_t isauto = B_FALSE;
 
         if (type == ZFS_TYPE_POOL) {
                 proptype = zpool_prop_get_type(prop);
                 propname = zpool_prop_to_name(prop);
         } else {

@@ -1217,12 +1218,13 @@
         case PROP_TYPE_NUMBER:
                 if (datatype == DATA_TYPE_STRING) {
                         (void) nvpair_value_string(elem, &value);
                         if (strcmp(value, "none") == 0) {
                                 isnone = B_TRUE;
-                        } else if (zfs_nicestrtonum(hdl, value, ivalp)
-                            != 0) {
+                        } else if (strcmp(value, "auto") == 0) {
+                                isauto = B_TRUE;
+                        } else if (zfs_nicestrtonum(hdl, value, ivalp) != 0) {
                                 goto error;
                         }
                 } else if (datatype == DATA_TYPE_UINT64) {
                         (void) nvpair_value_uint64(elem, ivalp);
                 } else {

@@ -1248,12 +1250,39 @@
                 if ((type & ZFS_TYPE_DATASET) && isnone &&
                     (prop == ZFS_PROP_FILESYSTEM_LIMIT ||
                     prop == ZFS_PROP_SNAPSHOT_LIMIT)) {
                         *ivalp = UINT64_MAX;
                 }
+
+                /*
+                 * Special handling for setting 'reservation' and
+                 * 'refreservation' to 'auto'.  Use UINT64_MAX to tell the
+                 * caller to use zfs_fix_auto_resv().  'auto' is only allowed on
+                 * volumes.
+                 */
+                if (isauto) {
+                        switch (prop) {
+                        case ZFS_PROP_RESERVATION:
+                        case ZFS_PROP_REFRESERVATION:
+                                if ((type & ZFS_TYPE_VOLUME) == 0) {
+                                        zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+                                            "'%s=auto' only allowed on "
+                                            "volumes"), nvpair_name(elem));
+                                        goto error;
+                                }
+                                *ivalp = UINT64_MAX;
                 break;
+                        default:
+                                zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+                                    "'auto' is invalid value for '%s'"),
+                                    nvpair_name(elem));
+                                goto error;
+                        }
+                }
 
+                break;
+
         case PROP_TYPE_INDEX:
                 if (datatype != DATA_TYPE_STRING) {
                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
                             "'%s' must be a string"), nvpair_name(elem));
                         goto error;