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. 25*ee36e25aSMartin Matuska * Copyright (c) 2021, Colm Buckley <colm@tuatha.org> 26eda14cbcSMatt Macy */ 27eda14cbcSMatt Macy 28eda14cbcSMatt Macy #include <sys/zio.h> 29eda14cbcSMatt Macy #include <sys/spa.h> 30eda14cbcSMatt Macy #include <sys/zfs_acl.h> 31eda14cbcSMatt Macy #include <sys/zfs_ioctl.h> 32eda14cbcSMatt Macy #include <sys/fs/zfs.h> 33eda14cbcSMatt Macy 34eda14cbcSMatt Macy #include "zfs_prop.h" 35eda14cbcSMatt Macy 36eda14cbcSMatt Macy #if !defined(_KERNEL) 37eda14cbcSMatt Macy #include <stdlib.h> 38eda14cbcSMatt Macy #include <string.h> 39eda14cbcSMatt Macy #include <ctype.h> 40eda14cbcSMatt Macy #endif 41eda14cbcSMatt Macy 42eda14cbcSMatt Macy static zprop_desc_t zpool_prop_table[ZPOOL_NUM_PROPS]; 43eda14cbcSMatt Macy 44eda14cbcSMatt Macy zprop_desc_t * 45eda14cbcSMatt Macy zpool_prop_get_table(void) 46eda14cbcSMatt Macy { 47eda14cbcSMatt Macy return (zpool_prop_table); 48eda14cbcSMatt Macy } 49eda14cbcSMatt Macy 50eda14cbcSMatt Macy void 51eda14cbcSMatt Macy zpool_prop_init(void) 52eda14cbcSMatt Macy { 53eda14cbcSMatt Macy static zprop_index_t boolean_table[] = { 54eda14cbcSMatt Macy { "off", 0}, 55eda14cbcSMatt Macy { "on", 1}, 56eda14cbcSMatt Macy { NULL } 57eda14cbcSMatt Macy }; 58eda14cbcSMatt Macy 59eda14cbcSMatt Macy static zprop_index_t failuremode_table[] = { 60eda14cbcSMatt Macy { "wait", ZIO_FAILURE_MODE_WAIT }, 61eda14cbcSMatt Macy { "continue", ZIO_FAILURE_MODE_CONTINUE }, 62eda14cbcSMatt Macy { "panic", ZIO_FAILURE_MODE_PANIC }, 63eda14cbcSMatt Macy { NULL } 64eda14cbcSMatt Macy }; 65eda14cbcSMatt Macy 66eda14cbcSMatt Macy /* string properties */ 67eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_ALTROOT, "altroot", NULL, PROP_DEFAULT, 68eda14cbcSMatt Macy ZFS_TYPE_POOL, "<path>", "ALTROOT"); 69eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_BOOTFS, "bootfs", NULL, PROP_DEFAULT, 70eda14cbcSMatt Macy ZFS_TYPE_POOL, "<filesystem>", "BOOTFS"); 71eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_CACHEFILE, "cachefile", NULL, 72eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "<file> | none", "CACHEFILE"); 73eda14cbcSMatt Macy zprop_register_string(ZPOOL_PROP_COMMENT, "comment", NULL, 74eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "<comment-string>", "COMMENT"); 75*ee36e25aSMartin Matuska zprop_register_string(ZPOOL_PROP_COMPATIBILITY, "compatibility", 76*ee36e25aSMartin Matuska "off", PROP_DEFAULT, ZFS_TYPE_POOL, 77*ee36e25aSMartin Matuska "<file[,file...]> | off | legacy", "COMPATIBILITY"); 78eda14cbcSMatt Macy 79eda14cbcSMatt Macy /* readonly number properties */ 80eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_SIZE, "size", 0, PROP_READONLY, 81eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "SIZE"); 82eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FREE, "free", 0, PROP_READONLY, 83eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "FREE"); 84eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FREEING, "freeing", 0, PROP_READONLY, 85eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "FREEING"); 86eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_CHECKPOINT, "checkpoint", 0, 87eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<size>", "CKPOINT"); 88eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_LEAKED, "leaked", 0, PROP_READONLY, 89eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "LEAKED"); 90eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_ALLOCATED, "allocated", 0, 91eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<size>", "ALLOC"); 92eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_EXPANDSZ, "expandsize", 0, 93eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<size>", "EXPANDSZ"); 94eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_FRAGMENTATION, "fragmentation", 0, 95eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<percent>", "FRAG"); 96eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_CAPACITY, "capacity", 0, PROP_READONLY, 97eda14cbcSMatt Macy ZFS_TYPE_POOL, "<size>", "CAP"); 98eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_GUID, "guid", 0, PROP_READONLY, 99eda14cbcSMatt Macy ZFS_TYPE_POOL, "<guid>", "GUID"); 100eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_LOAD_GUID, "load_guid", 0, 101eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<load_guid>", "LOAD_GUID"); 102eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_HEALTH, "health", 0, PROP_READONLY, 103eda14cbcSMatt Macy ZFS_TYPE_POOL, "<state>", "HEALTH"); 104eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_DEDUPRATIO, "dedupratio", 0, 105eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "<1.00x or higher if deduped>", 106eda14cbcSMatt Macy "DEDUP"); 107eda14cbcSMatt Macy 108eda14cbcSMatt Macy /* default number properties */ 109eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_VERSION, "version", SPA_VERSION, 110eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "<version>", "VERSION"); 111eda14cbcSMatt Macy zprop_register_number(ZPOOL_PROP_ASHIFT, "ashift", 0, PROP_DEFAULT, 112eda14cbcSMatt Macy ZFS_TYPE_POOL, "<ashift, 9-16, or 0=default>", "ASHIFT"); 113eda14cbcSMatt Macy 114eda14cbcSMatt Macy /* default index (boolean) properties */ 115eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_DELEGATION, "delegation", 1, 116eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "DELEGATION", 117eda14cbcSMatt Macy boolean_table); 118eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOREPLACE, "autoreplace", 0, 119eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "REPLACE", boolean_table); 120eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_LISTSNAPS, "listsnapshots", 0, 121eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "LISTSNAPS", 122eda14cbcSMatt Macy boolean_table); 123eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOEXPAND, "autoexpand", 0, 124eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "EXPAND", boolean_table); 125eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_READONLY, "readonly", 0, 126eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "RDONLY", boolean_table); 127eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_MULTIHOST, "multihost", 0, 128eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_POOL, "on | off", "MULTIHOST", 129eda14cbcSMatt Macy boolean_table); 130eda14cbcSMatt Macy 131eda14cbcSMatt Macy /* default index properties */ 132eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_FAILUREMODE, "failmode", 133eda14cbcSMatt Macy ZIO_FAILURE_MODE_WAIT, PROP_DEFAULT, ZFS_TYPE_POOL, 134eda14cbcSMatt Macy "wait | continue | panic", "FAILMODE", failuremode_table); 135eda14cbcSMatt Macy zprop_register_index(ZPOOL_PROP_AUTOTRIM, "autotrim", 136eda14cbcSMatt Macy SPA_AUTOTRIM_DEFAULT, PROP_DEFAULT, ZFS_TYPE_POOL, 137eda14cbcSMatt Macy "on | off", "AUTOTRIM", boolean_table); 138eda14cbcSMatt Macy 139eda14cbcSMatt Macy /* hidden properties */ 140eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_NAME, "name", PROP_TYPE_STRING, 141eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_POOL, "NAME"); 142eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_MAXBLOCKSIZE, "maxblocksize", 143eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXBLOCKSIZE"); 144eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_TNAME, "tname", PROP_TYPE_STRING, 145eda14cbcSMatt Macy PROP_ONETIME, ZFS_TYPE_POOL, "TNAME"); 146eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_MAXDNODESIZE, "maxdnodesize", 147eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXDNODESIZE"); 148eda14cbcSMatt Macy zprop_register_hidden(ZPOOL_PROP_DEDUPDITTO, "dedupditto", 149eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_DEFAULT, ZFS_TYPE_POOL, "DEDUPDITTO"); 150eda14cbcSMatt Macy } 151eda14cbcSMatt Macy 152eda14cbcSMatt Macy /* 153eda14cbcSMatt Macy * Given a property name and its type, returns the corresponding property ID. 154eda14cbcSMatt Macy */ 155eda14cbcSMatt Macy zpool_prop_t 156eda14cbcSMatt Macy zpool_name_to_prop(const char *propname) 157eda14cbcSMatt Macy { 158eda14cbcSMatt Macy return (zprop_name_to_prop(propname, ZFS_TYPE_POOL)); 159eda14cbcSMatt Macy } 160eda14cbcSMatt Macy 161eda14cbcSMatt Macy /* 162eda14cbcSMatt Macy * Given a pool property ID, returns the corresponding name. 163eda14cbcSMatt Macy * Assuming the pool property ID is valid. 164eda14cbcSMatt Macy */ 165eda14cbcSMatt Macy const char * 166eda14cbcSMatt Macy zpool_prop_to_name(zpool_prop_t prop) 167eda14cbcSMatt Macy { 168eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_name); 169eda14cbcSMatt Macy } 170eda14cbcSMatt Macy 171eda14cbcSMatt Macy zprop_type_t 172eda14cbcSMatt Macy zpool_prop_get_type(zpool_prop_t prop) 173eda14cbcSMatt Macy { 174eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_proptype); 175eda14cbcSMatt Macy } 176eda14cbcSMatt Macy 177eda14cbcSMatt Macy boolean_t 178eda14cbcSMatt Macy zpool_prop_readonly(zpool_prop_t prop) 179eda14cbcSMatt Macy { 180eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_attr == PROP_READONLY); 181eda14cbcSMatt Macy } 182eda14cbcSMatt Macy 183eda14cbcSMatt Macy boolean_t 184eda14cbcSMatt Macy zpool_prop_setonce(zpool_prop_t prop) 185eda14cbcSMatt Macy { 186eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_attr == PROP_ONETIME); 187eda14cbcSMatt Macy } 188eda14cbcSMatt Macy 189eda14cbcSMatt Macy const char * 190eda14cbcSMatt Macy zpool_prop_default_string(zpool_prop_t prop) 191eda14cbcSMatt Macy { 192eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_strdefault); 193eda14cbcSMatt Macy } 194eda14cbcSMatt Macy 195eda14cbcSMatt Macy uint64_t 196eda14cbcSMatt Macy zpool_prop_default_numeric(zpool_prop_t prop) 197eda14cbcSMatt Macy { 198eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_numdefault); 199eda14cbcSMatt Macy } 200eda14cbcSMatt Macy 201eda14cbcSMatt Macy /* 202eda14cbcSMatt Macy * Returns true if this is a valid feature@ property. 203eda14cbcSMatt Macy */ 204eda14cbcSMatt Macy boolean_t 205eda14cbcSMatt Macy zpool_prop_feature(const char *name) 206eda14cbcSMatt Macy { 207eda14cbcSMatt Macy static const char *prefix = "feature@"; 208eda14cbcSMatt Macy return (strncmp(name, prefix, strlen(prefix)) == 0); 209eda14cbcSMatt Macy } 210eda14cbcSMatt Macy 211eda14cbcSMatt Macy /* 212eda14cbcSMatt Macy * Returns true if this is a valid unsupported@ property. 213eda14cbcSMatt Macy */ 214eda14cbcSMatt Macy boolean_t 215eda14cbcSMatt Macy zpool_prop_unsupported(const char *name) 216eda14cbcSMatt Macy { 217eda14cbcSMatt Macy static const char *prefix = "unsupported@"; 218eda14cbcSMatt Macy return (strncmp(name, prefix, strlen(prefix)) == 0); 219eda14cbcSMatt Macy } 220eda14cbcSMatt Macy 221eda14cbcSMatt Macy int 222eda14cbcSMatt Macy zpool_prop_string_to_index(zpool_prop_t prop, const char *string, 223eda14cbcSMatt Macy uint64_t *index) 224eda14cbcSMatt Macy { 225eda14cbcSMatt Macy return (zprop_string_to_index(prop, string, index, ZFS_TYPE_POOL)); 226eda14cbcSMatt Macy } 227eda14cbcSMatt Macy 228eda14cbcSMatt Macy int 229eda14cbcSMatt Macy zpool_prop_index_to_string(zpool_prop_t prop, uint64_t index, 230eda14cbcSMatt Macy const char **string) 231eda14cbcSMatt Macy { 232eda14cbcSMatt Macy return (zprop_index_to_string(prop, index, string, ZFS_TYPE_POOL)); 233eda14cbcSMatt Macy } 234eda14cbcSMatt Macy 235eda14cbcSMatt Macy uint64_t 236eda14cbcSMatt Macy zpool_prop_random_value(zpool_prop_t prop, uint64_t seed) 237eda14cbcSMatt Macy { 238eda14cbcSMatt Macy return (zprop_random_value(prop, seed, ZFS_TYPE_POOL)); 239eda14cbcSMatt Macy } 240eda14cbcSMatt Macy 241eda14cbcSMatt Macy #ifndef _KERNEL 242eda14cbcSMatt Macy #include <libzfs.h> 243eda14cbcSMatt Macy 244eda14cbcSMatt Macy const char * 245eda14cbcSMatt Macy zpool_prop_values(zpool_prop_t prop) 246eda14cbcSMatt Macy { 247eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_values); 248eda14cbcSMatt Macy } 249eda14cbcSMatt Macy 250eda14cbcSMatt Macy const char * 251eda14cbcSMatt Macy zpool_prop_column_name(zpool_prop_t prop) 252eda14cbcSMatt Macy { 253eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_colname); 254eda14cbcSMatt Macy } 255eda14cbcSMatt Macy 256eda14cbcSMatt Macy boolean_t 257eda14cbcSMatt Macy zpool_prop_align_right(zpool_prop_t prop) 258eda14cbcSMatt Macy { 259eda14cbcSMatt Macy return (zpool_prop_table[prop].pd_rightalign); 260eda14cbcSMatt Macy } 261eda14cbcSMatt Macy #endif 262eda14cbcSMatt Macy 263eda14cbcSMatt Macy #if defined(_KERNEL) 264eda14cbcSMatt Macy /* zpool property functions */ 265eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_init); 266eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_get_type); 267eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_get_table); 268eda14cbcSMatt Macy 269eda14cbcSMatt Macy /* Pool property functions shared between libzfs and kernel. */ 270eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_name_to_prop); 271eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_to_name); 272eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_default_string); 273eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_default_numeric); 274eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_readonly); 275eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_feature); 276eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_unsupported); 277eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_index_to_string); 278eda14cbcSMatt Macy EXPORT_SYMBOL(zpool_prop_string_to_index); 279eda14cbcSMatt Macy #endif 280