1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * CDDL HEADER START 3eda14cbcSMatt Macy * 4eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7eda14cbcSMatt Macy * 8eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9eda14cbcSMatt Macy * or http://www.opensolaris.org/os/licensing. 10eda14cbcSMatt Macy * See the License for the specific language governing permissions 11eda14cbcSMatt Macy * and limitations under the License. 12eda14cbcSMatt Macy * 13eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18eda14cbcSMatt Macy * 19eda14cbcSMatt Macy * CDDL HEADER END 20eda14cbcSMatt Macy */ 21eda14cbcSMatt Macy /* 22eda14cbcSMatt Macy * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 23eda14cbcSMatt Macy * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 24eda14cbcSMatt Macy * Copyright (c) 2012, 2018 by Delphix. All rights reserved. 25ee36e25aSMartin Matuska * Copyright (c) 2021, Colm Buckley <colm@tuatha.org> 26681ce946SMartin Matuska * Copyright (c) 2021, Klara Inc. 27eda14cbcSMatt Macy */ 28eda14cbcSMatt Macy 29eda14cbcSMatt Macy #include <sys/zio.h> 30eda14cbcSMatt Macy #include <sys/spa.h> 31eda14cbcSMatt Macy #include <sys/zfs_acl.h> 32eda14cbcSMatt Macy #include <sys/zfs_ioctl.h> 33eda14cbcSMatt Macy #include <sys/fs/zfs.h> 34eda14cbcSMatt Macy 35eda14cbcSMatt Macy #include "zfs_prop.h" 36eda14cbcSMatt Macy 37eda14cbcSMatt Macy #if !defined(_KERNEL) 38eda14cbcSMatt Macy #include <stdlib.h> 39eda14cbcSMatt Macy #include <string.h> 40eda14cbcSMatt Macy #include <ctype.h> 41eda14cbcSMatt Macy #endif 42eda14cbcSMatt Macy 43eda14cbcSMatt Macy static zprop_desc_t zpool_prop_table[ZPOOL_NUM_PROPS]; 44681ce946SMartin Matuska static zprop_desc_t vdev_prop_table[VDEV_NUM_PROPS]; 45eda14cbcSMatt Macy 46eda14cbcSMatt Macy zprop_desc_t * 47eda14cbcSMatt Macy zpool_prop_get_table(void) 48eda14cbcSMatt Macy { 49eda14cbcSMatt Macy return (zpool_prop_table); 50eda14cbcSMatt Macy } 51eda14cbcSMatt Macy 52eda14cbcSMatt Macy void 53eda14cbcSMatt Macy zpool_prop_init(void) 54eda14cbcSMatt Macy { 55*e92ffd9bSMartin Matuska static const zprop_index_t boolean_table[] = { 56eda14cbcSMatt Macy { "off", 0}, 57eda14cbcSMatt Macy { "on", 1}, 58eda14cbcSMatt Macy { NULL } 59eda14cbcSMatt Macy }; 60eda14cbcSMatt Macy 61*e92ffd9bSMartin Matuska static const zprop_index_t failuremode_table[] = { 62eda14cbcSMatt Macy { "wait", ZIO_FAILURE_MODE_WAIT }, 63eda14cbcSMatt Macy { "continue", ZIO_FAILURE_MODE_CONTINUE }, 64eda14cbcSMatt Macy { "panic", ZIO_FAILURE_MODE_PANIC }, 65eda14cbcSMatt Macy { NULL } 66eda14cbcSMatt Macy }; 67eda14cbcSMatt Macy 68*e92ffd9bSMartin Matuska struct zfs_mod_supported_features *sfeatures = 69*e92ffd9bSMartin Matuska zfs_mod_list_supported(ZFS_SYSFS_POOL_PROPERTIES); 70*e92ffd9bSMartin Matuska 71eda14cbcSMatt Macy /* string properties */ 72eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_ALTROOT, "altroot", NULL, PROP_DEFAULT, 73*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<path>", "ALTROOT", sfeatures); 74eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_BOOTFS, "bootfs", NULL, PROP_DEFAULT, 75*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<filesystem>", "BOOTFS", sfeatures); 76eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_CACHEFILE, "cachefile", NULL, 77*e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "<file> | none", "CACHEFILE", 78*e92ffd9bSMartin Matuska sfeatures); 79eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_COMMENT, "comment", NULL, 80*e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "<comment-string>", "COMMENT", 81*e92ffd9bSMartin Matuska sfeatures); 82ee36e25aSMartin Matuska zprop_register_string(ZPOOL_PROP_COMPATIBILITY, "compatibility", 83ee36e25aSMartin Matuska "off", PROP_DEFAULT, ZFS_TYPE_POOL, 84*e92ffd9bSMartin Matuska "<file[,file...]> | off | legacy", "COMPATIBILITY", sfeatures); 85eda14cbcSMatt Macy 86eda14cbcSMatt Macy /* readonly number properties */ 87eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_SIZE, "size", 0, PROP_READONLY, 88*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<size>", "SIZE", sfeatures); 89eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FREE, "free", 0, PROP_READONLY, 90*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<size>", "FREE", sfeatures); 91eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FREEING, "freeing", 0, PROP_READONLY, 92*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<size>", "FREEING", sfeatures); 93eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_CHECKPOINT, "checkpoint", 0, 94*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<size>", "CKPOINT", sfeatures); 95eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_LEAKED, "leaked", 0, PROP_READONLY, 96*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<size>", "LEAKED", sfeatures); 97eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_ALLOCATED, "allocated", 0, 98*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<size>", "ALLOC", sfeatures); 99eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_EXPANDSZ, "expandsize", 0, 100*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<size>", "EXPANDSZ", sfeatures); 101eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FRAGMENTATION, "fragmentation", 0, 102*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<percent>", "FRAG", sfeatures); 103eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_CAPACITY, "capacity", 0, PROP_READONLY, 104*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<size>", "CAP", sfeatures); 105eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_GUID, "guid", 0, PROP_READONLY, 106*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<guid>", "GUID", sfeatures); 107eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_LOAD_GUID, "load_guid", 0, 108*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<load_guid>", "LOAD_GUID", 109*e92ffd9bSMartin Matuska sfeatures); 110eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_HEALTH, "health", 0, PROP_READONLY, 111*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<state>", "HEALTH", sfeatures); 112eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_DEDUPRATIO, "dedupratio", 0, 113eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<1.00x or higher if deduped>", 114*e92ffd9bSMartin Matuska "DEDUP", sfeatures); 115eda14cbcSMatt Macy 116eda14cbcSMatt Macy /* default number properties */ 117eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_VERSION, "version", SPA_VERSION, 118*e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "<version>", "VERSION", sfeatures); 119eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_ASHIFT, "ashift", 0, PROP_DEFAULT, 120*e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<ashift, 9-16, or 0=default>", "ASHIFT", sfeatures); 121eda14cbcSMatt Macy 122eda14cbcSMatt Macy /* default index (boolean) properties */ 123eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_DELEGATION, "delegation", 1, 124eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "DELEGATION", 125*e92ffd9bSMartin Matuska boolean_table, sfeatures); 126eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOREPLACE, "autoreplace", 0, 127*e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "REPLACE", boolean_table, 128*e92ffd9bSMartin Matuska sfeatures); 129eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_LISTSNAPS, "listsnapshots", 0, 130eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "LISTSNAPS", 131*e92ffd9bSMartin Matuska boolean_table, sfeatures); 132eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOEXPAND, "autoexpand", 0, 133*e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "EXPAND", boolean_table, 134*e92ffd9bSMartin Matuska sfeatures); 135eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_READONLY, "readonly", 0, 136*e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "RDONLY", boolean_table, 137*e92ffd9bSMartin Matuska sfeatures); 138eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_MULTIHOST, "multihost", 0, 139eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "MULTIHOST", 140*e92ffd9bSMartin Matuska boolean_table, sfeatures); 141eda14cbcSMatt Macy 142eda14cbcSMatt Macy /* default index properties */ 143eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_FAILUREMODE, "failmode", 144eda14cbcSMatt Macy ZIO_FAILURE_MODE_WAIT, PROP_DEFAULT, ZFS_TYPE_POOL, 145*e92ffd9bSMartin Matuska "wait | continue | panic", "FAILMODE", failuremode_table, 146*e92ffd9bSMartin Matuska sfeatures); 147eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOTRIM, "autotrim", 148eda14cbcSMatt Macy SPA_AUTOTRIM_DEFAULT, PROP_DEFAULT, ZFS_TYPE_POOL, 149*e92ffd9bSMartin Matuska "on | off", "AUTOTRIM", boolean_table, sfeatures); 150eda14cbcSMatt Macy 151eda14cbcSMatt Macy /* hidden properties */ 152eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_NAME, "name", PROP_TYPE_STRING, 153*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "NAME", sfeatures); 154eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_MAXBLOCKSIZE, "maxblocksize", 155*e92ffd9bSMartin Matuska PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXBLOCKSIZE", 156*e92ffd9bSMartin Matuska sfeatures); 157eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_TNAME, "tname", PROP_TYPE_STRING, 158*e92ffd9bSMartin Matuska PROP_ONETIME, ZFS_TYPE_POOL, "TNAME", sfeatures); 159eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_MAXDNODESIZE, "maxdnodesize", 160*e92ffd9bSMartin Matuska PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXDNODESIZE", 161*e92ffd9bSMartin Matuska sfeatures); 162eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_DEDUPDITTO, "dedupditto", 163*e92ffd9bSMartin Matuska PROP_TYPE_NUMBER, PROP_DEFAULT, ZFS_TYPE_POOL, "DEDUPDITTO", 164*e92ffd9bSMartin Matuska sfeatures); 165*e92ffd9bSMartin Matuska 166*e92ffd9bSMartin Matuska zfs_mod_list_supported_free(sfeatures); 167eda14cbcSMatt Macy } 168eda14cbcSMatt Macy 169eda14cbcSMatt Macy /* 170eda14cbcSMatt Macy * Given a property name and its type, returns the corresponding property ID. 171eda14cbcSMatt Macy */ 172eda14cbcSMatt Macy zpool_prop_t 173eda14cbcSMatt Macy zpool_name_to_prop(const char *propname) 174eda14cbcSMatt Macy { 175eda14cbcSMatt Macy return (zprop_name_to_prop(propname, ZFS_TYPE_POOL)); 176eda14cbcSMatt Macy } 177eda14cbcSMatt Macy 178eda14cbcSMatt Macy /* 179eda14cbcSMatt Macy * Given a pool property ID, returns the corresponding name. 180eda14cbcSMatt Macy * Assuming the pool property ID is valid. 181eda14cbcSMatt Macy */ 182eda14cbcSMatt Macy const char * 183eda14cbcSMatt Macy zpool_prop_to_name(zpool_prop_t prop) 184eda14cbcSMatt Macy { 185eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_name); 186eda14cbcSMatt Macy } 187eda14cbcSMatt Macy 188eda14cbcSMatt Macy zprop_type_t 189eda14cbcSMatt Macy zpool_prop_get_type(zpool_prop_t prop) 190eda14cbcSMatt Macy { 191eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_proptype); 192eda14cbcSMatt Macy } 193eda14cbcSMatt Macy 194eda14cbcSMatt Macy boolean_t 195eda14cbcSMatt Macy zpool_prop_readonly(zpool_prop_t prop) 196eda14cbcSMatt Macy { 197eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_attr == PROP_READONLY); 198eda14cbcSMatt Macy } 199eda14cbcSMatt Macy 200eda14cbcSMatt Macy boolean_t 201eda14cbcSMatt Macy zpool_prop_setonce(zpool_prop_t prop) 202eda14cbcSMatt Macy { 203eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_attr == PROP_ONETIME); 204eda14cbcSMatt Macy } 205eda14cbcSMatt Macy 206eda14cbcSMatt Macy const char * 207eda14cbcSMatt Macy zpool_prop_default_string(zpool_prop_t prop) 208eda14cbcSMatt Macy { 209eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_strdefault); 210eda14cbcSMatt Macy } 211eda14cbcSMatt Macy 212eda14cbcSMatt Macy uint64_t 213eda14cbcSMatt Macy zpool_prop_default_numeric(zpool_prop_t prop) 214eda14cbcSMatt Macy { 215eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_numdefault); 216eda14cbcSMatt Macy } 217eda14cbcSMatt Macy 218eda14cbcSMatt Macy /* 219eda14cbcSMatt Macy * Returns true if this is a valid feature@ property. 220eda14cbcSMatt Macy */ 221eda14cbcSMatt Macy boolean_t 222eda14cbcSMatt Macy zpool_prop_feature(const char *name) 223eda14cbcSMatt Macy { 224eda14cbcSMatt Macy static const char *prefix = "feature@"; 225eda14cbcSMatt Macy return (strncmp(name, prefix, strlen(prefix)) == 0); 226eda14cbcSMatt Macy } 227eda14cbcSMatt Macy 228eda14cbcSMatt Macy /* 229eda14cbcSMatt Macy * Returns true if this is a valid unsupported@ property. 230eda14cbcSMatt Macy */ 231eda14cbcSMatt Macy boolean_t 232eda14cbcSMatt Macy zpool_prop_unsupported(const char *name) 233eda14cbcSMatt Macy { 234eda14cbcSMatt Macy static const char *prefix = "unsupported@"; 235eda14cbcSMatt Macy return (strncmp(name, prefix, strlen(prefix)) == 0); 236eda14cbcSMatt Macy } 237eda14cbcSMatt Macy 238eda14cbcSMatt Macy int 239eda14cbcSMatt Macy zpool_prop_string_to_index(zpool_prop_t prop, const char *string, 240eda14cbcSMatt Macy uint64_t *index) 241eda14cbcSMatt Macy { 242eda14cbcSMatt Macy return (zprop_string_to_index(prop, string, index, ZFS_TYPE_POOL)); 243eda14cbcSMatt Macy } 244eda14cbcSMatt Macy 245eda14cbcSMatt Macy int 246eda14cbcSMatt Macy zpool_prop_index_to_string(zpool_prop_t prop, uint64_t index, 247eda14cbcSMatt Macy const char **string) 248eda14cbcSMatt Macy { 249eda14cbcSMatt Macy return (zprop_index_to_string(prop, index, string, ZFS_TYPE_POOL)); 250eda14cbcSMatt Macy } 251eda14cbcSMatt Macy 252eda14cbcSMatt Macy uint64_t 253eda14cbcSMatt Macy zpool_prop_random_value(zpool_prop_t prop, uint64_t seed) 254eda14cbcSMatt Macy { 255eda14cbcSMatt Macy return (zprop_random_value(prop, seed, ZFS_TYPE_POOL)); 256eda14cbcSMatt Macy } 257eda14cbcSMatt Macy 258eda14cbcSMatt Macy #ifndef _KERNEL 259eda14cbcSMatt Macy #include <libzfs.h> 260eda14cbcSMatt Macy 261eda14cbcSMatt Macy const char * 262eda14cbcSMatt Macy zpool_prop_values(zpool_prop_t prop) 263eda14cbcSMatt Macy { 264eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_values); 265eda14cbcSMatt Macy } 266eda14cbcSMatt Macy 267eda14cbcSMatt Macy const char * 268eda14cbcSMatt Macy zpool_prop_column_name(zpool_prop_t prop) 269eda14cbcSMatt Macy { 270eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_colname); 271eda14cbcSMatt Macy } 272eda14cbcSMatt Macy 273eda14cbcSMatt Macy boolean_t 274eda14cbcSMatt Macy zpool_prop_align_right(zpool_prop_t prop) 275eda14cbcSMatt Macy { 276eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_rightalign); 277eda14cbcSMatt Macy } 278eda14cbcSMatt Macy #endif 279eda14cbcSMatt Macy 280681ce946SMartin Matuska zprop_desc_t * 281681ce946SMartin Matuska vdev_prop_get_table(void) 282681ce946SMartin Matuska { 283681ce946SMartin Matuska return (vdev_prop_table); 284681ce946SMartin Matuska } 285681ce946SMartin Matuska 286681ce946SMartin Matuska void 287681ce946SMartin Matuska vdev_prop_init(void) 288681ce946SMartin Matuska { 289*e92ffd9bSMartin Matuska static const zprop_index_t boolean_table[] = { 290681ce946SMartin Matuska { "off", 0}, 291681ce946SMartin Matuska { "on", 1}, 292681ce946SMartin Matuska { NULL } 293681ce946SMartin Matuska }; 294*e92ffd9bSMartin Matuska static const zprop_index_t boolean_na_table[] = { 295681ce946SMartin Matuska { "off", 0}, 296681ce946SMartin Matuska { "on", 1}, 297681ce946SMartin Matuska { "-", 2}, /* ZPROP_BOOLEAN_NA */ 298681ce946SMartin Matuska { NULL } 299681ce946SMartin Matuska }; 300681ce946SMartin Matuska 301*e92ffd9bSMartin Matuska struct zfs_mod_supported_features *sfeatures = 302*e92ffd9bSMartin Matuska zfs_mod_list_supported(ZFS_SYSFS_VDEV_PROPERTIES); 303*e92ffd9bSMartin Matuska 304681ce946SMartin Matuska /* string properties */ 305681ce946SMartin Matuska zprop_register_string(VDEV_PROP_COMMENT, "comment", NULL, 306*e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<comment-string>", "COMMENT", 307*e92ffd9bSMartin Matuska sfeatures); 308681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PATH, "path", NULL, 309*e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<device-path>", "PATH", sfeatures); 310681ce946SMartin Matuska zprop_register_string(VDEV_PROP_DEVID, "devid", NULL, 311*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<devid>", "DEVID", sfeatures); 312681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PHYS_PATH, "physpath", NULL, 313*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<physpath>", "PHYSPATH", sfeatures); 314681ce946SMartin Matuska zprop_register_string(VDEV_PROP_ENC_PATH, "encpath", NULL, 315*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<encpath>", "ENCPATH", sfeatures); 316681ce946SMartin Matuska zprop_register_string(VDEV_PROP_FRU, "fru", NULL, 317*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<fru>", "FRU", sfeatures); 318681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PARENT, "parent", NULL, 319*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<parent>", "PARENT", sfeatures); 320681ce946SMartin Matuska zprop_register_string(VDEV_PROP_CHILDREN, "children", NULL, 321*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<child[,...]>", "CHILDREN", 322*e92ffd9bSMartin Matuska sfeatures); 323681ce946SMartin Matuska 324681ce946SMartin Matuska /* readonly number properties */ 325681ce946SMartin Matuska zprop_register_number(VDEV_PROP_SIZE, "size", 0, PROP_READONLY, 326*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<size>", "SIZE", sfeatures); 327681ce946SMartin Matuska zprop_register_number(VDEV_PROP_FREE, "free", 0, PROP_READONLY, 328*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<size>", "FREE", sfeatures); 329681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ALLOCATED, "allocated", 0, 330*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<size>", "ALLOC", sfeatures); 331681ce946SMartin Matuska zprop_register_number(VDEV_PROP_EXPANDSZ, "expandsize", 0, 332*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<size>", "EXPANDSZ", sfeatures); 333681ce946SMartin Matuska zprop_register_number(VDEV_PROP_FRAGMENTATION, "fragmentation", 0, 334*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<percent>", "FRAG", sfeatures); 335681ce946SMartin Matuska zprop_register_number(VDEV_PROP_CAPACITY, "capacity", 0, PROP_READONLY, 336*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<size>", "CAP", sfeatures); 337681ce946SMartin Matuska zprop_register_number(VDEV_PROP_GUID, "guid", 0, PROP_READONLY, 338*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<guid>", "GUID", sfeatures); 339681ce946SMartin Matuska zprop_register_number(VDEV_PROP_STATE, "state", 0, PROP_READONLY, 340*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<state>", "STATE", sfeatures); 341681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BOOTSIZE, "bootsize", 0, PROP_READONLY, 342*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<size>", "BOOTSIZE", sfeatures); 343681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ASIZE, "asize", 0, PROP_READONLY, 344*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<asize>", "ASIZE", sfeatures); 345681ce946SMartin Matuska zprop_register_number(VDEV_PROP_PSIZE, "psize", 0, PROP_READONLY, 346*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<psize>", "PSIZE", sfeatures); 347681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ASHIFT, "ashift", 0, PROP_READONLY, 348*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<ashift>", "ASHIFT", sfeatures); 349681ce946SMartin Matuska zprop_register_number(VDEV_PROP_PARITY, "parity", 0, PROP_READONLY, 350*e92ffd9bSMartin Matuska ZFS_TYPE_VDEV, "<parity>", "PARITY", sfeatures); 351681ce946SMartin Matuska zprop_register_number(VDEV_PROP_NUMCHILDREN, "numchildren", 0, 352*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<number-of-children>", "NUMCHILD", 353*e92ffd9bSMartin Matuska sfeatures); 354681ce946SMartin Matuska zprop_register_number(VDEV_PROP_READ_ERRORS, "read_errors", 0, 355*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "RDERR", sfeatures); 356681ce946SMartin Matuska zprop_register_number(VDEV_PROP_WRITE_ERRORS, "write_errors", 0, 357*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "WRERR", sfeatures); 358681ce946SMartin Matuska zprop_register_number(VDEV_PROP_CHECKSUM_ERRORS, "checksum_errors", 0, 359*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "CKERR", sfeatures); 360681ce946SMartin Matuska zprop_register_number(VDEV_PROP_INITIALIZE_ERRORS, 361681ce946SMartin Matuska "initialize_errors", 0, PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", 362*e92ffd9bSMartin Matuska "INITERR", sfeatures); 363681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_NULL, "null_ops", 0, 364*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "NULLOP", sfeatures); 365681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_READ, "read_ops", 0, 366*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "READOP", sfeatures); 367681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_WRITE, "write_ops", 0, 368*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "WRITEOP", sfeatures); 369681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_FREE, "free_ops", 0, 370*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "FREEOP", sfeatures); 371681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_CLAIM, "claim_ops", 0, 372*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "CLAIMOP", sfeatures); 373681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_TRIM, "trim_ops", 0, 374*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "TRIMOP", sfeatures); 375681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_NULL, "null_bytes", 0, 376*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "NULLBYTE", sfeatures); 377681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_READ, "read_bytes", 0, 378*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "READBYTE", sfeatures); 379681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_WRITE, "write_bytes", 0, 380*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "WRITEBYTE", sfeatures); 381681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_FREE, "free_bytes", 0, 382*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "FREEBYTE", sfeatures); 383681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_CLAIM, "claim_bytes", 0, 384*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "CLAIMBYTE", sfeatures); 385681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_TRIM, "trim_bytes", 0, 386*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "TRIMBYTE", sfeatures); 387681ce946SMartin Matuska 388681ce946SMartin Matuska /* default numeric properties */ 389681ce946SMartin Matuska 390681ce946SMartin Matuska /* default index (boolean) properties */ 391681ce946SMartin Matuska zprop_register_index(VDEV_PROP_REMOVING, "removing", 0, 392681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "on | off", "REMOVING", 393*e92ffd9bSMartin Matuska boolean_table, sfeatures); 394681ce946SMartin Matuska zprop_register_index(VDEV_PROP_ALLOCATING, "allocating", 1, 395681ce946SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "on | off", "ALLOCATING", 396*e92ffd9bSMartin Matuska boolean_na_table, sfeatures); 397681ce946SMartin Matuska 398681ce946SMartin Matuska /* default index properties */ 399681ce946SMartin Matuska 400681ce946SMartin Matuska /* hidden properties */ 401681ce946SMartin Matuska zprop_register_hidden(VDEV_PROP_NAME, "name", PROP_TYPE_STRING, 402*e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "NAME", sfeatures); 403*e92ffd9bSMartin Matuska 404*e92ffd9bSMartin Matuska zfs_mod_list_supported_free(sfeatures); 405681ce946SMartin Matuska } 406681ce946SMartin Matuska 407681ce946SMartin Matuska /* 408681ce946SMartin Matuska * Given a property name and its type, returns the corresponding property ID. 409681ce946SMartin Matuska */ 410681ce946SMartin Matuska vdev_prop_t 411681ce946SMartin Matuska vdev_name_to_prop(const char *propname) 412681ce946SMartin Matuska { 413681ce946SMartin Matuska return (zprop_name_to_prop(propname, ZFS_TYPE_VDEV)); 414681ce946SMartin Matuska } 415681ce946SMartin Matuska 416681ce946SMartin Matuska /* 417681ce946SMartin Matuska * Returns true if this is a valid user-defined property (one with a ':'). 418681ce946SMartin Matuska */ 419681ce946SMartin Matuska boolean_t 420681ce946SMartin Matuska vdev_prop_user(const char *name) 421681ce946SMartin Matuska { 422681ce946SMartin Matuska int i; 423681ce946SMartin Matuska char c; 424681ce946SMartin Matuska boolean_t foundsep = B_FALSE; 425681ce946SMartin Matuska 426681ce946SMartin Matuska for (i = 0; i < strlen(name); i++) { 427681ce946SMartin Matuska c = name[i]; 428681ce946SMartin Matuska if (!zprop_valid_char(c)) 429681ce946SMartin Matuska return (B_FALSE); 430681ce946SMartin Matuska if (c == ':') 431681ce946SMartin Matuska foundsep = B_TRUE; 432681ce946SMartin Matuska } 433681ce946SMartin Matuska 434681ce946SMartin Matuska return (foundsep); 435681ce946SMartin Matuska } 436681ce946SMartin Matuska 437681ce946SMartin Matuska /* 438681ce946SMartin Matuska * Given a pool property ID, returns the corresponding name. 439681ce946SMartin Matuska * Assuming the pool property ID is valid. 440681ce946SMartin Matuska */ 441681ce946SMartin Matuska const char * 442681ce946SMartin Matuska vdev_prop_to_name(vdev_prop_t prop) 443681ce946SMartin Matuska { 444681ce946SMartin Matuska return (vdev_prop_table[prop].pd_name); 445681ce946SMartin Matuska } 446681ce946SMartin Matuska 447681ce946SMartin Matuska zprop_type_t 448681ce946SMartin Matuska vdev_prop_get_type(vdev_prop_t prop) 449681ce946SMartin Matuska { 450681ce946SMartin Matuska return (vdev_prop_table[prop].pd_proptype); 451681ce946SMartin Matuska } 452681ce946SMartin Matuska 453681ce946SMartin Matuska boolean_t 454681ce946SMartin Matuska vdev_prop_readonly(vdev_prop_t prop) 455681ce946SMartin Matuska { 456681ce946SMartin Matuska return (vdev_prop_table[prop].pd_attr == PROP_READONLY); 457681ce946SMartin Matuska } 458681ce946SMartin Matuska 459681ce946SMartin Matuska const char * 460681ce946SMartin Matuska vdev_prop_default_string(vdev_prop_t prop) 461681ce946SMartin Matuska { 462681ce946SMartin Matuska return (vdev_prop_table[prop].pd_strdefault); 463681ce946SMartin Matuska } 464681ce946SMartin Matuska 465681ce946SMartin Matuska uint64_t 466681ce946SMartin Matuska vdev_prop_default_numeric(vdev_prop_t prop) 467681ce946SMartin Matuska { 468681ce946SMartin Matuska return (vdev_prop_table[prop].pd_numdefault); 469681ce946SMartin Matuska } 470681ce946SMartin Matuska 471681ce946SMartin Matuska int 472681ce946SMartin Matuska vdev_prop_string_to_index(vdev_prop_t prop, const char *string, 473681ce946SMartin Matuska uint64_t *index) 474681ce946SMartin Matuska { 475681ce946SMartin Matuska return (zprop_string_to_index(prop, string, index, ZFS_TYPE_VDEV)); 476681ce946SMartin Matuska } 477681ce946SMartin Matuska 478681ce946SMartin Matuska int 479681ce946SMartin Matuska vdev_prop_index_to_string(vdev_prop_t prop, uint64_t index, 480681ce946SMartin Matuska const char **string) 481681ce946SMartin Matuska { 482681ce946SMartin Matuska return (zprop_index_to_string(prop, index, string, ZFS_TYPE_VDEV)); 483681ce946SMartin Matuska } 484681ce946SMartin Matuska 485681ce946SMartin Matuska /* 486681ce946SMartin Matuska * Returns true if this is a valid vdev property. 487681ce946SMartin Matuska */ 488681ce946SMartin Matuska boolean_t 489681ce946SMartin Matuska zpool_prop_vdev(const char *name) 490681ce946SMartin Matuska { 491681ce946SMartin Matuska return (vdev_name_to_prop(name) != VDEV_PROP_INVAL); 492681ce946SMartin Matuska } 493681ce946SMartin Matuska 494681ce946SMartin Matuska uint64_t 495681ce946SMartin Matuska vdev_prop_random_value(vdev_prop_t prop, uint64_t seed) 496681ce946SMartin Matuska { 497681ce946SMartin Matuska return (zprop_random_value(prop, seed, ZFS_TYPE_VDEV)); 498681ce946SMartin Matuska } 499681ce946SMartin Matuska 500681ce946SMartin Matuska #ifndef _KERNEL 501681ce946SMartin Matuska const char * 502681ce946SMartin Matuska vdev_prop_values(vdev_prop_t prop) 503681ce946SMartin Matuska { 504681ce946SMartin Matuska return (vdev_prop_table[prop].pd_values); 505681ce946SMartin Matuska } 506681ce946SMartin Matuska 507681ce946SMartin Matuska const char * 508681ce946SMartin Matuska vdev_prop_column_name(vdev_prop_t prop) 509681ce946SMartin Matuska { 510681ce946SMartin Matuska return (vdev_prop_table[prop].pd_colname); 511681ce946SMartin Matuska } 512681ce946SMartin Matuska 513681ce946SMartin Matuska boolean_t 514681ce946SMartin Matuska vdev_prop_align_right(vdev_prop_t prop) 515681ce946SMartin Matuska { 516681ce946SMartin Matuska return (vdev_prop_table[prop].pd_rightalign); 517681ce946SMartin Matuska } 518681ce946SMartin Matuska #endif 519681ce946SMartin Matuska 520eda14cbcSMatt Macy #if defined(_KERNEL) 521eda14cbcSMatt Macy /* zpool property functions */ 522eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_init); 523eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_get_type); 524eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_get_table); 525eda14cbcSMatt Macy 526681ce946SMartin Matuska /* vdev property functions */ 527681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_init); 528681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_get_type); 529681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_get_table); 530681ce946SMartin Matuska 531eda14cbcSMatt Macy /* Pool property functions shared between libzfs and kernel. */ 532eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_name_to_prop); 533eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_to_name); 534eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_default_string); 535eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_default_numeric); 536eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_readonly); 537eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_feature); 538eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_unsupported); 539eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_index_to_string); 540eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_string_to_index); 541681ce946SMartin Matuska EXPORT_SYMBOL(zpool_prop_vdev); 542681ce946SMartin Matuska 543681ce946SMartin Matuska /* vdev property functions shared between libzfs and kernel. */ 544681ce946SMartin Matuska EXPORT_SYMBOL(vdev_name_to_prop); 545681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_user); 546681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_to_name); 547681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_default_string); 548681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_default_numeric); 549681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_readonly); 550681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_index_to_string); 551681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_string_to_index); 552eda14cbcSMatt Macy #endif 553