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  */
 246 const char *
 247 zpool_prop_to_name(zpool_prop_t prop)
 248 {
 249         return (zpool_prop_table[prop].pd_name);
 250 }
 251 
 252 zprop_type_t
 253 zpool_prop_get_type(zpool_prop_t prop)
 254 {
 255         return (zpool_prop_table[prop].pd_proptype);
 256 }
 257 
 258 boolean_t
 259 zpool_prop_readonly(zpool_prop_t prop)
 260 {
 261         return (zpool_prop_table[prop].pd_attr == PROP_READONLY);
 262 }
 263 
 264 const char *
 265 zpool_prop_default_string(zpool_prop_t prop)
 266 {
 267         return (zpool_prop_table[prop].pd_strdefault);
 268 }
 269 
 270 uint64_t
 271 zpool_prop_default_numeric(zpool_prop_t prop)
 272 {
 273         return (zpool_prop_table[prop].pd_numdefault);
 274 }
 275 
 276 /*
 277  * Returns true if this is a valid feature@ property.
 278  */
 279 boolean_t
 280 zpool_prop_feature(const char *name)
 281 {
 282         static const char *prefix = "feature@";
 283         return (strncmp(name, prefix, strlen(prefix)) == 0);
 284 }
 285 
 286 /*
 287  * Returns true if this is a valid unsupported@ property.
 288  */
 289 boolean_t
 290 zpool_prop_unsupported(const char *name)
 291 {
 292         static const char *prefix = "unsupported@";
 293         return (strncmp(name, prefix, strlen(prefix)) == 0);
 294 }
 295 
 296 int
 297 zpool_prop_string_to_index(zpool_prop_t prop, const char *string,
 298     uint64_t *index)
 299 {
 300         return (zprop_string_to_index(prop, string, index, ZFS_TYPE_POOL));
 301 }
 302 
 303 int
 304 zpool_prop_index_to_string(zpool_prop_t prop, uint64_t index,
 305     const char **string)
 306 {
 307         return (zprop_index_to_string(prop, index, string, ZFS_TYPE_POOL));
 308 }
 309 
 310 uint64_t
 311 zpool_prop_random_value(zpool_prop_t prop, uint64_t seed)
 312 {
 313         return (zprop_random_value(prop, seed, ZFS_TYPE_POOL));
 314 }
 315 
 316 #ifndef _KERNEL
 317 
 318 const char *
 319 zpool_prop_values(zpool_prop_t prop)
 320 {
 321         return (zpool_prop_table[prop].pd_values);
 322 }
 323 
 324 const char *
 325 zpool_prop_column_name(zpool_prop_t prop)
 326 {
 327         return (zpool_prop_table[prop].pd_colname);
 328 }
 329 
 330 boolean_t
 331 zpool_prop_align_right(zpool_prop_t prop)
 332 {
 333         return (zpool_prop_table[prop].pd_rightalign);
 334 }
 335 #endif