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) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 23*eda14cbcSMatt Macy * Copyright (c) 2011, 2018 by Delphix. All rights reserved. 24*eda14cbcSMatt Macy * Copyright (c) 2013 by Saso Kiselkov. All rights reserved. 25*eda14cbcSMatt Macy * Copyright 2016, Joyent, Inc. 26*eda14cbcSMatt Macy * Copyright (c) 2019, Klara Inc. 27*eda14cbcSMatt Macy * Copyright (c) 2019, Allan Jude 28*eda14cbcSMatt Macy */ 29*eda14cbcSMatt Macy 30*eda14cbcSMatt Macy /* Portions Copyright 2010 Robert Milkowski */ 31*eda14cbcSMatt Macy 32*eda14cbcSMatt Macy #include <sys/zio.h> 33*eda14cbcSMatt Macy #include <sys/spa.h> 34*eda14cbcSMatt Macy #include <sys/u8_textprep.h> 35*eda14cbcSMatt Macy #include <sys/zfs_acl.h> 36*eda14cbcSMatt Macy #include <sys/zfs_ioctl.h> 37*eda14cbcSMatt Macy #include <sys/zfs_znode.h> 38*eda14cbcSMatt Macy #include <sys/dsl_crypt.h> 39*eda14cbcSMatt Macy 40*eda14cbcSMatt Macy #include "zfs_prop.h" 41*eda14cbcSMatt Macy #include "zfs_deleg.h" 42*eda14cbcSMatt Macy #include "zfs_fletcher.h" 43*eda14cbcSMatt Macy 44*eda14cbcSMatt Macy #if !defined(_KERNEL) 45*eda14cbcSMatt Macy #include <stdlib.h> 46*eda14cbcSMatt Macy #include <string.h> 47*eda14cbcSMatt Macy #include <ctype.h> 48*eda14cbcSMatt Macy #endif 49*eda14cbcSMatt Macy 50*eda14cbcSMatt Macy static zprop_desc_t zfs_prop_table[ZFS_NUM_PROPS]; 51*eda14cbcSMatt Macy 52*eda14cbcSMatt Macy /* Note this is indexed by zfs_userquota_prop_t, keep the order the same */ 53*eda14cbcSMatt Macy const char *zfs_userquota_prop_prefixes[] = { 54*eda14cbcSMatt Macy "userused@", 55*eda14cbcSMatt Macy "userquota@", 56*eda14cbcSMatt Macy "groupused@", 57*eda14cbcSMatt Macy "groupquota@", 58*eda14cbcSMatt Macy "userobjused@", 59*eda14cbcSMatt Macy "userobjquota@", 60*eda14cbcSMatt Macy "groupobjused@", 61*eda14cbcSMatt Macy "groupobjquota@", 62*eda14cbcSMatt Macy "projectused@", 63*eda14cbcSMatt Macy "projectquota@", 64*eda14cbcSMatt Macy "projectobjused@", 65*eda14cbcSMatt Macy "projectobjquota@" 66*eda14cbcSMatt Macy }; 67*eda14cbcSMatt Macy 68*eda14cbcSMatt Macy zprop_desc_t * 69*eda14cbcSMatt Macy zfs_prop_get_table(void) 70*eda14cbcSMatt Macy { 71*eda14cbcSMatt Macy return (zfs_prop_table); 72*eda14cbcSMatt Macy } 73*eda14cbcSMatt Macy 74*eda14cbcSMatt Macy void 75*eda14cbcSMatt Macy zfs_prop_init(void) 76*eda14cbcSMatt Macy { 77*eda14cbcSMatt Macy static zprop_index_t checksum_table[] = { 78*eda14cbcSMatt Macy { "on", ZIO_CHECKSUM_ON }, 79*eda14cbcSMatt Macy { "off", ZIO_CHECKSUM_OFF }, 80*eda14cbcSMatt Macy { "fletcher2", ZIO_CHECKSUM_FLETCHER_2 }, 81*eda14cbcSMatt Macy { "fletcher4", ZIO_CHECKSUM_FLETCHER_4 }, 82*eda14cbcSMatt Macy { "sha256", ZIO_CHECKSUM_SHA256 }, 83*eda14cbcSMatt Macy { "noparity", ZIO_CHECKSUM_NOPARITY }, 84*eda14cbcSMatt Macy { "sha512", ZIO_CHECKSUM_SHA512 }, 85*eda14cbcSMatt Macy { "skein", ZIO_CHECKSUM_SKEIN }, 86*eda14cbcSMatt Macy #if !defined(__FreeBSD__) 87*eda14cbcSMatt Macy 88*eda14cbcSMatt Macy { "edonr", ZIO_CHECKSUM_EDONR }, 89*eda14cbcSMatt Macy #endif 90*eda14cbcSMatt Macy { NULL } 91*eda14cbcSMatt Macy }; 92*eda14cbcSMatt Macy 93*eda14cbcSMatt Macy static zprop_index_t dedup_table[] = { 94*eda14cbcSMatt Macy { "on", ZIO_CHECKSUM_ON }, 95*eda14cbcSMatt Macy { "off", ZIO_CHECKSUM_OFF }, 96*eda14cbcSMatt Macy { "verify", ZIO_CHECKSUM_ON | ZIO_CHECKSUM_VERIFY }, 97*eda14cbcSMatt Macy { "sha256", ZIO_CHECKSUM_SHA256 }, 98*eda14cbcSMatt Macy { "sha256,verify", 99*eda14cbcSMatt Macy ZIO_CHECKSUM_SHA256 | ZIO_CHECKSUM_VERIFY }, 100*eda14cbcSMatt Macy { "sha512", ZIO_CHECKSUM_SHA512 }, 101*eda14cbcSMatt Macy { "sha512,verify", 102*eda14cbcSMatt Macy ZIO_CHECKSUM_SHA512 | ZIO_CHECKSUM_VERIFY }, 103*eda14cbcSMatt Macy { "skein", ZIO_CHECKSUM_SKEIN }, 104*eda14cbcSMatt Macy { "skein,verify", 105*eda14cbcSMatt Macy ZIO_CHECKSUM_SKEIN | ZIO_CHECKSUM_VERIFY }, 106*eda14cbcSMatt Macy #if !defined(__FreeBSD__) 107*eda14cbcSMatt Macy 108*eda14cbcSMatt Macy { "edonr,verify", 109*eda14cbcSMatt Macy ZIO_CHECKSUM_EDONR | ZIO_CHECKSUM_VERIFY }, 110*eda14cbcSMatt Macy #endif 111*eda14cbcSMatt Macy { NULL } 112*eda14cbcSMatt Macy }; 113*eda14cbcSMatt Macy 114*eda14cbcSMatt Macy static zprop_index_t compress_table[] = { 115*eda14cbcSMatt Macy { "on", ZIO_COMPRESS_ON }, 116*eda14cbcSMatt Macy { "off", ZIO_COMPRESS_OFF }, 117*eda14cbcSMatt Macy { "lzjb", ZIO_COMPRESS_LZJB }, 118*eda14cbcSMatt Macy { "gzip", ZIO_COMPRESS_GZIP_6 }, /* gzip default */ 119*eda14cbcSMatt Macy { "gzip-1", ZIO_COMPRESS_GZIP_1 }, 120*eda14cbcSMatt Macy { "gzip-2", ZIO_COMPRESS_GZIP_2 }, 121*eda14cbcSMatt Macy { "gzip-3", ZIO_COMPRESS_GZIP_3 }, 122*eda14cbcSMatt Macy { "gzip-4", ZIO_COMPRESS_GZIP_4 }, 123*eda14cbcSMatt Macy { "gzip-5", ZIO_COMPRESS_GZIP_5 }, 124*eda14cbcSMatt Macy { "gzip-6", ZIO_COMPRESS_GZIP_6 }, 125*eda14cbcSMatt Macy { "gzip-7", ZIO_COMPRESS_GZIP_7 }, 126*eda14cbcSMatt Macy { "gzip-8", ZIO_COMPRESS_GZIP_8 }, 127*eda14cbcSMatt Macy { "gzip-9", ZIO_COMPRESS_GZIP_9 }, 128*eda14cbcSMatt Macy { "zle", ZIO_COMPRESS_ZLE }, 129*eda14cbcSMatt Macy { "lz4", ZIO_COMPRESS_LZ4 }, 130*eda14cbcSMatt Macy { "zstd", ZIO_COMPRESS_ZSTD }, 131*eda14cbcSMatt Macy { "zstd-fast", 132*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_DEFAULT) }, 133*eda14cbcSMatt Macy 134*eda14cbcSMatt Macy /* 135*eda14cbcSMatt Macy * ZSTD 1-19 are synthetic. We store the compression level in a 136*eda14cbcSMatt Macy * separate hidden property to avoid wasting a large amount of 137*eda14cbcSMatt Macy * space in the ZIO_COMPRESS enum. 138*eda14cbcSMatt Macy * 139*eda14cbcSMatt Macy * The compression level is also stored within the header of the 140*eda14cbcSMatt Macy * compressed block since we may need it for later recompression 141*eda14cbcSMatt Macy * to avoid checksum errors (L2ARC). 142*eda14cbcSMatt Macy * 143*eda14cbcSMatt Macy * Note that the level here is defined as bit shifted mask on 144*eda14cbcSMatt Macy * top of the method. 145*eda14cbcSMatt Macy */ 146*eda14cbcSMatt Macy { "zstd-1", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_1) }, 147*eda14cbcSMatt Macy { "zstd-2", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_2) }, 148*eda14cbcSMatt Macy { "zstd-3", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_3) }, 149*eda14cbcSMatt Macy { "zstd-4", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_4) }, 150*eda14cbcSMatt Macy { "zstd-5", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_5) }, 151*eda14cbcSMatt Macy { "zstd-6", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_6) }, 152*eda14cbcSMatt Macy { "zstd-7", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_7) }, 153*eda14cbcSMatt Macy { "zstd-8", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_8) }, 154*eda14cbcSMatt Macy { "zstd-9", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_9) }, 155*eda14cbcSMatt Macy { "zstd-10", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_10) }, 156*eda14cbcSMatt Macy { "zstd-11", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_11) }, 157*eda14cbcSMatt Macy { "zstd-12", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_12) }, 158*eda14cbcSMatt Macy { "zstd-13", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_13) }, 159*eda14cbcSMatt Macy { "zstd-14", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_14) }, 160*eda14cbcSMatt Macy { "zstd-15", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_15) }, 161*eda14cbcSMatt Macy { "zstd-16", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_16) }, 162*eda14cbcSMatt Macy { "zstd-17", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_17) }, 163*eda14cbcSMatt Macy { "zstd-18", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_18) }, 164*eda14cbcSMatt Macy { "zstd-19", ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_19) }, 165*eda14cbcSMatt Macy 166*eda14cbcSMatt Macy /* 167*eda14cbcSMatt Macy * The ZSTD-Fast levels are also synthetic. 168*eda14cbcSMatt Macy */ 169*eda14cbcSMatt Macy { "zstd-fast-1", 170*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_1) }, 171*eda14cbcSMatt Macy { "zstd-fast-2", 172*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_2) }, 173*eda14cbcSMatt Macy { "zstd-fast-3", 174*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_3) }, 175*eda14cbcSMatt Macy { "zstd-fast-4", 176*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_4) }, 177*eda14cbcSMatt Macy { "zstd-fast-5", 178*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_5) }, 179*eda14cbcSMatt Macy { "zstd-fast-6", 180*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_6) }, 181*eda14cbcSMatt Macy { "zstd-fast-7", 182*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_7) }, 183*eda14cbcSMatt Macy { "zstd-fast-8", 184*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_8) }, 185*eda14cbcSMatt Macy { "zstd-fast-9", 186*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_9) }, 187*eda14cbcSMatt Macy { "zstd-fast-10", 188*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_10) }, 189*eda14cbcSMatt Macy { "zstd-fast-20", 190*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_20) }, 191*eda14cbcSMatt Macy { "zstd-fast-30", 192*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_30) }, 193*eda14cbcSMatt Macy { "zstd-fast-40", 194*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_40) }, 195*eda14cbcSMatt Macy { "zstd-fast-50", 196*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_50) }, 197*eda14cbcSMatt Macy { "zstd-fast-60", 198*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_60) }, 199*eda14cbcSMatt Macy { "zstd-fast-70", 200*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_70) }, 201*eda14cbcSMatt Macy { "zstd-fast-80", 202*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_80) }, 203*eda14cbcSMatt Macy { "zstd-fast-90", 204*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_90) }, 205*eda14cbcSMatt Macy { "zstd-fast-100", 206*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_100) }, 207*eda14cbcSMatt Macy { "zstd-fast-500", 208*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_500) }, 209*eda14cbcSMatt Macy { "zstd-fast-1000", 210*eda14cbcSMatt Macy ZIO_COMPLEVEL_ZSTD(ZIO_ZSTD_LEVEL_FAST_1000) }, 211*eda14cbcSMatt Macy { NULL } 212*eda14cbcSMatt Macy }; 213*eda14cbcSMatt Macy 214*eda14cbcSMatt Macy static zprop_index_t crypto_table[] = { 215*eda14cbcSMatt Macy { "on", ZIO_CRYPT_ON }, 216*eda14cbcSMatt Macy { "off", ZIO_CRYPT_OFF }, 217*eda14cbcSMatt Macy { "aes-128-ccm", ZIO_CRYPT_AES_128_CCM }, 218*eda14cbcSMatt Macy { "aes-192-ccm", ZIO_CRYPT_AES_192_CCM }, 219*eda14cbcSMatt Macy { "aes-256-ccm", ZIO_CRYPT_AES_256_CCM }, 220*eda14cbcSMatt Macy { "aes-128-gcm", ZIO_CRYPT_AES_128_GCM }, 221*eda14cbcSMatt Macy { "aes-192-gcm", ZIO_CRYPT_AES_192_GCM }, 222*eda14cbcSMatt Macy { "aes-256-gcm", ZIO_CRYPT_AES_256_GCM }, 223*eda14cbcSMatt Macy { NULL } 224*eda14cbcSMatt Macy }; 225*eda14cbcSMatt Macy 226*eda14cbcSMatt Macy static zprop_index_t keyformat_table[] = { 227*eda14cbcSMatt Macy { "none", ZFS_KEYFORMAT_NONE }, 228*eda14cbcSMatt Macy { "raw", ZFS_KEYFORMAT_RAW }, 229*eda14cbcSMatt Macy { "hex", ZFS_KEYFORMAT_HEX }, 230*eda14cbcSMatt Macy { "passphrase", ZFS_KEYFORMAT_PASSPHRASE }, 231*eda14cbcSMatt Macy { NULL } 232*eda14cbcSMatt Macy }; 233*eda14cbcSMatt Macy 234*eda14cbcSMatt Macy static zprop_index_t snapdir_table[] = { 235*eda14cbcSMatt Macy { "hidden", ZFS_SNAPDIR_HIDDEN }, 236*eda14cbcSMatt Macy { "visible", ZFS_SNAPDIR_VISIBLE }, 237*eda14cbcSMatt Macy { NULL } 238*eda14cbcSMatt Macy }; 239*eda14cbcSMatt Macy 240*eda14cbcSMatt Macy static zprop_index_t snapdev_table[] = { 241*eda14cbcSMatt Macy { "hidden", ZFS_SNAPDEV_HIDDEN }, 242*eda14cbcSMatt Macy { "visible", ZFS_SNAPDEV_VISIBLE }, 243*eda14cbcSMatt Macy { NULL } 244*eda14cbcSMatt Macy }; 245*eda14cbcSMatt Macy 246*eda14cbcSMatt Macy static zprop_index_t acl_mode_table[] = { 247*eda14cbcSMatt Macy { "discard", ZFS_ACL_DISCARD }, 248*eda14cbcSMatt Macy { "groupmask", ZFS_ACL_GROUPMASK }, 249*eda14cbcSMatt Macy { "passthrough", ZFS_ACL_PASSTHROUGH }, 250*eda14cbcSMatt Macy { "restricted", ZFS_ACL_RESTRICTED }, 251*eda14cbcSMatt Macy { NULL } 252*eda14cbcSMatt Macy }; 253*eda14cbcSMatt Macy 254*eda14cbcSMatt Macy static zprop_index_t acltype_table[] = { 255*eda14cbcSMatt Macy { "off", ZFS_ACLTYPE_OFF }, 256*eda14cbcSMatt Macy { "disabled", ZFS_ACLTYPE_OFF }, 257*eda14cbcSMatt Macy { "noacl", ZFS_ACLTYPE_OFF }, 258*eda14cbcSMatt Macy { "posixacl", ZFS_ACLTYPE_POSIXACL }, 259*eda14cbcSMatt Macy { NULL } 260*eda14cbcSMatt Macy }; 261*eda14cbcSMatt Macy 262*eda14cbcSMatt Macy static zprop_index_t acl_inherit_table[] = { 263*eda14cbcSMatt Macy { "discard", ZFS_ACL_DISCARD }, 264*eda14cbcSMatt Macy { "noallow", ZFS_ACL_NOALLOW }, 265*eda14cbcSMatt Macy { "restricted", ZFS_ACL_RESTRICTED }, 266*eda14cbcSMatt Macy { "passthrough", ZFS_ACL_PASSTHROUGH }, 267*eda14cbcSMatt Macy { "secure", ZFS_ACL_RESTRICTED }, /* bkwrd compatibility */ 268*eda14cbcSMatt Macy { "passthrough-x", ZFS_ACL_PASSTHROUGH_X }, 269*eda14cbcSMatt Macy { NULL } 270*eda14cbcSMatt Macy }; 271*eda14cbcSMatt Macy 272*eda14cbcSMatt Macy static zprop_index_t case_table[] = { 273*eda14cbcSMatt Macy { "sensitive", ZFS_CASE_SENSITIVE }, 274*eda14cbcSMatt Macy { "insensitive", ZFS_CASE_INSENSITIVE }, 275*eda14cbcSMatt Macy { "mixed", ZFS_CASE_MIXED }, 276*eda14cbcSMatt Macy { NULL } 277*eda14cbcSMatt Macy }; 278*eda14cbcSMatt Macy 279*eda14cbcSMatt Macy static zprop_index_t copies_table[] = { 280*eda14cbcSMatt Macy { "1", 1 }, 281*eda14cbcSMatt Macy { "2", 2 }, 282*eda14cbcSMatt Macy { "3", 3 }, 283*eda14cbcSMatt Macy { NULL } 284*eda14cbcSMatt Macy }; 285*eda14cbcSMatt Macy 286*eda14cbcSMatt Macy /* 287*eda14cbcSMatt Macy * Use the unique flags we have to send to u8_strcmp() and/or 288*eda14cbcSMatt Macy * u8_textprep() to represent the various normalization property 289*eda14cbcSMatt Macy * values. 290*eda14cbcSMatt Macy */ 291*eda14cbcSMatt Macy static zprop_index_t normalize_table[] = { 292*eda14cbcSMatt Macy { "none", 0 }, 293*eda14cbcSMatt Macy { "formD", U8_TEXTPREP_NFD }, 294*eda14cbcSMatt Macy { "formKC", U8_TEXTPREP_NFKC }, 295*eda14cbcSMatt Macy { "formC", U8_TEXTPREP_NFC }, 296*eda14cbcSMatt Macy { "formKD", U8_TEXTPREP_NFKD }, 297*eda14cbcSMatt Macy { NULL } 298*eda14cbcSMatt Macy }; 299*eda14cbcSMatt Macy 300*eda14cbcSMatt Macy static zprop_index_t version_table[] = { 301*eda14cbcSMatt Macy { "1", 1 }, 302*eda14cbcSMatt Macy { "2", 2 }, 303*eda14cbcSMatt Macy { "3", 3 }, 304*eda14cbcSMatt Macy { "4", 4 }, 305*eda14cbcSMatt Macy { "5", 5 }, 306*eda14cbcSMatt Macy { "current", ZPL_VERSION }, 307*eda14cbcSMatt Macy { NULL } 308*eda14cbcSMatt Macy }; 309*eda14cbcSMatt Macy 310*eda14cbcSMatt Macy static zprop_index_t boolean_table[] = { 311*eda14cbcSMatt Macy { "off", 0 }, 312*eda14cbcSMatt Macy { "on", 1 }, 313*eda14cbcSMatt Macy { NULL } 314*eda14cbcSMatt Macy }; 315*eda14cbcSMatt Macy 316*eda14cbcSMatt Macy static zprop_index_t keystatus_table[] = { 317*eda14cbcSMatt Macy { "none", ZFS_KEYSTATUS_NONE}, 318*eda14cbcSMatt Macy { "unavailable", ZFS_KEYSTATUS_UNAVAILABLE}, 319*eda14cbcSMatt Macy { "available", ZFS_KEYSTATUS_AVAILABLE}, 320*eda14cbcSMatt Macy { NULL } 321*eda14cbcSMatt Macy }; 322*eda14cbcSMatt Macy 323*eda14cbcSMatt Macy static zprop_index_t logbias_table[] = { 324*eda14cbcSMatt Macy { "latency", ZFS_LOGBIAS_LATENCY }, 325*eda14cbcSMatt Macy { "throughput", ZFS_LOGBIAS_THROUGHPUT }, 326*eda14cbcSMatt Macy { NULL } 327*eda14cbcSMatt Macy }; 328*eda14cbcSMatt Macy 329*eda14cbcSMatt Macy static zprop_index_t canmount_table[] = { 330*eda14cbcSMatt Macy { "off", ZFS_CANMOUNT_OFF }, 331*eda14cbcSMatt Macy { "on", ZFS_CANMOUNT_ON }, 332*eda14cbcSMatt Macy { "noauto", ZFS_CANMOUNT_NOAUTO }, 333*eda14cbcSMatt Macy { NULL } 334*eda14cbcSMatt Macy }; 335*eda14cbcSMatt Macy 336*eda14cbcSMatt Macy static zprop_index_t cache_table[] = { 337*eda14cbcSMatt Macy { "none", ZFS_CACHE_NONE }, 338*eda14cbcSMatt Macy { "metadata", ZFS_CACHE_METADATA }, 339*eda14cbcSMatt Macy { "all", ZFS_CACHE_ALL }, 340*eda14cbcSMatt Macy { NULL } 341*eda14cbcSMatt Macy }; 342*eda14cbcSMatt Macy 343*eda14cbcSMatt Macy static zprop_index_t sync_table[] = { 344*eda14cbcSMatt Macy { "standard", ZFS_SYNC_STANDARD }, 345*eda14cbcSMatt Macy { "always", ZFS_SYNC_ALWAYS }, 346*eda14cbcSMatt Macy { "disabled", ZFS_SYNC_DISABLED }, 347*eda14cbcSMatt Macy { NULL } 348*eda14cbcSMatt Macy }; 349*eda14cbcSMatt Macy 350*eda14cbcSMatt Macy static zprop_index_t xattr_table[] = { 351*eda14cbcSMatt Macy { "off", ZFS_XATTR_OFF }, 352*eda14cbcSMatt Macy { "on", ZFS_XATTR_DIR }, 353*eda14cbcSMatt Macy { "sa", ZFS_XATTR_SA }, 354*eda14cbcSMatt Macy { "dir", ZFS_XATTR_DIR }, 355*eda14cbcSMatt Macy { NULL } 356*eda14cbcSMatt Macy }; 357*eda14cbcSMatt Macy 358*eda14cbcSMatt Macy static zprop_index_t dnsize_table[] = { 359*eda14cbcSMatt Macy { "legacy", ZFS_DNSIZE_LEGACY }, 360*eda14cbcSMatt Macy { "auto", ZFS_DNSIZE_AUTO }, 361*eda14cbcSMatt Macy { "1k", ZFS_DNSIZE_1K }, 362*eda14cbcSMatt Macy { "2k", ZFS_DNSIZE_2K }, 363*eda14cbcSMatt Macy { "4k", ZFS_DNSIZE_4K }, 364*eda14cbcSMatt Macy { "8k", ZFS_DNSIZE_8K }, 365*eda14cbcSMatt Macy { "16k", ZFS_DNSIZE_16K }, 366*eda14cbcSMatt Macy { NULL } 367*eda14cbcSMatt Macy }; 368*eda14cbcSMatt Macy 369*eda14cbcSMatt Macy static zprop_index_t redundant_metadata_table[] = { 370*eda14cbcSMatt Macy { "all", ZFS_REDUNDANT_METADATA_ALL }, 371*eda14cbcSMatt Macy { "most", ZFS_REDUNDANT_METADATA_MOST }, 372*eda14cbcSMatt Macy { NULL } 373*eda14cbcSMatt Macy }; 374*eda14cbcSMatt Macy 375*eda14cbcSMatt Macy static zprop_index_t volmode_table[] = { 376*eda14cbcSMatt Macy { "default", ZFS_VOLMODE_DEFAULT }, 377*eda14cbcSMatt Macy { "full", ZFS_VOLMODE_GEOM }, 378*eda14cbcSMatt Macy { "geom", ZFS_VOLMODE_GEOM }, 379*eda14cbcSMatt Macy { "dev", ZFS_VOLMODE_DEV }, 380*eda14cbcSMatt Macy { "none", ZFS_VOLMODE_NONE }, 381*eda14cbcSMatt Macy { NULL } 382*eda14cbcSMatt Macy }; 383*eda14cbcSMatt Macy 384*eda14cbcSMatt Macy /* inherit index properties */ 385*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_REDUNDANT_METADATA, "redundant_metadata", 386*eda14cbcSMatt Macy ZFS_REDUNDANT_METADATA_ALL, 387*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 388*eda14cbcSMatt Macy "all | most", "REDUND_MD", 389*eda14cbcSMatt Macy redundant_metadata_table); 390*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_SYNC, "sync", ZFS_SYNC_STANDARD, 391*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 392*eda14cbcSMatt Macy "standard | always | disabled", "SYNC", 393*eda14cbcSMatt Macy sync_table); 394*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_CHECKSUM, "checksum", 395*eda14cbcSMatt Macy ZIO_CHECKSUM_DEFAULT, PROP_INHERIT, ZFS_TYPE_FILESYSTEM | 396*eda14cbcSMatt Macy ZFS_TYPE_VOLUME, 397*eda14cbcSMatt Macy #if !defined(__FreeBSD__) 398*eda14cbcSMatt Macy "on | off | fletcher2 | fletcher4 | sha256 | sha512 | skein" 399*eda14cbcSMatt Macy " | edonr", 400*eda14cbcSMatt Macy #else 401*eda14cbcSMatt Macy "on | off | fletcher2 | fletcher4 | sha256 | sha512 | skein", 402*eda14cbcSMatt Macy #endif 403*eda14cbcSMatt Macy "CHECKSUM", checksum_table); 404*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_DEDUP, "dedup", ZIO_CHECKSUM_OFF, 405*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 406*eda14cbcSMatt Macy "on | off | verify | sha256[,verify] | sha512[,verify] | " 407*eda14cbcSMatt Macy #if !defined(__FreeBSD__) 408*eda14cbcSMatt Macy "skein[,verify] | edonr,verify", 409*eda14cbcSMatt Macy #else 410*eda14cbcSMatt Macy "skein[,verify]", 411*eda14cbcSMatt Macy #endif 412*eda14cbcSMatt Macy "DEDUP", dedup_table); 413*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_COMPRESSION, "compression", 414*eda14cbcSMatt Macy ZIO_COMPRESS_DEFAULT, PROP_INHERIT, 415*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 416*eda14cbcSMatt Macy "on | off | lzjb | gzip | gzip-[1-9] | zle | lz4 | " 417*eda14cbcSMatt Macy "zstd | zstd-[1-19] | " 418*eda14cbcSMatt Macy "zstd-fast-[1-10,20,30,40,50,60,70,80,90,100,500,1000]", 419*eda14cbcSMatt Macy "COMPRESS", compress_table); 420*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_SNAPDIR, "snapdir", ZFS_SNAPDIR_HIDDEN, 421*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 422*eda14cbcSMatt Macy "hidden | visible", "SNAPDIR", snapdir_table); 423*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_SNAPDEV, "snapdev", ZFS_SNAPDEV_HIDDEN, 424*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 425*eda14cbcSMatt Macy "hidden | visible", "SNAPDEV", snapdev_table); 426*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_ACLMODE, "aclmode", ZFS_ACL_DISCARD, 427*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 428*eda14cbcSMatt Macy "discard | groupmask | passthrough | restricted", "ACLMODE", 429*eda14cbcSMatt Macy acl_mode_table); 430*eda14cbcSMatt Macy #ifndef __FreeBSD__ 431*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_ACLTYPE, "acltype", ZFS_ACLTYPE_OFF, 432*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 433*eda14cbcSMatt Macy "noacl | posixacl", "ACLTYPE", acltype_table); 434*eda14cbcSMatt Macy #endif 435*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_ACLINHERIT, "aclinherit", 436*eda14cbcSMatt Macy ZFS_ACL_RESTRICTED, PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 437*eda14cbcSMatt Macy "discard | noallow | restricted | passthrough | passthrough-x", 438*eda14cbcSMatt Macy "ACLINHERIT", acl_inherit_table); 439*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_COPIES, "copies", 1, PROP_INHERIT, 440*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 441*eda14cbcSMatt Macy "1 | 2 | 3", "COPIES", copies_table); 442*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_PRIMARYCACHE, "primarycache", 443*eda14cbcSMatt Macy ZFS_CACHE_ALL, PROP_INHERIT, 444*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME, 445*eda14cbcSMatt Macy "all | none | metadata", "PRIMARYCACHE", cache_table); 446*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_SECONDARYCACHE, "secondarycache", 447*eda14cbcSMatt Macy ZFS_CACHE_ALL, PROP_INHERIT, 448*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME, 449*eda14cbcSMatt Macy "all | none | metadata", "SECONDARYCACHE", cache_table); 450*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_LOGBIAS, "logbias", ZFS_LOGBIAS_LATENCY, 451*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 452*eda14cbcSMatt Macy "latency | throughput", "LOGBIAS", logbias_table); 453*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_XATTR, "xattr", ZFS_XATTR_DIR, 454*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 455*eda14cbcSMatt Macy "on | off | dir | sa", "XATTR", xattr_table); 456*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_DNODESIZE, "dnodesize", 457*eda14cbcSMatt Macy ZFS_DNSIZE_LEGACY, PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 458*eda14cbcSMatt Macy "legacy | auto | 1k | 2k | 4k | 8k | 16k", "DNSIZE", dnsize_table); 459*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_VOLMODE, "volmode", 460*eda14cbcSMatt Macy ZFS_VOLMODE_DEFAULT, PROP_INHERIT, 461*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 462*eda14cbcSMatt Macy "default | full | geom | dev | none", "VOLMODE", volmode_table); 463*eda14cbcSMatt Macy 464*eda14cbcSMatt Macy /* inherit index (boolean) properties */ 465*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_ATIME, "atime", 1, PROP_INHERIT, 466*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "on | off", "ATIME", boolean_table); 467*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_RELATIME, "relatime", 0, PROP_INHERIT, 468*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "on | off", "RELATIME", boolean_table); 469*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_DEVICES, "devices", 1, PROP_INHERIT, 470*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "DEVICES", 471*eda14cbcSMatt Macy boolean_table); 472*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_EXEC, "exec", 1, PROP_INHERIT, 473*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "EXEC", 474*eda14cbcSMatt Macy boolean_table); 475*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_SETUID, "setuid", 1, PROP_INHERIT, 476*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "SETUID", 477*eda14cbcSMatt Macy boolean_table); 478*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_READONLY, "readonly", 0, PROP_INHERIT, 479*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "on | off", "RDONLY", 480*eda14cbcSMatt Macy boolean_table); 481*eda14cbcSMatt Macy #ifdef __FreeBSD__ 482*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_ZONED, "jailed", 0, PROP_INHERIT, 483*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "on | off", "JAILED", boolean_table); 484*eda14cbcSMatt Macy #else 485*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_ZONED, "zoned", 0, PROP_INHERIT, 486*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "on | off", "ZONED", boolean_table); 487*eda14cbcSMatt Macy #endif 488*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_VSCAN, "vscan", 0, PROP_INHERIT, 489*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "on | off", "VSCAN", boolean_table); 490*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_NBMAND, "nbmand", 0, PROP_INHERIT, 491*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "NBMAND", 492*eda14cbcSMatt Macy boolean_table); 493*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_OVERLAY, "overlay", 1, PROP_INHERIT, 494*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "on | off", "OVERLAY", boolean_table); 495*eda14cbcSMatt Macy 496*eda14cbcSMatt Macy /* default index properties */ 497*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_VERSION, "version", 0, PROP_DEFAULT, 498*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 499*eda14cbcSMatt Macy "1 | 2 | 3 | 4 | 5 | current", "VERSION", version_table); 500*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_CANMOUNT, "canmount", ZFS_CANMOUNT_ON, 501*eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_FILESYSTEM, "on | off | noauto", 502*eda14cbcSMatt Macy "CANMOUNT", canmount_table); 503*eda14cbcSMatt Macy 504*eda14cbcSMatt Macy /* readonly index properties */ 505*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_MOUNTED, "mounted", 0, PROP_READONLY, 506*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "yes | no", "MOUNTED", boolean_table); 507*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_DEFER_DESTROY, "defer_destroy", 0, 508*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_SNAPSHOT, "yes | no", "DEFER_DESTROY", 509*eda14cbcSMatt Macy boolean_table); 510*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_KEYSTATUS, "keystatus", 511*eda14cbcSMatt Macy ZFS_KEYSTATUS_NONE, PROP_READONLY, ZFS_TYPE_DATASET, 512*eda14cbcSMatt Macy "none | unavailable | available", 513*eda14cbcSMatt Macy "KEYSTATUS", keystatus_table); 514*eda14cbcSMatt Macy 515*eda14cbcSMatt Macy /* set once index properties */ 516*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_NORMALIZE, "normalization", 0, 517*eda14cbcSMatt Macy PROP_ONETIME, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 518*eda14cbcSMatt Macy "none | formC | formD | formKC | formKD", "NORMALIZATION", 519*eda14cbcSMatt Macy normalize_table); 520*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_CASE, "casesensitivity", 521*eda14cbcSMatt Macy ZFS_CASE_SENSITIVE, PROP_ONETIME, ZFS_TYPE_FILESYSTEM | 522*eda14cbcSMatt Macy ZFS_TYPE_SNAPSHOT, 523*eda14cbcSMatt Macy "sensitive | insensitive | mixed", "CASE", case_table); 524*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_KEYFORMAT, "keyformat", 525*eda14cbcSMatt Macy ZFS_KEYFORMAT_NONE, PROP_ONETIME_DEFAULT, 526*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 527*eda14cbcSMatt Macy "none | raw | hex | passphrase", "KEYFORMAT", keyformat_table); 528*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_ENCRYPTION, "encryption", 529*eda14cbcSMatt Macy ZIO_CRYPT_DEFAULT, PROP_ONETIME, ZFS_TYPE_DATASET, 530*eda14cbcSMatt Macy "on | off | aes-128-ccm | aes-192-ccm | aes-256-ccm | " 531*eda14cbcSMatt Macy "aes-128-gcm | aes-192-gcm | aes-256-gcm", "ENCRYPTION", 532*eda14cbcSMatt Macy crypto_table); 533*eda14cbcSMatt Macy 534*eda14cbcSMatt Macy /* set once index (boolean) properties */ 535*eda14cbcSMatt Macy zprop_register_index(ZFS_PROP_UTF8ONLY, "utf8only", 0, PROP_ONETIME, 536*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 537*eda14cbcSMatt Macy "on | off", "UTF8ONLY", boolean_table); 538*eda14cbcSMatt Macy 539*eda14cbcSMatt Macy /* string properties */ 540*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_ORIGIN, "origin", NULL, PROP_READONLY, 541*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<snapshot>", "ORIGIN"); 542*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_CLONES, "clones", NULL, PROP_READONLY, 543*eda14cbcSMatt Macy ZFS_TYPE_SNAPSHOT, "<dataset>[,...]", "CLONES"); 544*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_MOUNTPOINT, "mountpoint", "/", 545*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM, "<path> | legacy | none", 546*eda14cbcSMatt Macy "MOUNTPOINT"); 547*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_SHARENFS, "sharenfs", "off", 548*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM, "on | off | share(1M) options", 549*eda14cbcSMatt Macy "SHARENFS"); 550*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_TYPE, "type", NULL, PROP_READONLY, 551*eda14cbcSMatt Macy ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, 552*eda14cbcSMatt Macy "filesystem | volume | snapshot | bookmark", "TYPE"); 553*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_SHARESMB, "sharesmb", "off", 554*eda14cbcSMatt Macy PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 555*eda14cbcSMatt Macy "on | off | sharemgr(1M) options", "SHARESMB"); 556*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_MLSLABEL, "mlslabel", 557*eda14cbcSMatt Macy ZFS_MLSLABEL_DEFAULT, PROP_INHERIT, ZFS_TYPE_DATASET, 558*eda14cbcSMatt Macy "<sensitivity label>", "MLSLABEL"); 559*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_SELINUX_CONTEXT, "context", 560*eda14cbcSMatt Macy "none", PROP_DEFAULT, ZFS_TYPE_DATASET, "<selinux context>", 561*eda14cbcSMatt Macy "CONTEXT"); 562*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_SELINUX_FSCONTEXT, "fscontext", 563*eda14cbcSMatt Macy "none", PROP_DEFAULT, ZFS_TYPE_DATASET, "<selinux fscontext>", 564*eda14cbcSMatt Macy "FSCONTEXT"); 565*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_SELINUX_DEFCONTEXT, "defcontext", 566*eda14cbcSMatt Macy "none", PROP_DEFAULT, ZFS_TYPE_DATASET, "<selinux defcontext>", 567*eda14cbcSMatt Macy "DEFCONTEXT"); 568*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_SELINUX_ROOTCONTEXT, "rootcontext", 569*eda14cbcSMatt Macy "none", PROP_DEFAULT, ZFS_TYPE_DATASET, "<selinux rootcontext>", 570*eda14cbcSMatt Macy "ROOTCONTEXT"); 571*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_RECEIVE_RESUME_TOKEN, 572*eda14cbcSMatt Macy "receive_resume_token", 573*eda14cbcSMatt Macy NULL, PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 574*eda14cbcSMatt Macy "<string token>", "RESUMETOK"); 575*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_ENCRYPTION_ROOT, "encryptionroot", NULL, 576*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET, "<filesystem | volume>", 577*eda14cbcSMatt Macy "ENCROOT"); 578*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_KEYLOCATION, "keylocation", 579*eda14cbcSMatt Macy "none", PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 580*eda14cbcSMatt Macy "prompt | <file URI>", "KEYLOCATION"); 581*eda14cbcSMatt Macy zprop_register_string(ZFS_PROP_REDACT_SNAPS, 582*eda14cbcSMatt Macy "redact_snaps", NULL, PROP_READONLY, 583*eda14cbcSMatt Macy ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "<snapshot>[,...]", 584*eda14cbcSMatt Macy "RSNAPS"); 585*eda14cbcSMatt Macy 586*eda14cbcSMatt Macy /* readonly number properties */ 587*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_USED, "used", 0, PROP_READONLY, 588*eda14cbcSMatt Macy ZFS_TYPE_DATASET, "<size>", "USED"); 589*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_AVAILABLE, "available", 0, PROP_READONLY, 590*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", "AVAIL"); 591*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_REFERENCED, "referenced", 0, 592*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "<size>", 593*eda14cbcSMatt Macy "REFER"); 594*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_COMPRESSRATIO, "compressratio", 0, 595*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, 596*eda14cbcSMatt Macy "<1.00x or higher if compressed>", "RATIO"); 597*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_REFRATIO, "refcompressratio", 0, 598*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET, 599*eda14cbcSMatt Macy "<1.00x or higher if compressed>", "REFRATIO"); 600*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_VOLBLOCKSIZE, "volblocksize", 601*eda14cbcSMatt Macy ZVOL_DEFAULT_BLOCKSIZE, PROP_ONETIME, 602*eda14cbcSMatt Macy ZFS_TYPE_VOLUME, "512 to 128k, power of 2", "VOLBLOCK"); 603*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_USEDSNAP, "usedbysnapshots", 0, 604*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", 605*eda14cbcSMatt Macy "USEDSNAP"); 606*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_USEDDS, "usedbydataset", 0, 607*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", 608*eda14cbcSMatt Macy "USEDDS"); 609*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_USEDCHILD, "usedbychildren", 0, 610*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", 611*eda14cbcSMatt Macy "USEDCHILD"); 612*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_USEDREFRESERV, "usedbyrefreservation", 0, 613*eda14cbcSMatt Macy PROP_READONLY, 614*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", "USEDREFRESERV"); 615*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_USERREFS, "userrefs", 0, PROP_READONLY, 616*eda14cbcSMatt Macy ZFS_TYPE_SNAPSHOT, "<count>", "USERREFS"); 617*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_WRITTEN, "written", 0, PROP_READONLY, 618*eda14cbcSMatt Macy ZFS_TYPE_DATASET, "<size>", "WRITTEN"); 619*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_LOGICALUSED, "logicalused", 0, 620*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", 621*eda14cbcSMatt Macy "LUSED"); 622*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_LOGICALREFERENCED, "logicalreferenced", 623*eda14cbcSMatt Macy 0, PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "<size>", 624*eda14cbcSMatt Macy "LREFER"); 625*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_FILESYSTEM_COUNT, "filesystem_count", 626*eda14cbcSMatt Macy UINT64_MAX, PROP_READONLY, ZFS_TYPE_FILESYSTEM, 627*eda14cbcSMatt Macy "<count>", "FSCOUNT"); 628*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_SNAPSHOT_COUNT, "snapshot_count", 629*eda14cbcSMatt Macy UINT64_MAX, PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 630*eda14cbcSMatt Macy "<count>", "SSCOUNT"); 631*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_GUID, "guid", 0, PROP_READONLY, 632*eda14cbcSMatt Macy ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "<uint64>", "GUID"); 633*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_CREATETXG, "createtxg", 0, PROP_READONLY, 634*eda14cbcSMatt Macy ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "<uint64>", "CREATETXG"); 635*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_PBKDF2_ITERS, "pbkdf2iters", 636*eda14cbcSMatt Macy 0, PROP_ONETIME_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 637*eda14cbcSMatt Macy "<iters>", "PBKDF2ITERS"); 638*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_OBJSETID, "objsetid", 0, 639*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET, "<uint64>", "OBJSETID"); 640*eda14cbcSMatt Macy 641*eda14cbcSMatt Macy /* default number properties */ 642*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_QUOTA, "quota", 0, PROP_DEFAULT, 643*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "<size> | none", "QUOTA"); 644*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_RESERVATION, "reservation", 0, 645*eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 646*eda14cbcSMatt Macy "<size> | none", "RESERV"); 647*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_VOLSIZE, "volsize", 0, PROP_DEFAULT, 648*eda14cbcSMatt Macy ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME, "<size>", "VOLSIZE"); 649*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_REFQUOTA, "refquota", 0, PROP_DEFAULT, 650*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "<size> | none", "REFQUOTA"); 651*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_REFRESERVATION, "refreservation", 0, 652*eda14cbcSMatt Macy PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 653*eda14cbcSMatt Macy "<size> | none", "REFRESERV"); 654*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_FILESYSTEM_LIMIT, "filesystem_limit", 655*eda14cbcSMatt Macy UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM, 656*eda14cbcSMatt Macy "<count> | none", "FSLIMIT"); 657*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_SNAPSHOT_LIMIT, "snapshot_limit", 658*eda14cbcSMatt Macy UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 659*eda14cbcSMatt Macy "<count> | none", "SSLIMIT"); 660*eda14cbcSMatt Macy 661*eda14cbcSMatt Macy /* inherit number properties */ 662*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_RECORDSIZE, "recordsize", 663*eda14cbcSMatt Macy SPA_OLD_MAXBLOCKSIZE, PROP_INHERIT, 664*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM, "512 to 1M, power of 2", "RECSIZE"); 665*eda14cbcSMatt Macy zprop_register_number(ZFS_PROP_SPECIAL_SMALL_BLOCKS, 666*eda14cbcSMatt Macy "special_small_blocks", 0, PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 667*eda14cbcSMatt Macy "zero or 512 to 1M, power of 2", "SPECIAL_SMALL_BLOCKS"); 668*eda14cbcSMatt Macy 669*eda14cbcSMatt Macy /* hidden properties */ 670*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_NUMCLONES, "numclones", PROP_TYPE_NUMBER, 671*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_SNAPSHOT, "NUMCLONES"); 672*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_NAME, "name", PROP_TYPE_STRING, 673*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "NAME"); 674*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_ISCSIOPTIONS, "iscsioptions", 675*eda14cbcSMatt Macy PROP_TYPE_STRING, PROP_INHERIT, ZFS_TYPE_VOLUME, "ISCSIOPTIONS"); 676*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_STMF_SHAREINFO, "stmf_sbd_lu", 677*eda14cbcSMatt Macy PROP_TYPE_STRING, PROP_INHERIT, ZFS_TYPE_VOLUME, 678*eda14cbcSMatt Macy "STMF_SBD_LU"); 679*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_USERACCOUNTING, "useraccounting", 680*eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_DATASET, 681*eda14cbcSMatt Macy "USERACCOUNTING"); 682*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_UNIQUE, "unique", PROP_TYPE_NUMBER, 683*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET, "UNIQUE"); 684*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_INCONSISTENT, "inconsistent", 685*eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_DATASET, "INCONSISTENT"); 686*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_IVSET_GUID, "ivsetguid", 687*eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_READONLY, 688*eda14cbcSMatt Macy ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "IVSETGUID"); 689*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_PREV_SNAP, "prevsnap", PROP_TYPE_STRING, 690*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "PREVSNAP"); 691*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_PBKDF2_SALT, "pbkdf2salt", 692*eda14cbcSMatt Macy PROP_TYPE_NUMBER, PROP_ONETIME_DEFAULT, 693*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "PBKDF2SALT"); 694*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_KEY_GUID, "keyguid", PROP_TYPE_NUMBER, 695*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET, "KEYGUID"); 696*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_REDACTED, "redacted", PROP_TYPE_NUMBER, 697*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET, "REDACTED"); 698*eda14cbcSMatt Macy 699*eda14cbcSMatt Macy /* 700*eda14cbcSMatt Macy * Properties that are obsolete and not used. These are retained so 701*eda14cbcSMatt Macy * that we don't have to change the values of the zfs_prop_t enum, or 702*eda14cbcSMatt Macy * have NULL pointers in the zfs_prop_table[]. 703*eda14cbcSMatt Macy */ 704*eda14cbcSMatt Macy #ifdef __FreeBSD__ 705*eda14cbcSMatt Macy zprop_register_impl(ZFS_PROP_ACLTYPE, "acltype", PROP_TYPE_INDEX, 706*eda14cbcSMatt Macy ZFS_ACLTYPE_OFF, NULL, PROP_INHERIT, 707*eda14cbcSMatt Macy ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 708*eda14cbcSMatt Macy "noacl | posixacl", "ACLTYPE", B_FALSE, B_FALSE, acltype_table); 709*eda14cbcSMatt Macy #endif 710*eda14cbcSMatt Macy zprop_register_hidden(ZFS_PROP_REMAPTXG, "remaptxg", PROP_TYPE_NUMBER, 711*eda14cbcSMatt Macy PROP_READONLY, ZFS_TYPE_DATASET, "REMAPTXG"); 712*eda14cbcSMatt Macy 713*eda14cbcSMatt Macy /* oddball properties */ 714*eda14cbcSMatt Macy zprop_register_impl(ZFS_PROP_CREATION, "creation", PROP_TYPE_NUMBER, 0, 715*eda14cbcSMatt Macy NULL, PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, 716*eda14cbcSMatt Macy "<date>", "CREATION", B_FALSE, B_TRUE, NULL); 717*eda14cbcSMatt Macy } 718*eda14cbcSMatt Macy 719*eda14cbcSMatt Macy boolean_t 720*eda14cbcSMatt Macy zfs_prop_delegatable(zfs_prop_t prop) 721*eda14cbcSMatt Macy { 722*eda14cbcSMatt Macy zprop_desc_t *pd = &zfs_prop_table[prop]; 723*eda14cbcSMatt Macy 724*eda14cbcSMatt Macy /* The mlslabel property is never delegatable. */ 725*eda14cbcSMatt Macy if (prop == ZFS_PROP_MLSLABEL) 726*eda14cbcSMatt Macy return (B_FALSE); 727*eda14cbcSMatt Macy 728*eda14cbcSMatt Macy return (pd->pd_attr != PROP_READONLY); 729*eda14cbcSMatt Macy } 730*eda14cbcSMatt Macy 731*eda14cbcSMatt Macy /* 732*eda14cbcSMatt Macy * Given a zfs dataset property name, returns the corresponding property ID. 733*eda14cbcSMatt Macy */ 734*eda14cbcSMatt Macy zfs_prop_t 735*eda14cbcSMatt Macy zfs_name_to_prop(const char *propname) 736*eda14cbcSMatt Macy { 737*eda14cbcSMatt Macy return (zprop_name_to_prop(propname, ZFS_TYPE_DATASET)); 738*eda14cbcSMatt Macy } 739*eda14cbcSMatt Macy 740*eda14cbcSMatt Macy /* 741*eda14cbcSMatt Macy * For user property names, we allow all lowercase alphanumeric characters, plus 742*eda14cbcSMatt Macy * a few useful punctuation characters. 743*eda14cbcSMatt Macy */ 744*eda14cbcSMatt Macy static int 745*eda14cbcSMatt Macy valid_char(char c) 746*eda14cbcSMatt Macy { 747*eda14cbcSMatt Macy return ((c >= 'a' && c <= 'z') || 748*eda14cbcSMatt Macy (c >= '0' && c <= '9') || 749*eda14cbcSMatt Macy c == '-' || c == '_' || c == '.' || c == ':'); 750*eda14cbcSMatt Macy } 751*eda14cbcSMatt Macy 752*eda14cbcSMatt Macy /* 753*eda14cbcSMatt Macy * Returns true if this is a valid user-defined property (one with a ':'). 754*eda14cbcSMatt Macy */ 755*eda14cbcSMatt Macy boolean_t 756*eda14cbcSMatt Macy zfs_prop_user(const char *name) 757*eda14cbcSMatt Macy { 758*eda14cbcSMatt Macy int i; 759*eda14cbcSMatt Macy char c; 760*eda14cbcSMatt Macy boolean_t foundsep = B_FALSE; 761*eda14cbcSMatt Macy 762*eda14cbcSMatt Macy for (i = 0; i < strlen(name); i++) { 763*eda14cbcSMatt Macy c = name[i]; 764*eda14cbcSMatt Macy if (!valid_char(c)) 765*eda14cbcSMatt Macy return (B_FALSE); 766*eda14cbcSMatt Macy if (c == ':') 767*eda14cbcSMatt Macy foundsep = B_TRUE; 768*eda14cbcSMatt Macy } 769*eda14cbcSMatt Macy 770*eda14cbcSMatt Macy if (!foundsep) 771*eda14cbcSMatt Macy return (B_FALSE); 772*eda14cbcSMatt Macy 773*eda14cbcSMatt Macy return (B_TRUE); 774*eda14cbcSMatt Macy } 775*eda14cbcSMatt Macy 776*eda14cbcSMatt Macy /* 777*eda14cbcSMatt Macy * Returns true if this is a valid userspace-type property (one with a '@'). 778*eda14cbcSMatt Macy * Note that after the @, any character is valid (eg, another @, for SID 779*eda14cbcSMatt Macy * user@domain). 780*eda14cbcSMatt Macy */ 781*eda14cbcSMatt Macy boolean_t 782*eda14cbcSMatt Macy zfs_prop_userquota(const char *name) 783*eda14cbcSMatt Macy { 784*eda14cbcSMatt Macy zfs_userquota_prop_t prop; 785*eda14cbcSMatt Macy 786*eda14cbcSMatt Macy for (prop = 0; prop < ZFS_NUM_USERQUOTA_PROPS; prop++) { 787*eda14cbcSMatt Macy if (strncmp(name, zfs_userquota_prop_prefixes[prop], 788*eda14cbcSMatt Macy strlen(zfs_userquota_prop_prefixes[prop])) == 0) { 789*eda14cbcSMatt Macy return (B_TRUE); 790*eda14cbcSMatt Macy } 791*eda14cbcSMatt Macy } 792*eda14cbcSMatt Macy 793*eda14cbcSMatt Macy return (B_FALSE); 794*eda14cbcSMatt Macy } 795*eda14cbcSMatt Macy 796*eda14cbcSMatt Macy /* 797*eda14cbcSMatt Macy * Returns true if this is a valid written@ property. 798*eda14cbcSMatt Macy * Note that after the @, any character is valid (eg, another @, for 799*eda14cbcSMatt Macy * written@pool/fs@origin). 800*eda14cbcSMatt Macy */ 801*eda14cbcSMatt Macy boolean_t 802*eda14cbcSMatt Macy zfs_prop_written(const char *name) 803*eda14cbcSMatt Macy { 804*eda14cbcSMatt Macy static const char *prop_prefix = "written@"; 805*eda14cbcSMatt Macy static const char *book_prefix = "written#"; 806*eda14cbcSMatt Macy return (strncmp(name, prop_prefix, strlen(prop_prefix)) == 0 || 807*eda14cbcSMatt Macy strncmp(name, book_prefix, strlen(book_prefix)) == 0); 808*eda14cbcSMatt Macy } 809*eda14cbcSMatt Macy 810*eda14cbcSMatt Macy /* 811*eda14cbcSMatt Macy * Tables of index types, plus functions to convert between the user view 812*eda14cbcSMatt Macy * (strings) and internal representation (uint64_t). 813*eda14cbcSMatt Macy */ 814*eda14cbcSMatt Macy int 815*eda14cbcSMatt Macy zfs_prop_string_to_index(zfs_prop_t prop, const char *string, uint64_t *index) 816*eda14cbcSMatt Macy { 817*eda14cbcSMatt Macy return (zprop_string_to_index(prop, string, index, ZFS_TYPE_DATASET)); 818*eda14cbcSMatt Macy } 819*eda14cbcSMatt Macy 820*eda14cbcSMatt Macy int 821*eda14cbcSMatt Macy zfs_prop_index_to_string(zfs_prop_t prop, uint64_t index, const char **string) 822*eda14cbcSMatt Macy { 823*eda14cbcSMatt Macy return (zprop_index_to_string(prop, index, string, ZFS_TYPE_DATASET)); 824*eda14cbcSMatt Macy } 825*eda14cbcSMatt Macy 826*eda14cbcSMatt Macy uint64_t 827*eda14cbcSMatt Macy zfs_prop_random_value(zfs_prop_t prop, uint64_t seed) 828*eda14cbcSMatt Macy { 829*eda14cbcSMatt Macy return (zprop_random_value(prop, seed, ZFS_TYPE_DATASET)); 830*eda14cbcSMatt Macy } 831*eda14cbcSMatt Macy 832*eda14cbcSMatt Macy /* 833*eda14cbcSMatt Macy * Returns TRUE if the property applies to any of the given dataset types. 834*eda14cbcSMatt Macy */ 835*eda14cbcSMatt Macy boolean_t 836*eda14cbcSMatt Macy zfs_prop_valid_for_type(int prop, zfs_type_t types, boolean_t headcheck) 837*eda14cbcSMatt Macy { 838*eda14cbcSMatt Macy return (zprop_valid_for_type(prop, types, headcheck)); 839*eda14cbcSMatt Macy } 840*eda14cbcSMatt Macy 841*eda14cbcSMatt Macy zprop_type_t 842*eda14cbcSMatt Macy zfs_prop_get_type(zfs_prop_t prop) 843*eda14cbcSMatt Macy { 844*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_proptype); 845*eda14cbcSMatt Macy } 846*eda14cbcSMatt Macy 847*eda14cbcSMatt Macy /* 848*eda14cbcSMatt Macy * Returns TRUE if the property is readonly. 849*eda14cbcSMatt Macy */ 850*eda14cbcSMatt Macy boolean_t 851*eda14cbcSMatt Macy zfs_prop_readonly(zfs_prop_t prop) 852*eda14cbcSMatt Macy { 853*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_attr == PROP_READONLY || 854*eda14cbcSMatt Macy zfs_prop_table[prop].pd_attr == PROP_ONETIME || 855*eda14cbcSMatt Macy zfs_prop_table[prop].pd_attr == PROP_ONETIME_DEFAULT); 856*eda14cbcSMatt Macy } 857*eda14cbcSMatt Macy 858*eda14cbcSMatt Macy /* 859*eda14cbcSMatt Macy * Returns TRUE if the property is visible (not hidden). 860*eda14cbcSMatt Macy */ 861*eda14cbcSMatt Macy boolean_t 862*eda14cbcSMatt Macy zfs_prop_visible(zfs_prop_t prop) 863*eda14cbcSMatt Macy { 864*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_visible && 865*eda14cbcSMatt Macy zfs_prop_table[prop].pd_zfs_mod_supported); 866*eda14cbcSMatt Macy } 867*eda14cbcSMatt Macy 868*eda14cbcSMatt Macy /* 869*eda14cbcSMatt Macy * Returns TRUE if the property is only allowed to be set once. 870*eda14cbcSMatt Macy */ 871*eda14cbcSMatt Macy boolean_t 872*eda14cbcSMatt Macy zfs_prop_setonce(zfs_prop_t prop) 873*eda14cbcSMatt Macy { 874*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_attr == PROP_ONETIME || 875*eda14cbcSMatt Macy zfs_prop_table[prop].pd_attr == PROP_ONETIME_DEFAULT); 876*eda14cbcSMatt Macy } 877*eda14cbcSMatt Macy 878*eda14cbcSMatt Macy const char * 879*eda14cbcSMatt Macy zfs_prop_default_string(zfs_prop_t prop) 880*eda14cbcSMatt Macy { 881*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_strdefault); 882*eda14cbcSMatt Macy } 883*eda14cbcSMatt Macy 884*eda14cbcSMatt Macy uint64_t 885*eda14cbcSMatt Macy zfs_prop_default_numeric(zfs_prop_t prop) 886*eda14cbcSMatt Macy { 887*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_numdefault); 888*eda14cbcSMatt Macy } 889*eda14cbcSMatt Macy 890*eda14cbcSMatt Macy /* 891*eda14cbcSMatt Macy * Given a dataset property ID, returns the corresponding name. 892*eda14cbcSMatt Macy * Assuming the zfs dataset property ID is valid. 893*eda14cbcSMatt Macy */ 894*eda14cbcSMatt Macy const char * 895*eda14cbcSMatt Macy zfs_prop_to_name(zfs_prop_t prop) 896*eda14cbcSMatt Macy { 897*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_name); 898*eda14cbcSMatt Macy } 899*eda14cbcSMatt Macy 900*eda14cbcSMatt Macy /* 901*eda14cbcSMatt Macy * Returns TRUE if the property is inheritable. 902*eda14cbcSMatt Macy */ 903*eda14cbcSMatt Macy boolean_t 904*eda14cbcSMatt Macy zfs_prop_inheritable(zfs_prop_t prop) 905*eda14cbcSMatt Macy { 906*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_attr == PROP_INHERIT || 907*eda14cbcSMatt Macy zfs_prop_table[prop].pd_attr == PROP_ONETIME); 908*eda14cbcSMatt Macy } 909*eda14cbcSMatt Macy 910*eda14cbcSMatt Macy /* 911*eda14cbcSMatt Macy * Returns TRUE if property is one of the encryption properties that requires 912*eda14cbcSMatt Macy * a loaded encryption key to modify. 913*eda14cbcSMatt Macy */ 914*eda14cbcSMatt Macy boolean_t 915*eda14cbcSMatt Macy zfs_prop_encryption_key_param(zfs_prop_t prop) 916*eda14cbcSMatt Macy { 917*eda14cbcSMatt Macy /* 918*eda14cbcSMatt Macy * keylocation does not count as an encryption property. It can be 919*eda14cbcSMatt Macy * changed at will without needing the master keys. 920*eda14cbcSMatt Macy */ 921*eda14cbcSMatt Macy return (prop == ZFS_PROP_PBKDF2_SALT || prop == ZFS_PROP_PBKDF2_ITERS || 922*eda14cbcSMatt Macy prop == ZFS_PROP_KEYFORMAT); 923*eda14cbcSMatt Macy } 924*eda14cbcSMatt Macy 925*eda14cbcSMatt Macy /* 926*eda14cbcSMatt Macy * Helper function used by both kernelspace and userspace to check the 927*eda14cbcSMatt Macy * keylocation property. If encrypted is set, the keylocation must be valid 928*eda14cbcSMatt Macy * for an encrypted dataset. 929*eda14cbcSMatt Macy */ 930*eda14cbcSMatt Macy boolean_t 931*eda14cbcSMatt Macy zfs_prop_valid_keylocation(const char *str, boolean_t encrypted) 932*eda14cbcSMatt Macy { 933*eda14cbcSMatt Macy if (strcmp("none", str) == 0) 934*eda14cbcSMatt Macy return (!encrypted); 935*eda14cbcSMatt Macy else if (strcmp("prompt", str) == 0) 936*eda14cbcSMatt Macy return (B_TRUE); 937*eda14cbcSMatt Macy else if (strlen(str) > 8 && strncmp("file:///", str, 8) == 0) 938*eda14cbcSMatt Macy return (B_TRUE); 939*eda14cbcSMatt Macy 940*eda14cbcSMatt Macy return (B_FALSE); 941*eda14cbcSMatt Macy } 942*eda14cbcSMatt Macy 943*eda14cbcSMatt Macy 944*eda14cbcSMatt Macy #ifndef _KERNEL 945*eda14cbcSMatt Macy #include <libzfs.h> 946*eda14cbcSMatt Macy 947*eda14cbcSMatt Macy /* 948*eda14cbcSMatt Macy * Returns a string describing the set of acceptable values for the given 949*eda14cbcSMatt Macy * zfs property, or NULL if it cannot be set. 950*eda14cbcSMatt Macy */ 951*eda14cbcSMatt Macy const char * 952*eda14cbcSMatt Macy zfs_prop_values(zfs_prop_t prop) 953*eda14cbcSMatt Macy { 954*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_values); 955*eda14cbcSMatt Macy } 956*eda14cbcSMatt Macy 957*eda14cbcSMatt Macy /* 958*eda14cbcSMatt Macy * Returns TRUE if this property is a string type. Note that index types 959*eda14cbcSMatt Macy * (compression, checksum) are treated as strings in userland, even though they 960*eda14cbcSMatt Macy * are stored numerically on disk. 961*eda14cbcSMatt Macy */ 962*eda14cbcSMatt Macy int 963*eda14cbcSMatt Macy zfs_prop_is_string(zfs_prop_t prop) 964*eda14cbcSMatt Macy { 965*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_proptype == PROP_TYPE_STRING || 966*eda14cbcSMatt Macy zfs_prop_table[prop].pd_proptype == PROP_TYPE_INDEX); 967*eda14cbcSMatt Macy } 968*eda14cbcSMatt Macy 969*eda14cbcSMatt Macy /* 970*eda14cbcSMatt Macy * Returns the column header for the given property. Used only in 971*eda14cbcSMatt Macy * 'zfs list -o', but centralized here with the other property information. 972*eda14cbcSMatt Macy */ 973*eda14cbcSMatt Macy const char * 974*eda14cbcSMatt Macy zfs_prop_column_name(zfs_prop_t prop) 975*eda14cbcSMatt Macy { 976*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_colname); 977*eda14cbcSMatt Macy } 978*eda14cbcSMatt Macy 979*eda14cbcSMatt Macy /* 980*eda14cbcSMatt Macy * Returns whether the given property should be displayed right-justified for 981*eda14cbcSMatt Macy * 'zfs list'. 982*eda14cbcSMatt Macy */ 983*eda14cbcSMatt Macy boolean_t 984*eda14cbcSMatt Macy zfs_prop_align_right(zfs_prop_t prop) 985*eda14cbcSMatt Macy { 986*eda14cbcSMatt Macy return (zfs_prop_table[prop].pd_rightalign); 987*eda14cbcSMatt Macy } 988*eda14cbcSMatt Macy 989*eda14cbcSMatt Macy #endif 990*eda14cbcSMatt Macy 991*eda14cbcSMatt Macy #if defined(_KERNEL) 992*eda14cbcSMatt Macy 993*eda14cbcSMatt Macy #include <sys/simd.h> 994*eda14cbcSMatt Macy 995*eda14cbcSMatt Macy #if defined(HAVE_KERNEL_FPU_INTERNAL) 996*eda14cbcSMatt Macy union fpregs_state **zfs_kfpu_fpregs; 997*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_kfpu_fpregs); 998*eda14cbcSMatt Macy #endif /* HAVE_KERNEL_FPU_INTERNAL */ 999*eda14cbcSMatt Macy 1000*eda14cbcSMatt Macy static int __init 1001*eda14cbcSMatt Macy zcommon_init(void) 1002*eda14cbcSMatt Macy { 1003*eda14cbcSMatt Macy int error = kfpu_init(); 1004*eda14cbcSMatt Macy if (error) 1005*eda14cbcSMatt Macy return (error); 1006*eda14cbcSMatt Macy 1007*eda14cbcSMatt Macy fletcher_4_init(); 1008*eda14cbcSMatt Macy 1009*eda14cbcSMatt Macy return (0); 1010*eda14cbcSMatt Macy } 1011*eda14cbcSMatt Macy 1012*eda14cbcSMatt Macy static void __exit 1013*eda14cbcSMatt Macy zcommon_fini(void) 1014*eda14cbcSMatt Macy { 1015*eda14cbcSMatt Macy fletcher_4_fini(); 1016*eda14cbcSMatt Macy kfpu_fini(); 1017*eda14cbcSMatt Macy } 1018*eda14cbcSMatt Macy 1019*eda14cbcSMatt Macy module_init(zcommon_init); 1020*eda14cbcSMatt Macy module_exit(zcommon_fini); 1021*eda14cbcSMatt Macy 1022*eda14cbcSMatt Macy #endif 1023*eda14cbcSMatt Macy 1024*eda14cbcSMatt Macy ZFS_MODULE_DESCRIPTION("Generic ZFS support"); 1025*eda14cbcSMatt Macy ZFS_MODULE_AUTHOR(ZFS_META_AUTHOR); 1026*eda14cbcSMatt Macy ZFS_MODULE_LICENSE(ZFS_META_LICENSE); 1027*eda14cbcSMatt Macy ZFS_MODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE); 1028*eda14cbcSMatt Macy 1029*eda14cbcSMatt Macy /* zfs dataset property functions */ 1030*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_userquota_prop_prefixes); 1031*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_init); 1032*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_get_type); 1033*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_get_table); 1034*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_delegatable); 1035*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_visible); 1036*eda14cbcSMatt Macy 1037*eda14cbcSMatt Macy /* Dataset property functions shared between libzfs and kernel. */ 1038*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_default_string); 1039*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_default_numeric); 1040*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_readonly); 1041*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_inheritable); 1042*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_encryption_key_param); 1043*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_valid_keylocation); 1044*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_setonce); 1045*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_to_name); 1046*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_name_to_prop); 1047*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_user); 1048*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_userquota); 1049*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_index_to_string); 1050*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_string_to_index); 1051*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_valid_for_type); 1052*eda14cbcSMatt Macy EXPORT_SYMBOL(zfs_prop_written); 1053