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> 26*681ce946SMartin 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]; 44*681ce946SMartin 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 { 55eda14cbcSMatt Macy static zprop_index_t boolean_table[] = { 56eda14cbcSMatt Macy { "off", 0}, 57eda14cbcSMatt Macy { "on", 1}, 58eda14cbcSMatt Macy { NULL } 59eda14cbcSMatt Macy }; 60eda14cbcSMatt Macy 61eda14cbcSMatt Macy static 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 68eda14cbcSMatt Macy /* string properties */ 69eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_ALTROOT, "altroot", NULL, PROP_DEFAULT, 70eda14cbcSMatt Macy ZFS_TYPE_POOL, "<path>", "ALTROOT"); 71eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_BOOTFS, "bootfs", NULL, PROP_DEFAULT, 72eda14cbcSMatt Macy ZFS_TYPE_POOL, "<filesystem>", "BOOTFS"); 73eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_CACHEFILE, "cachefile", NULL, 74eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "<file> | none", "CACHEFILE"); 75eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_COMMENT, "comment", NULL, 76eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "<comment-string>", "COMMENT"); 77ee36e25aSMartin Matuska zprop_register_string(ZPOOL_PROP_COMPATIBILITY, "compatibility", 78ee36e25aSMartin Matuska "off", PROP_DEFAULT, ZFS_TYPE_POOL, 79ee36e25aSMartin Matuska "<file[,file...]> | off | legacy", "COMPATIBILITY"); 80eda14cbcSMatt Macy 81eda14cbcSMatt Macy /* readonly number properties */ 82eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_SIZE, "size", 0, PROP_READONLY, 83eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "SIZE"); 84eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FREE, "free", 0, PROP_READONLY, 85eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "FREE"); 86eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FREEING, "freeing", 0, PROP_READONLY, 87eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "FREEING"); 88eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_CHECKPOINT, "checkpoint", 0, 89eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<size>", "CKPOINT"); 90eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_LEAKED, "leaked", 0, PROP_READONLY, 91eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "LEAKED"); 92eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_ALLOCATED, "allocated", 0, 93eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<size>", "ALLOC"); 94eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_EXPANDSZ, "expandsize", 0, 95eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<size>", "EXPANDSZ"); 96eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FRAGMENTATION, "fragmentation", 0, 97eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<percent>", "FRAG"); 98eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_CAPACITY, "capacity", 0, PROP_READONLY, 99eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "CAP"); 100eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_GUID, "guid", 0, PROP_READONLY, 101eda14cbcSMatt Macy ZFS_TYPE_POOL, "<guid>", "GUID"); 102eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_LOAD_GUID, "load_guid", 0, 103eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<load_guid>", "LOAD_GUID"); 104eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_HEALTH, "health", 0, PROP_READONLY, 105eda14cbcSMatt Macy ZFS_TYPE_POOL, "<state>", "HEALTH"); 106eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_DEDUPRATIO, "dedupratio", 0, 107eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<1.00x or higher if deduped>", 108eda14cbcSMatt Macy "DEDUP"); 109eda14cbcSMatt Macy 110eda14cbcSMatt Macy /* default number properties */ 111eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_VERSION, "version", SPA_VERSION, 112eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "<version>", "VERSION"); 113eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_ASHIFT, "ashift", 0, PROP_DEFAULT, 114eda14cbcSMatt Macy ZFS_TYPE_POOL, "<ashift, 9-16, or 0=default>", "ASHIFT"); 115eda14cbcSMatt Macy 116eda14cbcSMatt Macy /* default index (boolean) properties */ 117eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_DELEGATION, "delegation", 1, 118eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "DELEGATION", 119eda14cbcSMatt Macy boolean_table); 120eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOREPLACE, "autoreplace", 0, 121eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "REPLACE", boolean_table); 122eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_LISTSNAPS, "listsnapshots", 0, 123eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "LISTSNAPS", 124eda14cbcSMatt Macy boolean_table); 125eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOEXPAND, "autoexpand", 0, 126eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "EXPAND", boolean_table); 127eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_READONLY, "readonly", 0, 128eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "RDONLY", boolean_table); 129eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_MULTIHOST, "multihost", 0, 130eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "MULTIHOST", 131eda14cbcSMatt Macy boolean_table); 132eda14cbcSMatt Macy 133eda14cbcSMatt Macy /* default index properties */ 134eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_FAILUREMODE, "failmode", 135eda14cbcSMatt Macy ZIO_FAILURE_MODE_WAIT, PROP_DEFAULT, ZFS_TYPE_POOL, 136eda14cbcSMatt Macy "wait | continue | panic", "FAILMODE", failuremode_table); 137eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOTRIM, "autotrim", 138eda14cbcSMatt Macy SPA_AUTOTRIM_DEFAULT, PROP_DEFAULT, ZFS_TYPE_POOL, 139eda14cbcSMatt Macy "on | off", "AUTOTRIM", boolean_table); 140eda14cbcSMatt Macy 141eda14cbcSMatt Macy /* hidden properties */ 142eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_NAME, "name", PROP_TYPE_STRING, 143eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "NAME"); 144eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_MAXBLOCKSIZE, "maxblocksize", 145eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXBLOCKSIZE"); 146eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_TNAME, "tname", PROP_TYPE_STRING, 147eda14cbcSMatt Macy PROP_ONETIME, ZFS_TYPE_POOL, "TNAME"); 148eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_MAXDNODESIZE, "maxdnodesize", 149eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXDNODESIZE"); 150eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_DEDUPDITTO, "dedupditto", 151eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_DEFAULT, ZFS_TYPE_POOL, "DEDUPDITTO"); 152eda14cbcSMatt Macy } 153eda14cbcSMatt Macy 154eda14cbcSMatt Macy /* 155eda14cbcSMatt Macy * Given a property name and its type, returns the corresponding property ID. 156eda14cbcSMatt Macy */ 157eda14cbcSMatt Macy zpool_prop_t 158eda14cbcSMatt Macy zpool_name_to_prop(const char *propname) 159eda14cbcSMatt Macy { 160eda14cbcSMatt Macy return (zprop_name_to_prop(propname, ZFS_TYPE_POOL)); 161eda14cbcSMatt Macy } 162eda14cbcSMatt Macy 163eda14cbcSMatt Macy /* 164eda14cbcSMatt Macy * Given a pool property ID, returns the corresponding name. 165eda14cbcSMatt Macy * Assuming the pool property ID is valid. 166eda14cbcSMatt Macy */ 167eda14cbcSMatt Macy const char * 168eda14cbcSMatt Macy zpool_prop_to_name(zpool_prop_t prop) 169eda14cbcSMatt Macy { 170eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_name); 171eda14cbcSMatt Macy } 172eda14cbcSMatt Macy 173eda14cbcSMatt Macy zprop_type_t 174eda14cbcSMatt Macy zpool_prop_get_type(zpool_prop_t prop) 175eda14cbcSMatt Macy { 176eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_proptype); 177eda14cbcSMatt Macy } 178eda14cbcSMatt Macy 179eda14cbcSMatt Macy boolean_t 180eda14cbcSMatt Macy zpool_prop_readonly(zpool_prop_t prop) 181eda14cbcSMatt Macy { 182eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_attr == PROP_READONLY); 183eda14cbcSMatt Macy } 184eda14cbcSMatt Macy 185eda14cbcSMatt Macy boolean_t 186eda14cbcSMatt Macy zpool_prop_setonce(zpool_prop_t prop) 187eda14cbcSMatt Macy { 188eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_attr == PROP_ONETIME); 189eda14cbcSMatt Macy } 190eda14cbcSMatt Macy 191eda14cbcSMatt Macy const char * 192eda14cbcSMatt Macy zpool_prop_default_string(zpool_prop_t prop) 193eda14cbcSMatt Macy { 194eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_strdefault); 195eda14cbcSMatt Macy } 196eda14cbcSMatt Macy 197eda14cbcSMatt Macy uint64_t 198eda14cbcSMatt Macy zpool_prop_default_numeric(zpool_prop_t prop) 199eda14cbcSMatt Macy { 200eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_numdefault); 201eda14cbcSMatt Macy } 202eda14cbcSMatt Macy 203eda14cbcSMatt Macy /* 204eda14cbcSMatt Macy * Returns true if this is a valid feature@ property. 205eda14cbcSMatt Macy */ 206eda14cbcSMatt Macy boolean_t 207eda14cbcSMatt Macy zpool_prop_feature(const char *name) 208eda14cbcSMatt Macy { 209eda14cbcSMatt Macy static const char *prefix = "feature@"; 210eda14cbcSMatt Macy return (strncmp(name, prefix, strlen(prefix)) == 0); 211eda14cbcSMatt Macy } 212eda14cbcSMatt Macy 213eda14cbcSMatt Macy /* 214eda14cbcSMatt Macy * Returns true if this is a valid unsupported@ property. 215eda14cbcSMatt Macy */ 216eda14cbcSMatt Macy boolean_t 217eda14cbcSMatt Macy zpool_prop_unsupported(const char *name) 218eda14cbcSMatt Macy { 219eda14cbcSMatt Macy static const char *prefix = "unsupported@"; 220eda14cbcSMatt Macy return (strncmp(name, prefix, strlen(prefix)) == 0); 221eda14cbcSMatt Macy } 222eda14cbcSMatt Macy 223eda14cbcSMatt Macy int 224eda14cbcSMatt Macy zpool_prop_string_to_index(zpool_prop_t prop, const char *string, 225eda14cbcSMatt Macy uint64_t *index) 226eda14cbcSMatt Macy { 227eda14cbcSMatt Macy return (zprop_string_to_index(prop, string, index, ZFS_TYPE_POOL)); 228eda14cbcSMatt Macy } 229eda14cbcSMatt Macy 230eda14cbcSMatt Macy int 231eda14cbcSMatt Macy zpool_prop_index_to_string(zpool_prop_t prop, uint64_t index, 232eda14cbcSMatt Macy const char **string) 233eda14cbcSMatt Macy { 234eda14cbcSMatt Macy return (zprop_index_to_string(prop, index, string, ZFS_TYPE_POOL)); 235eda14cbcSMatt Macy } 236eda14cbcSMatt Macy 237eda14cbcSMatt Macy uint64_t 238eda14cbcSMatt Macy zpool_prop_random_value(zpool_prop_t prop, uint64_t seed) 239eda14cbcSMatt Macy { 240eda14cbcSMatt Macy return (zprop_random_value(prop, seed, ZFS_TYPE_POOL)); 241eda14cbcSMatt Macy } 242eda14cbcSMatt Macy 243eda14cbcSMatt Macy #ifndef _KERNEL 244eda14cbcSMatt Macy #include <libzfs.h> 245eda14cbcSMatt Macy 246eda14cbcSMatt Macy const char * 247eda14cbcSMatt Macy zpool_prop_values(zpool_prop_t prop) 248eda14cbcSMatt Macy { 249eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_values); 250eda14cbcSMatt Macy } 251eda14cbcSMatt Macy 252eda14cbcSMatt Macy const char * 253eda14cbcSMatt Macy zpool_prop_column_name(zpool_prop_t prop) 254eda14cbcSMatt Macy { 255eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_colname); 256eda14cbcSMatt Macy } 257eda14cbcSMatt Macy 258eda14cbcSMatt Macy boolean_t 259eda14cbcSMatt Macy zpool_prop_align_right(zpool_prop_t prop) 260eda14cbcSMatt Macy { 261eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_rightalign); 262eda14cbcSMatt Macy } 263eda14cbcSMatt Macy #endif 264eda14cbcSMatt Macy 265*681ce946SMartin Matuska zprop_desc_t * 266*681ce946SMartin Matuska vdev_prop_get_table(void) 267*681ce946SMartin Matuska { 268*681ce946SMartin Matuska return (vdev_prop_table); 269*681ce946SMartin Matuska } 270*681ce946SMartin Matuska 271*681ce946SMartin Matuska void 272*681ce946SMartin Matuska vdev_prop_init(void) 273*681ce946SMartin Matuska { 274*681ce946SMartin Matuska static zprop_index_t boolean_table[] = { 275*681ce946SMartin Matuska { "off", 0}, 276*681ce946SMartin Matuska { "on", 1}, 277*681ce946SMartin Matuska { NULL } 278*681ce946SMartin Matuska }; 279*681ce946SMartin Matuska static zprop_index_t boolean_na_table[] = { 280*681ce946SMartin Matuska { "off", 0}, 281*681ce946SMartin Matuska { "on", 1}, 282*681ce946SMartin Matuska { "-", 2}, /* ZPROP_BOOLEAN_NA */ 283*681ce946SMartin Matuska { NULL } 284*681ce946SMartin Matuska }; 285*681ce946SMartin Matuska 286*681ce946SMartin Matuska /* string properties */ 287*681ce946SMartin Matuska zprop_register_string(VDEV_PROP_COMMENT, "comment", NULL, 288*681ce946SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<comment-string>", "COMMENT"); 289*681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PATH, "path", NULL, 290*681ce946SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<device-path>", "PATH"); 291*681ce946SMartin Matuska zprop_register_string(VDEV_PROP_DEVID, "devid", NULL, 292*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<devid>", "DEVID"); 293*681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PHYS_PATH, "physpath", NULL, 294*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<physpath>", "PHYSPATH"); 295*681ce946SMartin Matuska zprop_register_string(VDEV_PROP_ENC_PATH, "encpath", NULL, 296*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<encpath>", "ENCPATH"); 297*681ce946SMartin Matuska zprop_register_string(VDEV_PROP_FRU, "fru", NULL, 298*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<fru>", "FRU"); 299*681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PARENT, "parent", NULL, 300*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<parent>", "PARENT"); 301*681ce946SMartin Matuska zprop_register_string(VDEV_PROP_CHILDREN, "children", NULL, 302*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<child[,...]>", "CHILDREN"); 303*681ce946SMartin Matuska 304*681ce946SMartin Matuska /* readonly number properties */ 305*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_SIZE, "size", 0, PROP_READONLY, 306*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<size>", "SIZE"); 307*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_FREE, "free", 0, PROP_READONLY, 308*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<size>", "FREE"); 309*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ALLOCATED, "allocated", 0, 310*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<size>", "ALLOC"); 311*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_EXPANDSZ, "expandsize", 0, 312*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<size>", "EXPANDSZ"); 313*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_FRAGMENTATION, "fragmentation", 0, 314*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<percent>", "FRAG"); 315*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_CAPACITY, "capacity", 0, PROP_READONLY, 316*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<size>", "CAP"); 317*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_GUID, "guid", 0, PROP_READONLY, 318*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<guid>", "GUID"); 319*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_STATE, "state", 0, PROP_READONLY, 320*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<state>", "STATE"); 321*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BOOTSIZE, "bootsize", 0, PROP_READONLY, 322*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<size>", "BOOTSIZE"); 323*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ASIZE, "asize", 0, PROP_READONLY, 324*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<asize>", "ASIZE"); 325*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_PSIZE, "psize", 0, PROP_READONLY, 326*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<psize>", "PSIZE"); 327*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ASHIFT, "ashift", 0, PROP_READONLY, 328*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<ashift>", "ASHIFT"); 329*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_PARITY, "parity", 0, PROP_READONLY, 330*681ce946SMartin Matuska ZFS_TYPE_VDEV, "<parity>", "PARITY"); 331*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_NUMCHILDREN, "numchildren", 0, 332*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<number-of-children>", "NUMCHILD"); 333*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_READ_ERRORS, "read_errors", 0, 334*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "RDERR"); 335*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_WRITE_ERRORS, "write_errors", 0, 336*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "WRERR"); 337*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_CHECKSUM_ERRORS, "checksum_errors", 0, 338*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "CKERR"); 339*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_INITIALIZE_ERRORS, 340*681ce946SMartin Matuska "initialize_errors", 0, PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", 341*681ce946SMartin Matuska "INITERR"); 342*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_NULL, "null_ops", 0, 343*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "NULLOP"); 344*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_READ, "read_ops", 0, 345*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "READOP"); 346*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_WRITE, "write_ops", 0, 347*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "WRITEOP"); 348*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_FREE, "free_ops", 0, 349*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "FREEOP"); 350*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_CLAIM, "claim_ops", 0, 351*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "CLAIMOP"); 352*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_TRIM, "trim_ops", 0, 353*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "TRIMOP"); 354*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_NULL, "null_bytes", 0, 355*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "NULLBYTE"); 356*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_READ, "read_bytes", 0, 357*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "READBYTE"); 358*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_WRITE, "write_bytes", 0, 359*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "WRITEBYTE"); 360*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_FREE, "free_bytes", 0, 361*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "FREEBYTE"); 362*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_CLAIM, "claim_bytes", 0, 363*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "CLAIMBYTE"); 364*681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_TRIM, "trim_bytes", 0, 365*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "TRIMBYTE"); 366*681ce946SMartin Matuska 367*681ce946SMartin Matuska /* default numeric properties */ 368*681ce946SMartin Matuska 369*681ce946SMartin Matuska /* default index (boolean) properties */ 370*681ce946SMartin Matuska zprop_register_index(VDEV_PROP_REMOVING, "removing", 0, 371*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "on | off", "REMOVING", 372*681ce946SMartin Matuska boolean_table); 373*681ce946SMartin Matuska zprop_register_index(VDEV_PROP_ALLOCATING, "allocating", 1, 374*681ce946SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "on | off", "ALLOCATING", 375*681ce946SMartin Matuska boolean_na_table); 376*681ce946SMartin Matuska 377*681ce946SMartin Matuska /* default index properties */ 378*681ce946SMartin Matuska 379*681ce946SMartin Matuska /* hidden properties */ 380*681ce946SMartin Matuska zprop_register_hidden(VDEV_PROP_NAME, "name", PROP_TYPE_STRING, 381*681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "NAME"); 382*681ce946SMartin Matuska } 383*681ce946SMartin Matuska 384*681ce946SMartin Matuska /* 385*681ce946SMartin Matuska * Given a property name and its type, returns the corresponding property ID. 386*681ce946SMartin Matuska */ 387*681ce946SMartin Matuska vdev_prop_t 388*681ce946SMartin Matuska vdev_name_to_prop(const char *propname) 389*681ce946SMartin Matuska { 390*681ce946SMartin Matuska return (zprop_name_to_prop(propname, ZFS_TYPE_VDEV)); 391*681ce946SMartin Matuska } 392*681ce946SMartin Matuska 393*681ce946SMartin Matuska /* 394*681ce946SMartin Matuska * Returns true if this is a valid user-defined property (one with a ':'). 395*681ce946SMartin Matuska */ 396*681ce946SMartin Matuska boolean_t 397*681ce946SMartin Matuska vdev_prop_user(const char *name) 398*681ce946SMartin Matuska { 399*681ce946SMartin Matuska int i; 400*681ce946SMartin Matuska char c; 401*681ce946SMartin Matuska boolean_t foundsep = B_FALSE; 402*681ce946SMartin Matuska 403*681ce946SMartin Matuska for (i = 0; i < strlen(name); i++) { 404*681ce946SMartin Matuska c = name[i]; 405*681ce946SMartin Matuska if (!zprop_valid_char(c)) 406*681ce946SMartin Matuska return (B_FALSE); 407*681ce946SMartin Matuska if (c == ':') 408*681ce946SMartin Matuska foundsep = B_TRUE; 409*681ce946SMartin Matuska } 410*681ce946SMartin Matuska 411*681ce946SMartin Matuska return (foundsep); 412*681ce946SMartin Matuska } 413*681ce946SMartin Matuska 414*681ce946SMartin Matuska /* 415*681ce946SMartin Matuska * Given a pool property ID, returns the corresponding name. 416*681ce946SMartin Matuska * Assuming the pool property ID is valid. 417*681ce946SMartin Matuska */ 418*681ce946SMartin Matuska const char * 419*681ce946SMartin Matuska vdev_prop_to_name(vdev_prop_t prop) 420*681ce946SMartin Matuska { 421*681ce946SMartin Matuska return (vdev_prop_table[prop].pd_name); 422*681ce946SMartin Matuska } 423*681ce946SMartin Matuska 424*681ce946SMartin Matuska zprop_type_t 425*681ce946SMartin Matuska vdev_prop_get_type(vdev_prop_t prop) 426*681ce946SMartin Matuska { 427*681ce946SMartin Matuska return (vdev_prop_table[prop].pd_proptype); 428*681ce946SMartin Matuska } 429*681ce946SMartin Matuska 430*681ce946SMartin Matuska boolean_t 431*681ce946SMartin Matuska vdev_prop_readonly(vdev_prop_t prop) 432*681ce946SMartin Matuska { 433*681ce946SMartin Matuska return (vdev_prop_table[prop].pd_attr == PROP_READONLY); 434*681ce946SMartin Matuska } 435*681ce946SMartin Matuska 436*681ce946SMartin Matuska const char * 437*681ce946SMartin Matuska vdev_prop_default_string(vdev_prop_t prop) 438*681ce946SMartin Matuska { 439*681ce946SMartin Matuska return (vdev_prop_table[prop].pd_strdefault); 440*681ce946SMartin Matuska } 441*681ce946SMartin Matuska 442*681ce946SMartin Matuska uint64_t 443*681ce946SMartin Matuska vdev_prop_default_numeric(vdev_prop_t prop) 444*681ce946SMartin Matuska { 445*681ce946SMartin Matuska return (vdev_prop_table[prop].pd_numdefault); 446*681ce946SMartin Matuska } 447*681ce946SMartin Matuska 448*681ce946SMartin Matuska int 449*681ce946SMartin Matuska vdev_prop_string_to_index(vdev_prop_t prop, const char *string, 450*681ce946SMartin Matuska uint64_t *index) 451*681ce946SMartin Matuska { 452*681ce946SMartin Matuska return (zprop_string_to_index(prop, string, index, ZFS_TYPE_VDEV)); 453*681ce946SMartin Matuska } 454*681ce946SMartin Matuska 455*681ce946SMartin Matuska int 456*681ce946SMartin Matuska vdev_prop_index_to_string(vdev_prop_t prop, uint64_t index, 457*681ce946SMartin Matuska const char **string) 458*681ce946SMartin Matuska { 459*681ce946SMartin Matuska return (zprop_index_to_string(prop, index, string, ZFS_TYPE_VDEV)); 460*681ce946SMartin Matuska } 461*681ce946SMartin Matuska 462*681ce946SMartin Matuska /* 463*681ce946SMartin Matuska * Returns true if this is a valid vdev property. 464*681ce946SMartin Matuska */ 465*681ce946SMartin Matuska boolean_t 466*681ce946SMartin Matuska zpool_prop_vdev(const char *name) 467*681ce946SMartin Matuska { 468*681ce946SMartin Matuska return (vdev_name_to_prop(name) != VDEV_PROP_INVAL); 469*681ce946SMartin Matuska } 470*681ce946SMartin Matuska 471*681ce946SMartin Matuska uint64_t 472*681ce946SMartin Matuska vdev_prop_random_value(vdev_prop_t prop, uint64_t seed) 473*681ce946SMartin Matuska { 474*681ce946SMartin Matuska return (zprop_random_value(prop, seed, ZFS_TYPE_VDEV)); 475*681ce946SMartin Matuska } 476*681ce946SMartin Matuska 477*681ce946SMartin Matuska #ifndef _KERNEL 478*681ce946SMartin Matuska const char * 479*681ce946SMartin Matuska vdev_prop_values(vdev_prop_t prop) 480*681ce946SMartin Matuska { 481*681ce946SMartin Matuska return (vdev_prop_table[prop].pd_values); 482*681ce946SMartin Matuska } 483*681ce946SMartin Matuska 484*681ce946SMartin Matuska const char * 485*681ce946SMartin Matuska vdev_prop_column_name(vdev_prop_t prop) 486*681ce946SMartin Matuska { 487*681ce946SMartin Matuska return (vdev_prop_table[prop].pd_colname); 488*681ce946SMartin Matuska } 489*681ce946SMartin Matuska 490*681ce946SMartin Matuska boolean_t 491*681ce946SMartin Matuska vdev_prop_align_right(vdev_prop_t prop) 492*681ce946SMartin Matuska { 493*681ce946SMartin Matuska return (vdev_prop_table[prop].pd_rightalign); 494*681ce946SMartin Matuska } 495*681ce946SMartin Matuska #endif 496*681ce946SMartin Matuska 497eda14cbcSMatt Macy #if defined(_KERNEL) 498eda14cbcSMatt Macy /* zpool property functions */ 499eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_init); 500eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_get_type); 501eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_get_table); 502eda14cbcSMatt Macy 503*681ce946SMartin Matuska /* vdev property functions */ 504*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_init); 505*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_get_type); 506*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_get_table); 507*681ce946SMartin Matuska 508eda14cbcSMatt Macy /* Pool property functions shared between libzfs and kernel. */ 509eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_name_to_prop); 510eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_to_name); 511eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_default_string); 512eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_default_numeric); 513eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_readonly); 514eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_feature); 515eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_unsupported); 516eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_index_to_string); 517eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_string_to_index); 518*681ce946SMartin Matuska EXPORT_SYMBOL(zpool_prop_vdev); 519*681ce946SMartin Matuska 520*681ce946SMartin Matuska /* vdev property functions shared between libzfs and kernel. */ 521*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_name_to_prop); 522*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_user); 523*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_to_name); 524*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_default_string); 525*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_default_numeric); 526*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_readonly); 527*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_index_to_string); 528*681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_string_to_index); 529eda14cbcSMatt Macy #endif 530