1*61145dc2SMartin Matuska // SPDX-License-Identifier: CDDL-1.0 2eda14cbcSMatt Macy /* 3eda14cbcSMatt Macy * CDDL HEADER START 4eda14cbcSMatt Macy * 5eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 6eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 7eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 8eda14cbcSMatt Macy * 9eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 11eda14cbcSMatt Macy * See the License for the specific language governing permissions 12eda14cbcSMatt Macy * and limitations under the License. 13eda14cbcSMatt Macy * 14eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 15eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 17eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 18eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 19eda14cbcSMatt Macy * 20eda14cbcSMatt Macy * CDDL HEADER END 21eda14cbcSMatt Macy */ 22eda14cbcSMatt Macy /* 23eda14cbcSMatt Macy * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 24eda14cbcSMatt Macy * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 25eda14cbcSMatt Macy * Copyright (c) 2012, 2018 by Delphix. All rights reserved. 26ee36e25aSMartin Matuska * Copyright (c) 2021, Colm Buckley <colm@tuatha.org> 27ce4dcb97SMartin Matuska * Copyright (c) 2021, 2023, Klara Inc. 28eda14cbcSMatt Macy */ 29eda14cbcSMatt Macy 30eda14cbcSMatt Macy #include <sys/zio.h> 31eda14cbcSMatt Macy #include <sys/spa.h> 32eda14cbcSMatt Macy #include <sys/zfs_acl.h> 33eda14cbcSMatt Macy #include <sys/zfs_ioctl.h> 34eda14cbcSMatt Macy #include <sys/fs/zfs.h> 35eda14cbcSMatt Macy 36eda14cbcSMatt Macy #include "zfs_prop.h" 37eda14cbcSMatt Macy 38eda14cbcSMatt Macy #if !defined(_KERNEL) 39eda14cbcSMatt Macy #include <stdlib.h> 40eda14cbcSMatt Macy #include <string.h> 41eda14cbcSMatt Macy #include <ctype.h> 42eda14cbcSMatt Macy #endif 43eda14cbcSMatt Macy 44eda14cbcSMatt Macy static zprop_desc_t zpool_prop_table[ZPOOL_NUM_PROPS]; 45681ce946SMartin Matuska static zprop_desc_t vdev_prop_table[VDEV_NUM_PROPS]; 46eda14cbcSMatt Macy 47eda14cbcSMatt Macy zprop_desc_t * 48eda14cbcSMatt Macy zpool_prop_get_table(void) 49eda14cbcSMatt Macy { 50eda14cbcSMatt Macy return (zpool_prop_table); 51eda14cbcSMatt Macy } 52eda14cbcSMatt Macy 53eda14cbcSMatt Macy void 54eda14cbcSMatt Macy zpool_prop_init(void) 55eda14cbcSMatt Macy { 56e92ffd9bSMartin Matuska static const zprop_index_t boolean_table[] = { 57eda14cbcSMatt Macy { "off", 0}, 58eda14cbcSMatt Macy { "on", 1}, 59eda14cbcSMatt Macy { NULL } 60eda14cbcSMatt Macy }; 61eda14cbcSMatt Macy 62e92ffd9bSMartin Matuska static const zprop_index_t failuremode_table[] = { 63eda14cbcSMatt Macy { "wait", ZIO_FAILURE_MODE_WAIT }, 64eda14cbcSMatt Macy { "continue", ZIO_FAILURE_MODE_CONTINUE }, 65eda14cbcSMatt Macy { "panic", ZIO_FAILURE_MODE_PANIC }, 66eda14cbcSMatt Macy { NULL } 67eda14cbcSMatt Macy }; 68eda14cbcSMatt Macy 69e92ffd9bSMartin Matuska struct zfs_mod_supported_features *sfeatures = 70e92ffd9bSMartin Matuska zfs_mod_list_supported(ZFS_SYSFS_POOL_PROPERTIES); 71e92ffd9bSMartin Matuska 72eda14cbcSMatt Macy /* string properties */ 73eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_ALTROOT, "altroot", NULL, PROP_DEFAULT, 74e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<path>", "ALTROOT", sfeatures); 75eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_BOOTFS, "bootfs", NULL, PROP_DEFAULT, 76e92ffd9bSMartin Matuska ZFS_TYPE_POOL, "<filesystem>", "BOOTFS", sfeatures); 77eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_CACHEFILE, "cachefile", NULL, 78e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "<file> | none", "CACHEFILE", 79e92ffd9bSMartin Matuska sfeatures); 80eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_COMMENT, "comment", NULL, 81e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "<comment-string>", "COMMENT", 82e92ffd9bSMartin Matuska sfeatures); 83ee36e25aSMartin Matuska zprop_register_string(ZPOOL_PROP_COMPATIBILITY, "compatibility", 84ee36e25aSMartin Matuska "off", PROP_DEFAULT, ZFS_TYPE_POOL, 85e92ffd9bSMartin Matuska "<file[,file...]> | off | legacy", "COMPATIBILITY", sfeatures); 86eda14cbcSMatt Macy 87eda14cbcSMatt Macy /* readonly number properties */ 88eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_SIZE, "size", 0, PROP_READONLY, 89c03c5b1cSMartin Matuska ZFS_TYPE_POOL, "<size>", "SIZE", B_FALSE, sfeatures); 90eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FREE, "free", 0, PROP_READONLY, 91c03c5b1cSMartin Matuska ZFS_TYPE_POOL, "<size>", "FREE", B_FALSE, sfeatures); 92eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FREEING, "freeing", 0, PROP_READONLY, 93c03c5b1cSMartin Matuska ZFS_TYPE_POOL, "<size>", "FREEING", B_FALSE, sfeatures); 94eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_CHECKPOINT, "checkpoint", 0, 95c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<size>", "CKPOINT", B_FALSE, 96c03c5b1cSMartin Matuska sfeatures); 97eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_LEAKED, "leaked", 0, PROP_READONLY, 98c03c5b1cSMartin Matuska ZFS_TYPE_POOL, "<size>", "LEAKED", B_FALSE, sfeatures); 99eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_ALLOCATED, "allocated", 0, 100c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<size>", "ALLOC", B_FALSE, 101c03c5b1cSMartin Matuska sfeatures); 102eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_EXPANDSZ, "expandsize", 0, 103c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<size>", "EXPANDSZ", B_FALSE, 104c03c5b1cSMartin Matuska sfeatures); 105eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FRAGMENTATION, "fragmentation", 0, 106c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<percent>", "FRAG", B_FALSE, 107c03c5b1cSMartin Matuska sfeatures); 108eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_CAPACITY, "capacity", 0, PROP_READONLY, 109dd215568SMartin Matuska ZFS_TYPE_POOL, "<percent>", "CAP", B_FALSE, sfeatures); 110eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_GUID, "guid", 0, PROP_READONLY, 111c03c5b1cSMartin Matuska ZFS_TYPE_POOL, "<guid>", "GUID", B_TRUE, sfeatures); 112eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_LOAD_GUID, "load_guid", 0, 113e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<load_guid>", "LOAD_GUID", 114c03c5b1cSMartin Matuska B_TRUE, sfeatures); 115eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_HEALTH, "health", 0, PROP_READONLY, 116c03c5b1cSMartin Matuska ZFS_TYPE_POOL, "<state>", "HEALTH", B_FALSE, sfeatures); 117eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_DEDUPRATIO, "dedupratio", 0, 118eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<1.00x or higher if deduped>", 119c03c5b1cSMartin Matuska "DEDUP", B_FALSE, sfeatures); 1202a58b312SMartin Matuska zprop_register_number(ZPOOL_PROP_BCLONEUSED, "bcloneused", 0, 1212a58b312SMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<size>", 1222a58b312SMartin Matuska "BCLONE_USED", B_FALSE, sfeatures); 1232a58b312SMartin Matuska zprop_register_number(ZPOOL_PROP_BCLONESAVED, "bclonesaved", 0, 1242a58b312SMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<size>", 1252a58b312SMartin Matuska "BCLONE_SAVED", B_FALSE, sfeatures); 1262a58b312SMartin Matuska zprop_register_number(ZPOOL_PROP_BCLONERATIO, "bcloneratio", 0, 1272a58b312SMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "<1.00x or higher if cloned>", 1282a58b312SMartin Matuska "BCLONE_RATIO", B_FALSE, sfeatures); 129ce4dcb97SMartin Matuska zprop_register_number(ZPOOL_PROP_DEDUP_TABLE_SIZE, "dedup_table_size", 130ce4dcb97SMartin Matuska 0, PROP_READONLY, ZFS_TYPE_POOL, "<size>", "DDTSIZE", B_FALSE, 131ce4dcb97SMartin Matuska sfeatures); 13217aab35aSMartin Matuska zprop_register_number(ZPOOL_PROP_LAST_SCRUBBED_TXG, 13317aab35aSMartin Matuska "last_scrubbed_txg", 0, PROP_READONLY, ZFS_TYPE_POOL, "<txg>", 13417aab35aSMartin Matuska "LAST_SCRUBBED_TXG", B_FALSE, sfeatures); 135eda14cbcSMatt Macy 136eda14cbcSMatt Macy /* default number properties */ 137eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_VERSION, "version", SPA_VERSION, 138c03c5b1cSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "<version>", "VERSION", B_FALSE, 139c03c5b1cSMartin Matuska sfeatures); 140eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_ASHIFT, "ashift", 0, PROP_DEFAULT, 141c03c5b1cSMartin Matuska ZFS_TYPE_POOL, "<ashift, 9-16, or 0=default>", "ASHIFT", B_FALSE, 142c03c5b1cSMartin Matuska sfeatures); 143ce4dcb97SMartin Matuska zprop_register_number(ZPOOL_PROP_DEDUP_TABLE_QUOTA, "dedup_table_quota", 144ce4dcb97SMartin Matuska UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_POOL, "<size>", "DDTQUOTA", 145ce4dcb97SMartin Matuska B_FALSE, sfeatures); 146eda14cbcSMatt Macy 147eda14cbcSMatt Macy /* default index (boolean) properties */ 148eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_DELEGATION, "delegation", 1, 149eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "DELEGATION", 150e92ffd9bSMartin Matuska boolean_table, sfeatures); 151eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOREPLACE, "autoreplace", 0, 152e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "REPLACE", boolean_table, 153e92ffd9bSMartin Matuska sfeatures); 154eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_LISTSNAPS, "listsnapshots", 0, 155eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "LISTSNAPS", 156e92ffd9bSMartin Matuska boolean_table, sfeatures); 157eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOEXPAND, "autoexpand", 0, 158e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "EXPAND", boolean_table, 159e92ffd9bSMartin Matuska sfeatures); 160eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_READONLY, "readonly", 0, 161e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "RDONLY", boolean_table, 162e92ffd9bSMartin Matuska sfeatures); 163eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_MULTIHOST, "multihost", 0, 164eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "MULTIHOST", 165e92ffd9bSMartin Matuska boolean_table, sfeatures); 166eda14cbcSMatt Macy 167eda14cbcSMatt Macy /* default index properties */ 168eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_FAILUREMODE, "failmode", 169eda14cbcSMatt Macy ZIO_FAILURE_MODE_WAIT, PROP_DEFAULT, ZFS_TYPE_POOL, 170e92ffd9bSMartin Matuska "wait | continue | panic", "FAILMODE", failuremode_table, 171e92ffd9bSMartin Matuska sfeatures); 172eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOTRIM, "autotrim", 173b36f469aSYuri Pankov SPA_AUTOTRIM_OFF, PROP_DEFAULT, ZFS_TYPE_POOL, 174e92ffd9bSMartin Matuska "on | off", "AUTOTRIM", boolean_table, sfeatures); 175eda14cbcSMatt Macy 176eda14cbcSMatt Macy /* hidden properties */ 177eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_NAME, "name", PROP_TYPE_STRING, 178c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_POOL, "NAME", B_TRUE, sfeatures); 179eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_MAXBLOCKSIZE, "maxblocksize", 180e92ffd9bSMartin Matuska PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXBLOCKSIZE", 181c03c5b1cSMartin Matuska B_FALSE, sfeatures); 182eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_TNAME, "tname", PROP_TYPE_STRING, 183c03c5b1cSMartin Matuska PROP_ONETIME, ZFS_TYPE_POOL, "TNAME", B_TRUE, sfeatures); 184eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_MAXDNODESIZE, "maxdnodesize", 185e92ffd9bSMartin Matuska PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXDNODESIZE", 186c03c5b1cSMartin Matuska B_FALSE, sfeatures); 187eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_DEDUPDITTO, "dedupditto", 188e92ffd9bSMartin Matuska PROP_TYPE_NUMBER, PROP_DEFAULT, ZFS_TYPE_POOL, "DEDUPDITTO", 189c03c5b1cSMartin Matuska B_FALSE, sfeatures); 190ce4dcb97SMartin Matuska zprop_register_hidden(ZPOOL_PROP_DEDUPCACHED, 191ce4dcb97SMartin Matuska ZPOOL_DEDUPCACHED_PROP_NAME, PROP_TYPE_NUMBER, PROP_READONLY, 192ce4dcb97SMartin Matuska ZFS_TYPE_POOL, "DEDUPCACHED", B_FALSE, sfeatures); 193e92ffd9bSMartin Matuska 194e92ffd9bSMartin Matuska zfs_mod_list_supported_free(sfeatures); 195eda14cbcSMatt Macy } 196eda14cbcSMatt Macy 197eda14cbcSMatt Macy /* 198eda14cbcSMatt Macy * Given a property name and its type, returns the corresponding property ID. 199eda14cbcSMatt Macy */ 200eda14cbcSMatt Macy zpool_prop_t 201eda14cbcSMatt Macy zpool_name_to_prop(const char *propname) 202eda14cbcSMatt Macy { 203eda14cbcSMatt Macy return (zprop_name_to_prop(propname, ZFS_TYPE_POOL)); 204eda14cbcSMatt Macy } 205eda14cbcSMatt Macy 206eda14cbcSMatt Macy /* 207eda14cbcSMatt Macy * Given a pool property ID, returns the corresponding name. 208eda14cbcSMatt Macy * Assuming the pool property ID is valid. 209eda14cbcSMatt Macy */ 210eda14cbcSMatt Macy const char * 211eda14cbcSMatt Macy zpool_prop_to_name(zpool_prop_t prop) 212eda14cbcSMatt Macy { 213eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_name); 214eda14cbcSMatt Macy } 215eda14cbcSMatt Macy 216eda14cbcSMatt Macy zprop_type_t 217eda14cbcSMatt Macy zpool_prop_get_type(zpool_prop_t prop) 218eda14cbcSMatt Macy { 219eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_proptype); 220eda14cbcSMatt Macy } 221eda14cbcSMatt Macy 222eda14cbcSMatt Macy boolean_t 223eda14cbcSMatt Macy zpool_prop_readonly(zpool_prop_t prop) 224eda14cbcSMatt Macy { 225eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_attr == PROP_READONLY); 226eda14cbcSMatt Macy } 227eda14cbcSMatt Macy 228eda14cbcSMatt Macy boolean_t 229eda14cbcSMatt Macy zpool_prop_setonce(zpool_prop_t prop) 230eda14cbcSMatt Macy { 231eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_attr == PROP_ONETIME); 232eda14cbcSMatt Macy } 233eda14cbcSMatt Macy 234eda14cbcSMatt Macy const char * 235eda14cbcSMatt Macy zpool_prop_default_string(zpool_prop_t prop) 236eda14cbcSMatt Macy { 237eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_strdefault); 238eda14cbcSMatt Macy } 239eda14cbcSMatt Macy 240eda14cbcSMatt Macy uint64_t 241eda14cbcSMatt Macy zpool_prop_default_numeric(zpool_prop_t prop) 242eda14cbcSMatt Macy { 243eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_numdefault); 244eda14cbcSMatt Macy } 245eda14cbcSMatt Macy 246eda14cbcSMatt Macy /* 247eda14cbcSMatt Macy * Returns true if this is a valid feature@ property. 248eda14cbcSMatt Macy */ 249eda14cbcSMatt Macy boolean_t 250eda14cbcSMatt Macy zpool_prop_feature(const char *name) 251eda14cbcSMatt Macy { 252eda14cbcSMatt Macy static const char *prefix = "feature@"; 253eda14cbcSMatt Macy return (strncmp(name, prefix, strlen(prefix)) == 0); 254eda14cbcSMatt Macy } 255eda14cbcSMatt Macy 256eda14cbcSMatt Macy /* 257eda14cbcSMatt Macy * Returns true if this is a valid unsupported@ property. 258eda14cbcSMatt Macy */ 259eda14cbcSMatt Macy boolean_t 260eda14cbcSMatt Macy zpool_prop_unsupported(const char *name) 261eda14cbcSMatt Macy { 262eda14cbcSMatt Macy static const char *prefix = "unsupported@"; 263eda14cbcSMatt Macy return (strncmp(name, prefix, strlen(prefix)) == 0); 264eda14cbcSMatt Macy } 265eda14cbcSMatt Macy 266eda14cbcSMatt Macy int 267eda14cbcSMatt Macy zpool_prop_string_to_index(zpool_prop_t prop, const char *string, 268eda14cbcSMatt Macy uint64_t *index) 269eda14cbcSMatt Macy { 270eda14cbcSMatt Macy return (zprop_string_to_index(prop, string, index, ZFS_TYPE_POOL)); 271eda14cbcSMatt Macy } 272eda14cbcSMatt Macy 273eda14cbcSMatt Macy int 274eda14cbcSMatt Macy zpool_prop_index_to_string(zpool_prop_t prop, uint64_t index, 275eda14cbcSMatt Macy const char **string) 276eda14cbcSMatt Macy { 277eda14cbcSMatt Macy return (zprop_index_to_string(prop, index, string, ZFS_TYPE_POOL)); 278eda14cbcSMatt Macy } 279eda14cbcSMatt Macy 280eda14cbcSMatt Macy uint64_t 281eda14cbcSMatt Macy zpool_prop_random_value(zpool_prop_t prop, uint64_t seed) 282eda14cbcSMatt Macy { 283eda14cbcSMatt Macy return (zprop_random_value(prop, seed, ZFS_TYPE_POOL)); 284eda14cbcSMatt Macy } 285eda14cbcSMatt Macy 286eda14cbcSMatt Macy #ifndef _KERNEL 287eda14cbcSMatt Macy #include <libzfs.h> 288eda14cbcSMatt Macy 289eda14cbcSMatt Macy const char * 290eda14cbcSMatt Macy zpool_prop_values(zpool_prop_t prop) 291eda14cbcSMatt Macy { 292eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_values); 293eda14cbcSMatt Macy } 294eda14cbcSMatt Macy 295eda14cbcSMatt Macy const char * 296eda14cbcSMatt Macy zpool_prop_column_name(zpool_prop_t prop) 297eda14cbcSMatt Macy { 298eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_colname); 299eda14cbcSMatt Macy } 300eda14cbcSMatt Macy 301eda14cbcSMatt Macy boolean_t 302eda14cbcSMatt Macy zpool_prop_align_right(zpool_prop_t prop) 303eda14cbcSMatt Macy { 304eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_rightalign); 305eda14cbcSMatt Macy } 306eda14cbcSMatt Macy #endif 307eda14cbcSMatt Macy 308681ce946SMartin Matuska zprop_desc_t * 309681ce946SMartin Matuska vdev_prop_get_table(void) 310681ce946SMartin Matuska { 311681ce946SMartin Matuska return (vdev_prop_table); 312681ce946SMartin Matuska } 313681ce946SMartin Matuska 314681ce946SMartin Matuska void 315681ce946SMartin Matuska vdev_prop_init(void) 316681ce946SMartin Matuska { 317e92ffd9bSMartin Matuska static const zprop_index_t boolean_table[] = { 318681ce946SMartin Matuska { "off", 0}, 319681ce946SMartin Matuska { "on", 1}, 320681ce946SMartin Matuska { NULL } 321681ce946SMartin Matuska }; 322e92ffd9bSMartin Matuska static const zprop_index_t boolean_na_table[] = { 323681ce946SMartin Matuska { "off", 0}, 324681ce946SMartin Matuska { "on", 1}, 325681ce946SMartin Matuska { "-", 2}, /* ZPROP_BOOLEAN_NA */ 326681ce946SMartin Matuska { NULL } 327681ce946SMartin Matuska }; 328681ce946SMartin Matuska 329e92ffd9bSMartin Matuska struct zfs_mod_supported_features *sfeatures = 330e92ffd9bSMartin Matuska zfs_mod_list_supported(ZFS_SYSFS_VDEV_PROPERTIES); 331e92ffd9bSMartin Matuska 332681ce946SMartin Matuska /* string properties */ 333681ce946SMartin Matuska zprop_register_string(VDEV_PROP_COMMENT, "comment", NULL, 334e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<comment-string>", "COMMENT", 335e92ffd9bSMartin Matuska sfeatures); 336681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PATH, "path", NULL, 337e92ffd9bSMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<device-path>", "PATH", sfeatures); 338681ce946SMartin Matuska zprop_register_string(VDEV_PROP_DEVID, "devid", NULL, 339e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<devid>", "DEVID", sfeatures); 340681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PHYS_PATH, "physpath", NULL, 341e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<physpath>", "PHYSPATH", sfeatures); 342681ce946SMartin Matuska zprop_register_string(VDEV_PROP_ENC_PATH, "encpath", NULL, 343e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<encpath>", "ENCPATH", sfeatures); 344681ce946SMartin Matuska zprop_register_string(VDEV_PROP_FRU, "fru", NULL, 345e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<fru>", "FRU", sfeatures); 346681ce946SMartin Matuska zprop_register_string(VDEV_PROP_PARENT, "parent", NULL, 347e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<parent>", "PARENT", sfeatures); 348681ce946SMartin Matuska zprop_register_string(VDEV_PROP_CHILDREN, "children", NULL, 349e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<child[,...]>", "CHILDREN", 350e92ffd9bSMartin Matuska sfeatures); 351681ce946SMartin Matuska 352681ce946SMartin Matuska /* readonly number properties */ 353681ce946SMartin Matuska zprop_register_number(VDEV_PROP_SIZE, "size", 0, PROP_READONLY, 354c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<size>", "SIZE", B_FALSE, sfeatures); 355681ce946SMartin Matuska zprop_register_number(VDEV_PROP_FREE, "free", 0, PROP_READONLY, 356c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<size>", "FREE", B_FALSE, sfeatures); 357681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ALLOCATED, "allocated", 0, 358c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<size>", "ALLOC", B_FALSE, 359c03c5b1cSMartin Matuska sfeatures); 360681ce946SMartin Matuska zprop_register_number(VDEV_PROP_EXPANDSZ, "expandsize", 0, 361c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<size>", "EXPANDSZ", B_FALSE, 362c03c5b1cSMartin Matuska sfeatures); 363681ce946SMartin Matuska zprop_register_number(VDEV_PROP_FRAGMENTATION, "fragmentation", 0, 364c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<percent>", "FRAG", B_FALSE, 365c03c5b1cSMartin Matuska sfeatures); 366681ce946SMartin Matuska zprop_register_number(VDEV_PROP_CAPACITY, "capacity", 0, PROP_READONLY, 367c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<size>", "CAP", B_FALSE, sfeatures); 368681ce946SMartin Matuska zprop_register_number(VDEV_PROP_GUID, "guid", 0, PROP_READONLY, 369c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<guid>", "GUID", B_TRUE, sfeatures); 370681ce946SMartin Matuska zprop_register_number(VDEV_PROP_STATE, "state", 0, PROP_READONLY, 371c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<state>", "STATE", B_FALSE, sfeatures); 372681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BOOTSIZE, "bootsize", 0, PROP_READONLY, 373c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<size>", "BOOTSIZE", B_FALSE, sfeatures); 374681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ASIZE, "asize", 0, PROP_READONLY, 375c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<asize>", "ASIZE", B_FALSE, sfeatures); 376681ce946SMartin Matuska zprop_register_number(VDEV_PROP_PSIZE, "psize", 0, PROP_READONLY, 377c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<psize>", "PSIZE", B_FALSE, sfeatures); 378681ce946SMartin Matuska zprop_register_number(VDEV_PROP_ASHIFT, "ashift", 0, PROP_READONLY, 379c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<ashift>", "ASHIFT", B_FALSE, sfeatures); 380681ce946SMartin Matuska zprop_register_number(VDEV_PROP_PARITY, "parity", 0, PROP_READONLY, 381c03c5b1cSMartin Matuska ZFS_TYPE_VDEV, "<parity>", "PARITY", B_FALSE, sfeatures); 382681ce946SMartin Matuska zprop_register_number(VDEV_PROP_NUMCHILDREN, "numchildren", 0, 383e92ffd9bSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<number-of-children>", "NUMCHILD", 384c03c5b1cSMartin Matuska B_FALSE, sfeatures); 385681ce946SMartin Matuska zprop_register_number(VDEV_PROP_READ_ERRORS, "read_errors", 0, 386c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "RDERR", B_FALSE, 387c03c5b1cSMartin Matuska sfeatures); 388681ce946SMartin Matuska zprop_register_number(VDEV_PROP_WRITE_ERRORS, "write_errors", 0, 389c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "WRERR", B_FALSE, 390c03c5b1cSMartin Matuska sfeatures); 391681ce946SMartin Matuska zprop_register_number(VDEV_PROP_CHECKSUM_ERRORS, "checksum_errors", 0, 392c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "CKERR", B_FALSE, 393c03c5b1cSMartin Matuska sfeatures); 394681ce946SMartin Matuska zprop_register_number(VDEV_PROP_INITIALIZE_ERRORS, 395681ce946SMartin Matuska "initialize_errors", 0, PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", 396c03c5b1cSMartin Matuska "INITERR", B_FALSE, sfeatures); 397ce4dcb97SMartin Matuska zprop_register_number(VDEV_PROP_TRIM_ERRORS, "trim_errors", 0, 398ce4dcb97SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<errors>", "TRIMERR", B_FALSE, 399ce4dcb97SMartin Matuska sfeatures); 400ce4dcb97SMartin Matuska zprop_register_number(VDEV_PROP_SLOW_IOS, "slow_ios", 0, 401ce4dcb97SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<slowios>", "SLOW", B_FALSE, 402ce4dcb97SMartin Matuska sfeatures); 403681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_NULL, "null_ops", 0, 404c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "NULLOP", B_FALSE, 405c03c5b1cSMartin Matuska sfeatures); 406681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_READ, "read_ops", 0, 407c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "READOP", B_FALSE, 408c03c5b1cSMartin Matuska sfeatures); 409681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_WRITE, "write_ops", 0, 410c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "WRITEOP", B_FALSE, 411c03c5b1cSMartin Matuska sfeatures); 412681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_FREE, "free_ops", 0, 413c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "FREEOP", B_FALSE, 414c03c5b1cSMartin Matuska sfeatures); 415681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_CLAIM, "claim_ops", 0, 416c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "CLAIMOP", B_FALSE, 417c03c5b1cSMartin Matuska sfeatures); 418681ce946SMartin Matuska zprop_register_number(VDEV_PROP_OPS_TRIM, "trim_ops", 0, 419c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<operations>", "TRIMOP", B_FALSE, 420c03c5b1cSMartin Matuska sfeatures); 421681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_NULL, "null_bytes", 0, 422c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "NULLBYTE", B_FALSE, 423c03c5b1cSMartin Matuska sfeatures); 424681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_READ, "read_bytes", 0, 425c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "READBYTE", B_FALSE, 426c03c5b1cSMartin Matuska sfeatures); 427681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_WRITE, "write_bytes", 0, 428c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "WRITEBYTE", B_FALSE, 429c03c5b1cSMartin Matuska sfeatures); 430681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_FREE, "free_bytes", 0, 431c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "FREEBYTE", B_FALSE, 432c03c5b1cSMartin Matuska sfeatures); 433681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_CLAIM, "claim_bytes", 0, 434c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "CLAIMBYTE", B_FALSE, 435c03c5b1cSMartin Matuska sfeatures); 436681ce946SMartin Matuska zprop_register_number(VDEV_PROP_BYTES_TRIM, "trim_bytes", 0, 437c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "<bytes>", "TRIMBYTE", B_FALSE, 438c03c5b1cSMartin Matuska sfeatures); 439681ce946SMartin Matuska 440681ce946SMartin Matuska /* default numeric properties */ 44115f0b8c3SMartin Matuska zprop_register_number(VDEV_PROP_CHECKSUM_N, "checksum_n", UINT64_MAX, 44215f0b8c3SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<events>", "CKSUM_N", B_FALSE, 44315f0b8c3SMartin Matuska sfeatures); 44415f0b8c3SMartin Matuska zprop_register_number(VDEV_PROP_CHECKSUM_T, "checksum_t", UINT64_MAX, 44515f0b8c3SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<seconds>", "CKSUM_T", B_FALSE, 44615f0b8c3SMartin Matuska sfeatures); 44715f0b8c3SMartin Matuska zprop_register_number(VDEV_PROP_IO_N, "io_n", UINT64_MAX, 44815f0b8c3SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<events>", "IO_N", B_FALSE, 44915f0b8c3SMartin Matuska sfeatures); 45015f0b8c3SMartin Matuska zprop_register_number(VDEV_PROP_IO_T, "io_t", UINT64_MAX, 45115f0b8c3SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<seconds>", "IO_T", B_FALSE, 45215f0b8c3SMartin Matuska sfeatures); 453e2257b31SMartin Matuska zprop_register_number(VDEV_PROP_SLOW_IO_N, "slow_io_n", UINT64_MAX, 454e2257b31SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<events>", "SLOW_IO_N", B_FALSE, 455e2257b31SMartin Matuska sfeatures); 456e2257b31SMartin Matuska zprop_register_number(VDEV_PROP_SLOW_IO_T, "slow_io_t", UINT64_MAX, 457e2257b31SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "<seconds>", "SLOW_IO_T", B_FALSE, 458e2257b31SMartin Matuska sfeatures); 459681ce946SMartin Matuska 460681ce946SMartin Matuska /* default index (boolean) properties */ 461681ce946SMartin Matuska zprop_register_index(VDEV_PROP_REMOVING, "removing", 0, 462681ce946SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "on | off", "REMOVING", 463e92ffd9bSMartin Matuska boolean_table, sfeatures); 464681ce946SMartin Matuska zprop_register_index(VDEV_PROP_ALLOCATING, "allocating", 1, 465681ce946SMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "on | off", "ALLOCATING", 466e92ffd9bSMartin Matuska boolean_na_table, sfeatures); 467e716630dSMartin Matuska zprop_register_index(VDEV_PROP_RAIDZ_EXPANDING, "raidz_expanding", 0, 468e716630dSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "on | off", "RAIDZ_EXPANDING", 469e716630dSMartin Matuska boolean_table, sfeatures); 470ce4dcb97SMartin Matuska zprop_register_index(VDEV_PROP_TRIM_SUPPORT, "trim_support", 0, 471ce4dcb97SMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "on | off", "TRIMSUP", 472ce4dcb97SMartin Matuska boolean_table, sfeatures); 473681ce946SMartin Matuska 474681ce946SMartin Matuska /* default index properties */ 475dbd5678dSMartin Matuska zprop_register_index(VDEV_PROP_FAILFAST, "failfast", B_TRUE, 476dbd5678dSMartin Matuska PROP_DEFAULT, ZFS_TYPE_VDEV, "on | off", "FAILFAST", boolean_table, 477dbd5678dSMartin Matuska sfeatures); 478681ce946SMartin Matuska 479681ce946SMartin Matuska /* hidden properties */ 480681ce946SMartin Matuska zprop_register_hidden(VDEV_PROP_NAME, "name", PROP_TYPE_STRING, 481c03c5b1cSMartin Matuska PROP_READONLY, ZFS_TYPE_VDEV, "NAME", B_TRUE, sfeatures); 482e92ffd9bSMartin Matuska 483e92ffd9bSMartin Matuska zfs_mod_list_supported_free(sfeatures); 484681ce946SMartin Matuska } 485681ce946SMartin Matuska 486681ce946SMartin Matuska /* 487681ce946SMartin Matuska * Given a property name and its type, returns the corresponding property ID. 488681ce946SMartin Matuska */ 489681ce946SMartin Matuska vdev_prop_t 490681ce946SMartin Matuska vdev_name_to_prop(const char *propname) 491681ce946SMartin Matuska { 492681ce946SMartin Matuska return (zprop_name_to_prop(propname, ZFS_TYPE_VDEV)); 493681ce946SMartin Matuska } 494681ce946SMartin Matuska 495681ce946SMartin Matuska /* 496681ce946SMartin Matuska * Returns true if this is a valid user-defined property (one with a ':'). 497681ce946SMartin Matuska */ 498681ce946SMartin Matuska boolean_t 499681ce946SMartin Matuska vdev_prop_user(const char *name) 500681ce946SMartin Matuska { 5017a7741afSMartin Matuska int i, len; 502681ce946SMartin Matuska char c; 503681ce946SMartin Matuska boolean_t foundsep = B_FALSE; 504681ce946SMartin Matuska 5057a7741afSMartin Matuska len = strlen(name); 5067a7741afSMartin Matuska for (i = 0; i < len; i++) { 507681ce946SMartin Matuska c = name[i]; 508681ce946SMartin Matuska if (!zprop_valid_char(c)) 509681ce946SMartin Matuska return (B_FALSE); 510681ce946SMartin Matuska if (c == ':') 511681ce946SMartin Matuska foundsep = B_TRUE; 512681ce946SMartin Matuska } 513681ce946SMartin Matuska 514681ce946SMartin Matuska return (foundsep); 515681ce946SMartin Matuska } 516681ce946SMartin Matuska 517681ce946SMartin Matuska /* 518681ce946SMartin Matuska * Given a pool property ID, returns the corresponding name. 519681ce946SMartin Matuska * Assuming the pool property ID is valid. 520681ce946SMartin Matuska */ 521681ce946SMartin Matuska const char * 522681ce946SMartin Matuska vdev_prop_to_name(vdev_prop_t prop) 523681ce946SMartin Matuska { 524681ce946SMartin Matuska return (vdev_prop_table[prop].pd_name); 525681ce946SMartin Matuska } 526681ce946SMartin Matuska 527681ce946SMartin Matuska zprop_type_t 528681ce946SMartin Matuska vdev_prop_get_type(vdev_prop_t prop) 529681ce946SMartin Matuska { 530681ce946SMartin Matuska return (vdev_prop_table[prop].pd_proptype); 531681ce946SMartin Matuska } 532681ce946SMartin Matuska 533681ce946SMartin Matuska boolean_t 534681ce946SMartin Matuska vdev_prop_readonly(vdev_prop_t prop) 535681ce946SMartin Matuska { 536681ce946SMartin Matuska return (vdev_prop_table[prop].pd_attr == PROP_READONLY); 537681ce946SMartin Matuska } 538681ce946SMartin Matuska 539681ce946SMartin Matuska const char * 540681ce946SMartin Matuska vdev_prop_default_string(vdev_prop_t prop) 541681ce946SMartin Matuska { 542681ce946SMartin Matuska return (vdev_prop_table[prop].pd_strdefault); 543681ce946SMartin Matuska } 544681ce946SMartin Matuska 545681ce946SMartin Matuska uint64_t 546681ce946SMartin Matuska vdev_prop_default_numeric(vdev_prop_t prop) 547681ce946SMartin Matuska { 548681ce946SMartin Matuska return (vdev_prop_table[prop].pd_numdefault); 549681ce946SMartin Matuska } 550681ce946SMartin Matuska 551681ce946SMartin Matuska int 552681ce946SMartin Matuska vdev_prop_string_to_index(vdev_prop_t prop, const char *string, 553681ce946SMartin Matuska uint64_t *index) 554681ce946SMartin Matuska { 555681ce946SMartin Matuska return (zprop_string_to_index(prop, string, index, ZFS_TYPE_VDEV)); 556681ce946SMartin Matuska } 557681ce946SMartin Matuska 558681ce946SMartin Matuska int 559681ce946SMartin Matuska vdev_prop_index_to_string(vdev_prop_t prop, uint64_t index, 560681ce946SMartin Matuska const char **string) 561681ce946SMartin Matuska { 562681ce946SMartin Matuska return (zprop_index_to_string(prop, index, string, ZFS_TYPE_VDEV)); 563681ce946SMartin Matuska } 564681ce946SMartin Matuska 565681ce946SMartin Matuska /* 566681ce946SMartin Matuska * Returns true if this is a valid vdev property. 567681ce946SMartin Matuska */ 568681ce946SMartin Matuska boolean_t 569681ce946SMartin Matuska zpool_prop_vdev(const char *name) 570681ce946SMartin Matuska { 571681ce946SMartin Matuska return (vdev_name_to_prop(name) != VDEV_PROP_INVAL); 572681ce946SMartin Matuska } 573681ce946SMartin Matuska 574681ce946SMartin Matuska uint64_t 575681ce946SMartin Matuska vdev_prop_random_value(vdev_prop_t prop, uint64_t seed) 576681ce946SMartin Matuska { 577681ce946SMartin Matuska return (zprop_random_value(prop, seed, ZFS_TYPE_VDEV)); 578681ce946SMartin Matuska } 579681ce946SMartin Matuska 580681ce946SMartin Matuska #ifndef _KERNEL 581681ce946SMartin Matuska const char * 582681ce946SMartin Matuska vdev_prop_values(vdev_prop_t prop) 583681ce946SMartin Matuska { 584681ce946SMartin Matuska return (vdev_prop_table[prop].pd_values); 585681ce946SMartin Matuska } 586681ce946SMartin Matuska 587681ce946SMartin Matuska const char * 588681ce946SMartin Matuska vdev_prop_column_name(vdev_prop_t prop) 589681ce946SMartin Matuska { 590681ce946SMartin Matuska return (vdev_prop_table[prop].pd_colname); 591681ce946SMartin Matuska } 592681ce946SMartin Matuska 593681ce946SMartin Matuska boolean_t 594681ce946SMartin Matuska vdev_prop_align_right(vdev_prop_t prop) 595681ce946SMartin Matuska { 596681ce946SMartin Matuska return (vdev_prop_table[prop].pd_rightalign); 597681ce946SMartin Matuska } 598681ce946SMartin Matuska #endif 599681ce946SMartin Matuska 600eda14cbcSMatt Macy #if defined(_KERNEL) 601eda14cbcSMatt Macy /* zpool property functions */ 602eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_init); 603eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_get_type); 604eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_get_table); 605eda14cbcSMatt Macy 606681ce946SMartin Matuska /* vdev property functions */ 607681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_init); 608681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_get_type); 609681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_get_table); 610681ce946SMartin Matuska 611eda14cbcSMatt Macy /* Pool property functions shared between libzfs and kernel. */ 612eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_name_to_prop); 613eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_to_name); 614eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_default_string); 615eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_default_numeric); 616eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_readonly); 617eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_feature); 618eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_unsupported); 619eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_index_to_string); 620eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_string_to_index); 621681ce946SMartin Matuska EXPORT_SYMBOL(zpool_prop_vdev); 622681ce946SMartin Matuska 623681ce946SMartin Matuska /* vdev property functions shared between libzfs and kernel. */ 624681ce946SMartin Matuska EXPORT_SYMBOL(vdev_name_to_prop); 625681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_user); 626681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_to_name); 627681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_default_string); 628681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_default_numeric); 629681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_readonly); 630681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_index_to_string); 631681ce946SMartin Matuska EXPORT_SYMBOL(vdev_prop_string_to_index); 632eda14cbcSMatt Macy #endif 633