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