1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
  24  * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
  25  * Copyright (c) 2014 Integros [integros.com]
  26  */
  27 
  28 #include <sys/zio.h>
  29 #include <sys/spa.h>
  30 #include <sys/zfs_acl.h>
  31 #include <sys/zfs_ioctl.h>
  32 #include <sys/fs/zfs.h>
  33 
  34 #include "zfs_prop.h"
  35 
  36 #if defined(_KERNEL)
  37 #include <sys/systm.h>
  38 #else
  39 #include <stdlib.h>
  40 #include <string.h>
  41 #include <ctype.h>
  42 #endif
  43 
  44 static zprop_desc_t zpool_prop_table[ZPOOL_NUM_PROPS];
  45 
  46 zprop_desc_t *
  47 zpool_prop_get_table(void)
  48 {
  49         return (zpool_prop_table);
  50 }
  51 
  52 void
  53 zpool_prop_init(void)
  54 {
  55         static zprop_index_t boolean_table[] = {
  56                 { "off",        0},
  57                 { "on",         1},
  58                 { NULL }
  59         };
  60 
  61         static zprop_index_t failuremode_table[] = {
  62                 { "wait",       ZIO_FAILURE_MODE_WAIT },
  63                 { "continue",   ZIO_FAILURE_MODE_CONTINUE },
  64                 { "panic",      ZIO_FAILURE_MODE_PANIC },
  65                 { NULL }
  66         };
  67 
  68         /* string properties */
  69         zprop_register_string(ZPOOL_PROP_ALTROOT, "altroot", NULL, PROP_DEFAULT,
  70             ZFS_TYPE_POOL, "<path>", "ALTROOT");
  71         zprop_register_string(ZPOOL_PROP_BOOTFS, "bootfs", NULL, PROP_DEFAULT,
  72             ZFS_TYPE_POOL, "<filesystem>", "BOOTFS");
  73         zprop_register_string(ZPOOL_PROP_CACHEFILE, "cachefile", NULL,
  74             PROP_DEFAULT, ZFS_TYPE_POOL, "<file> | none", "CACHEFILE");
  75         zprop_register_string(ZPOOL_PROP_COMMENT, "comment", NULL,
  76             PROP_DEFAULT, ZFS_TYPE_POOL, "<comment-string>", "COMMENT");
  77 
  78         /* readonly number properties */
  79         zprop_register_number(ZPOOL_PROP_SIZE, "size", 0, PROP_READONLY,
  80             ZFS_TYPE_POOL, "<size>", "SIZE");
  81         zprop_register_number(ZPOOL_PROP_FREE, "free", 0, PROP_READONLY,
  82             ZFS_TYPE_POOL, "<size>", "FREE");
  83         zprop_register_number(ZPOOL_PROP_FREEING, "freeing", 0, PROP_READONLY,
  84             ZFS_TYPE_POOL, "<size>", "FREEING");
  85         zprop_register_number(ZPOOL_PROP_LEAKED, "leaked", 0, PROP_READONLY,
  86             ZFS_TYPE_POOL, "<size>", "LEAKED");
  87         zprop_register_number(ZPOOL_PROP_ALLOCATED, "allocated", 0,
  88             PROP_READONLY, ZFS_TYPE_POOL, "<size>", "ALLOC");
  89         zprop_register_number(ZPOOL_PROP_EXPANDSZ, "expandsize", 0,
  90             PROP_READONLY, ZFS_TYPE_POOL, "<size>", "EXPANDSZ");
  91         zprop_register_number(ZPOOL_PROP_FRAGMENTATION, "fragmentation", 0,
  92             PROP_READONLY, ZFS_TYPE_POOL, "<percent>", "FRAG");
  93         zprop_register_number(ZPOOL_PROP_CAPACITY, "capacity", 0, PROP_READONLY,
  94             ZFS_TYPE_POOL, "<size>", "CAP");
  95         zprop_register_number(ZPOOL_PROP_GUID, "guid", 0, PROP_READONLY,
  96             ZFS_TYPE_POOL, "<guid>", "GUID");
  97         zprop_register_number(ZPOOL_PROP_HEALTH, "health", 0, PROP_READONLY,
  98             ZFS_TYPE_POOL, "<state>", "HEALTH");
  99         zprop_register_number(ZPOOL_PROP_DEDUPRATIO, "dedupratio", 0,
 100             PROP_READONLY, ZFS_TYPE_POOL, "<1.00x or higher if deduped>",
 101             "DEDUP");
 102 
 103         /* system partition size */
 104         zprop_register_number(ZPOOL_PROP_BOOTSIZE, "bootsize", 0, PROP_ONETIME,
 105             ZFS_TYPE_POOL, "<size>", "BOOTSIZE");
 106 
 107         /* default number properties */
 108         zprop_register_number(ZPOOL_PROP_VERSION, "version", SPA_VERSION,
 109             PROP_DEFAULT, ZFS_TYPE_POOL, "<version>", "VERSION");
 110         zprop_register_number(ZPOOL_PROP_DEDUPDITTO, "dedupditto", 0,
 111             PROP_DEFAULT, ZFS_TYPE_POOL, "<threshold (min 100)>", "DEDUPDITTO");
 112 
 113         /* default index (boolean) properties */
 114         zprop_register_index(ZPOOL_PROP_DELEGATION, "delegation", 1,
 115             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "DELEGATION",
 116             boolean_table);
 117         zprop_register_index(ZPOOL_PROP_AUTOREPLACE, "autoreplace", 0,
 118             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "REPLACE", boolean_table);
 119         zprop_register_index(ZPOOL_PROP_LISTSNAPS, "listsnapshots", 0,
 120             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "LISTSNAPS",
 121             boolean_table);
 122         zprop_register_index(ZPOOL_PROP_AUTOEXPAND, "autoexpand", 0,
 123             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "EXPAND", boolean_table);
 124         zprop_register_index(ZPOOL_PROP_READONLY, "readonly", 0,
 125             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "RDONLY", boolean_table);
 126 
 127         /* default index properties */
 128         zprop_register_index(ZPOOL_PROP_FAILUREMODE, "failmode",
 129             ZIO_FAILURE_MODE_WAIT, PROP_DEFAULT, ZFS_TYPE_POOL,
 130             "wait | continue | panic", "FAILMODE", failuremode_table);
 131 
 132         /* hidden properties */
 133         zprop_register_hidden(ZPOOL_PROP_NAME, "name", PROP_TYPE_STRING,
 134             PROP_READONLY, ZFS_TYPE_POOL, "NAME");
 135         zprop_register_hidden(ZPOOL_PROP_MAXBLOCKSIZE, "maxblocksize",
 136             PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXBLOCKSIZE");
 137 }
 138 
 139 /*
 140  * Given a property name and its type, returns the corresponding property ID.
 141  */
 142 zpool_prop_t
 143 zpool_name_to_prop(const char *propname)
 144 {
 145         return (zprop_name_to_prop(propname, ZFS_TYPE_POOL));
 146 }
 147 
 148 /*
 149  * Given a pool property ID, returns the corresponding name.
 150  * Assuming the pool propety ID is valid.
 151  */
 
 | 
   1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
  25  * Copyright (c) 2014 Integros [integros.com]
  26  * Copyright 2017 Nexenta Systems, Inc.
  27  */
  28 
  29 #include <sys/zio.h>
  30 #include <sys/spa.h>
  31 #include <sys/special.h>
  32 #include <sys/zfs_acl.h>
  33 #include <sys/zfs_ioctl.h>
  34 #include <sys/fs/zfs.h>
  35 
  36 #include "zfs_prop.h"
  37 
  38 #if defined(_KERNEL)
  39 #include <sys/systm.h>
  40 #else
  41 #include <stdlib.h>
  42 #include <string.h>
  43 #include <ctype.h>
  44 #endif
  45 
  46 static zprop_desc_t zpool_prop_table[ZPOOL_NUM_PROPS];
  47 
  48 zprop_desc_t *
  49 zpool_prop_get_table(void)
  50 {
  51         return (zpool_prop_table);
  52 }
  53 
  54 void
  55 zpool_prop_init(void)
  56 {
  57         static zprop_index_t boolean_table[] = {
  58                 { "off",        0},
  59                 { "on",         1},
  60                 { NULL }
  61         };
  62 
  63         static zprop_index_t meta_placement_table[] = {
  64                 { "off",        META_PLACEMENT_OFF},
  65                 { "on",         META_PLACEMENT_ON},
  66                 { "dual",       META_PLACEMENT_DUAL},
  67                 { NULL }
  68         };
  69 
  70         static zprop_index_t failuremode_table[] = {
  71                 { "wait",       ZIO_FAILURE_MODE_WAIT },
  72                 { "continue",   ZIO_FAILURE_MODE_CONTINUE },
  73                 { "panic",      ZIO_FAILURE_MODE_PANIC },
  74                 { NULL }
  75         };
  76 
  77         static zprop_index_t sync_to_special_table[] = {
  78                 { "disabled",   SYNC_TO_SPECIAL_DISABLED },
  79                 { "standard",   SYNC_TO_SPECIAL_STANDARD },
  80                 { "balanced",   SYNC_TO_SPECIAL_BALANCED },
  81                 { "always",     SYNC_TO_SPECIAL_ALWAYS},
  82                 { NULL }
  83         };
  84 
  85         /*
  86          * NOTE: When either adding or changing a property make sure
  87          * to update the zfs-tests zpool_get configuration file
  88          * at usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/
  89          * zpool_get.cfg
  90          */
  91 
  92         /* string properties */
  93         zprop_register_string(ZPOOL_PROP_ALTROOT, "altroot", NULL, PROP_DEFAULT,
  94             ZFS_TYPE_POOL, "<path>", "ALTROOT");
  95         zprop_register_string(ZPOOL_PROP_BOOTFS, "bootfs", NULL, PROP_DEFAULT,
  96             ZFS_TYPE_POOL, "<filesystem>", "BOOTFS");
  97         zprop_register_string(ZPOOL_PROP_CACHEFILE, "cachefile", NULL,
  98             PROP_DEFAULT, ZFS_TYPE_POOL, "<file> | none", "CACHEFILE");
  99         zprop_register_string(ZPOOL_PROP_COMMENT, "comment", NULL,
 100             PROP_DEFAULT, ZFS_TYPE_POOL, "<comment-string>", "COMMENT");
 101 
 102         /* readonly number properties */
 103         zprop_register_number(ZPOOL_PROP_SIZE, "size", 0, PROP_READONLY,
 104             ZFS_TYPE_POOL, "<size>", "SIZE");
 105         zprop_register_number(ZPOOL_PROP_FREE, "free", 0, PROP_READONLY,
 106             ZFS_TYPE_POOL, "<size>", "FREE");
 107         zprop_register_number(ZPOOL_PROP_FREEING, "freeing", 0, PROP_READONLY,
 108             ZFS_TYPE_POOL, "<size>", "FREEING");
 109         zprop_register_number(ZPOOL_PROP_LEAKED, "leaked", 0, PROP_READONLY,
 110             ZFS_TYPE_POOL, "<size>", "LEAKED");
 111         zprop_register_number(ZPOOL_PROP_ALLOCATED, "allocated", 0,
 112             PROP_READONLY, ZFS_TYPE_POOL, "<size>", "ALLOC");
 113         zprop_register_number(ZPOOL_PROP_EXPANDSZ, "expandsize", 0,
 114             PROP_READONLY, ZFS_TYPE_POOL, "<size>", "EXPANDSZ");
 115         zprop_register_number(ZPOOL_PROP_FRAGMENTATION, "fragmentation", 0,
 116             PROP_READONLY, ZFS_TYPE_POOL, "<percent>", "FRAG");
 117         zprop_register_number(ZPOOL_PROP_CAPACITY, "capacity", 0, PROP_READONLY,
 118             ZFS_TYPE_POOL, "<size>", "CAP");
 119         zprop_register_number(ZPOOL_PROP_GUID, "guid", 0, PROP_READONLY,
 120             ZFS_TYPE_POOL, "<guid>", "GUID");
 121         zprop_register_number(ZPOOL_PROP_HEALTH, "health", 0, PROP_READONLY,
 122             ZFS_TYPE_POOL, "<state>", "HEALTH");
 123         zprop_register_number(ZPOOL_PROP_DEDUPRATIO, "dedupratio", 0,
 124             PROP_READONLY, ZFS_TYPE_POOL, "<1.00x or higher if deduped>",
 125             "DEDUP");
 126         zprop_register_index(ZPOOL_PROP_DDTCAPPED, "ddt_capped", 0,
 127             PROP_READONLY, ZFS_TYPE_POOL, "off | on", "DDT_CAPPED",
 128             boolean_table);
 129 
 130         /* system partition size */
 131         zprop_register_number(ZPOOL_PROP_BOOTSIZE, "bootsize", 0, PROP_ONETIME,
 132             ZFS_TYPE_POOL, "<size>", "BOOTSIZE");
 133 
 134         /* default number properties */
 135         zprop_register_number(ZPOOL_PROP_VERSION, "version", SPA_VERSION,
 136             PROP_DEFAULT, ZFS_TYPE_POOL, "<version>", "VERSION");
 137         zprop_register_number(ZPOOL_PROP_DEDUPDITTO, "dedupditto", 0,
 138             PROP_DEFAULT, ZFS_TYPE_POOL, "<threshold (min 100)>", "DEDUPDITTO");
 139         zprop_register_number(ZPOOL_PROP_DEDUPMETA_DITTO, "dedup_meta_ditto", 0,
 140             PROP_DEFAULT, ZFS_TYPE_POOL, "<number of copies>",
 141             "DEDUP_META_DITTO");
 142         zprop_register_number(ZPOOL_PROP_DEDUP_LO_BEST_EFFORT,
 143             "dedup_lo_best_effort", 60, PROP_DEFAULT, ZFS_TYPE_POOL,
 144             "0-100", "DEDUP_LO_BEST_EFFORT");
 145         zprop_register_number(ZPOOL_PROP_DEDUP_HI_BEST_EFFORT,
 146             "dedup_hi_best_effort", 80, PROP_DEFAULT, ZFS_TYPE_POOL,
 147             "0-100", "DEDUP_HI_BEST_EFFORT");
 148         zprop_register_number(ZPOOL_PROP_SCRUB_PRIO,
 149             "scrubprio", 5, PROP_DEFAULT, ZFS_TYPE_POOL,
 150             "0-100", "SCRUB_PRIO");
 151         zprop_register_number(ZPOOL_PROP_RESILVER_PRIO,
 152             "resilverprio", 10, PROP_DEFAULT, ZFS_TYPE_POOL,
 153             "0-100", "RESILVER_PRIO");
 154 
 155         /* default index (boolean) properties */
 156         zprop_register_index(ZPOOL_PROP_DELEGATION, "delegation", 1,
 157             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "DELEGATION",
 158             boolean_table);
 159         zprop_register_index(ZPOOL_PROP_AUTOREPLACE, "autoreplace", 1,
 160             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "REPLACE", boolean_table);
 161         zprop_register_index(ZPOOL_PROP_LISTSNAPS, "listsnapshots", 0,
 162             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "LISTSNAPS",
 163             boolean_table);
 164         zprop_register_index(ZPOOL_PROP_AUTOEXPAND, "autoexpand", 0,
 165             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "EXPAND", boolean_table);
 166         zprop_register_index(ZPOOL_PROP_READONLY, "readonly", 0,
 167             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "RDONLY", boolean_table);
 168         zprop_register_index(ZPOOL_PROP_DDT_DESEGREGATION, "ddt_desegregation",
 169             0, PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "DDT_DESEG",
 170             boolean_table);
 171         zprop_register_index(ZPOOL_PROP_DEDUP_BEST_EFFORT, "dedup_best_effort",
 172             0, PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "DEDUP_BEST_EFFORT",
 173             boolean_table);
 174 
 175         zprop_register_index(ZPOOL_PROP_META_PLACEMENT, "meta_placement", 0,
 176             PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "META_PLCMNT",
 177             boolean_table);
 178         zprop_register_index(ZPOOL_PROP_SYNC_TO_SPECIAL, "sync_to_special",
 179             SYNC_TO_SPECIAL_STANDARD, PROP_DEFAULT, ZFS_TYPE_POOL,
 180             "disabled | standard | balanced | always", "SYNC_TO_SPECIAL",
 181             sync_to_special_table);
 182         zprop_register_index(ZPOOL_PROP_DDT_META_TO_METADEV,
 183             "ddt_meta_to_metadev", META_PLACEMENT_OFF, PROP_DEFAULT,
 184             ZFS_TYPE_POOL, "on | dual | off",
 185             "DDTMETA_TO_MD", meta_placement_table);
 186         zprop_register_index(ZPOOL_PROP_ZFS_META_TO_METADEV,
 187             "zfs_meta_to_metadev", META_PLACEMENT_OFF, PROP_DEFAULT,
 188             ZFS_TYPE_POOL, "on | dual | off",
 189             "ZFSMETA_TO_MD", meta_placement_table);
 190 
 191         /* default index properties */
 192         zprop_register_index(ZPOOL_PROP_FAILUREMODE, "failmode",
 193             ZIO_FAILURE_MODE_WAIT, PROP_DEFAULT, ZFS_TYPE_POOL,
 194             "wait | continue | panic", "FAILMODE", failuremode_table);
 195         zprop_register_index(ZPOOL_PROP_FORCETRIM, "forcetrim",
 196             SPA_FORCE_TRIM_OFF, PROP_DEFAULT, ZFS_TYPE_POOL,
 197             "on | off", "FORCETRIM", boolean_table);
 198         zprop_register_index(ZPOOL_PROP_AUTOTRIM, "autotrim",
 199             SPA_AUTO_TRIM_OFF, PROP_DEFAULT, ZFS_TYPE_POOL,
 200             "on | off", "AUTOTRIM", boolean_table);
 201 
 202         /* special device status (enabled/disabled) */
 203         zprop_register_index(ZPOOL_PROP_ENABLESPECIAL, "enablespecial", 0,
 204             PROP_READONLY, ZFS_TYPE_POOL, "on | off", "ENABLESPECIAL",
 205             boolean_table);
 206 
 207         /* pool's min watermark in percents (for write cache) */
 208         zprop_register_number(ZPOOL_PROP_MINWATERMARK, "min-watermark",
 209             20, PROP_DEFAULT, ZFS_TYPE_POOL,
 210             "<watermark 0-100%>", "MINWATERMARK");
 211 
 212         /* pool's low watermark in percents (for write cache) */
 213         zprop_register_number(ZPOOL_PROP_LOWATERMARK, "low-watermark",
 214             60, PROP_DEFAULT, ZFS_TYPE_POOL,
 215             "<watermark 0-100%>", "LOWATERMARK");
 216 
 217         /* pool's high watermark in percents (for write cache) */
 218         zprop_register_number(ZPOOL_PROP_HIWATERMARK, "high-watermark",
 219             80, PROP_DEFAULT, ZFS_TYPE_POOL,
 220             "<watermark 0-100%>", "HIWATERMARK");
 221 
 222         zprop_register_number(ZPOOL_PROP_SMALL_DATA_TO_METADEV,
 223             "small_data_to_metadev", 0, PROP_DEFAULT, ZFS_TYPE_POOL,
 224             "Threshold to route to md", "SMALLDATA_TO_MD");
 225 
 226         /* hidden properties */
 227         zprop_register_hidden(ZPOOL_PROP_NAME, "name", PROP_TYPE_STRING,
 228             PROP_READONLY, ZFS_TYPE_POOL, "NAME");
 229         zprop_register_hidden(ZPOOL_PROP_MAXBLOCKSIZE, "maxblocksize",
 230             PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXBLOCKSIZE");
 231 }
 232 
 233 /*
 234  * Given a property name and its type, returns the corresponding property ID.
 235  */
 236 zpool_prop_t
 237 zpool_name_to_prop(const char *propname)
 238 {
 239         return (zprop_name_to_prop(propname, ZFS_TYPE_POOL));
 240 }
 241 
 242 /*
 243  * Given a pool property ID, returns the corresponding name.
 244  * Assuming the pool propety ID is valid.
 245  */
 
 |