1 1.1 haad /* 2 1.1 haad * CDDL HEADER START 3 1.1 haad * 4 1.1 haad * The contents of this file are subject to the terms of the 5 1.1 haad * Common Development and Distribution License (the "License"). 6 1.1 haad * You may not use this file except in compliance with the License. 7 1.1 haad * 8 1.1 haad * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 1.1 haad * or http://www.opensolaris.org/os/licensing. 10 1.1 haad * See the License for the specific language governing permissions 11 1.1 haad * and limitations under the License. 12 1.1 haad * 13 1.1 haad * When distributing Covered Code, include this CDDL HEADER in each 14 1.1 haad * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 1.1 haad * If applicable, add the following below this CDDL HEADER, with the 16 1.1 haad * fields enclosed by brackets "[]" replaced with your own identifying 17 1.1 haad * information: Portions Copyright [yyyy] [name of copyright owner] 18 1.1 haad * 19 1.1 haad * CDDL HEADER END 20 1.1 haad */ 21 1.1 haad /* 22 1.2 chs * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 23 1.2 chs * Copyright (c) 2011, 2014 by Delphix. All rights reserved. 24 1.2 chs * Copyright (c) 2013 by Saso Kiselkov. All rights reserved. 25 1.2 chs * Copyright (c) 2013, Joyent, Inc. All rights reserved. 26 1.2 chs * Copyright (c) 2014 Integros [integros.com] 27 1.1 haad */ 28 1.1 haad 29 1.2 chs /* Portions Copyright 2010 Robert Milkowski */ 30 1.2 chs 31 1.1 haad #include <sys/zio.h> 32 1.1 haad #include <sys/spa.h> 33 1.1 haad #include <sys/u8_textprep.h> 34 1.1 haad #include <sys/zfs_acl.h> 35 1.1 haad #include <sys/zfs_ioctl.h> 36 1.1 haad #include <sys/zfs_znode.h> 37 1.1 haad 38 1.1 haad #include "zfs_prop.h" 39 1.1 haad #include "zfs_deleg.h" 40 1.1 haad 41 1.1 haad #if defined(_KERNEL) 42 1.1 haad #include <sys/systm.h> 43 1.1 haad #else 44 1.1 haad #include <stdlib.h> 45 1.1 haad #include <string.h> 46 1.1 haad #include <ctype.h> 47 1.1 haad #endif 48 1.1 haad 49 1.1 haad static zprop_desc_t zfs_prop_table[ZFS_NUM_PROPS]; 50 1.1 haad 51 1.2 chs /* Note this is indexed by zfs_userquota_prop_t, keep the order the same */ 52 1.2 chs const char *zfs_userquota_prop_prefixes[] = { 53 1.2 chs "userused@", 54 1.2 chs "userquota@", 55 1.2 chs "groupused@", 56 1.2 chs "groupquota@" 57 1.2 chs }; 58 1.2 chs 59 1.1 haad zprop_desc_t * 60 1.1 haad zfs_prop_get_table(void) 61 1.1 haad { 62 1.1 haad return (zfs_prop_table); 63 1.1 haad } 64 1.1 haad 65 1.1 haad void 66 1.1 haad zfs_prop_init(void) 67 1.1 haad { 68 1.1 haad static zprop_index_t checksum_table[] = { 69 1.1 haad { "on", ZIO_CHECKSUM_ON }, 70 1.1 haad { "off", ZIO_CHECKSUM_OFF }, 71 1.1 haad { "fletcher2", ZIO_CHECKSUM_FLETCHER_2 }, 72 1.1 haad { "fletcher4", ZIO_CHECKSUM_FLETCHER_4 }, 73 1.1 haad { "sha256", ZIO_CHECKSUM_SHA256 }, 74 1.2 chs { "noparity", ZIO_CHECKSUM_NOPARITY }, 75 1.2 chs #ifndef __NetBSD__ 76 1.2 chs { "sha512", ZIO_CHECKSUM_SHA512 }, 77 1.2 chs { "skein", ZIO_CHECKSUM_SKEIN }, 78 1.2 chs #endif 79 1.2 chs #ifdef illumos 80 1.2 chs { "edonr", ZIO_CHECKSUM_EDONR }, 81 1.2 chs #endif 82 1.2 chs { NULL } 83 1.2 chs }; 84 1.2 chs 85 1.2 chs static zprop_index_t dedup_table[] = { 86 1.2 chs { "on", ZIO_CHECKSUM_ON }, 87 1.2 chs { "off", ZIO_CHECKSUM_OFF }, 88 1.2 chs { "verify", ZIO_CHECKSUM_ON | ZIO_CHECKSUM_VERIFY }, 89 1.2 chs { "sha256", ZIO_CHECKSUM_SHA256 }, 90 1.2 chs { "sha256,verify", 91 1.2 chs ZIO_CHECKSUM_SHA256 | ZIO_CHECKSUM_VERIFY }, 92 1.2 chs #ifndef __NetBSD__ 93 1.2 chs { "sha512", ZIO_CHECKSUM_SHA512 }, 94 1.2 chs { "sha512,verify", 95 1.2 chs ZIO_CHECKSUM_SHA512 | ZIO_CHECKSUM_VERIFY }, 96 1.2 chs { "skein", ZIO_CHECKSUM_SKEIN }, 97 1.2 chs { "skein,verify", 98 1.2 chs ZIO_CHECKSUM_SKEIN | ZIO_CHECKSUM_VERIFY }, 99 1.2 chs #endif 100 1.2 chs #ifdef illumos 101 1.2 chs { "edonr,verify", 102 1.2 chs ZIO_CHECKSUM_EDONR | ZIO_CHECKSUM_VERIFY }, 103 1.2 chs #endif 104 1.1 haad { NULL } 105 1.1 haad }; 106 1.1 haad 107 1.1 haad static zprop_index_t compress_table[] = { 108 1.1 haad { "on", ZIO_COMPRESS_ON }, 109 1.1 haad { "off", ZIO_COMPRESS_OFF }, 110 1.1 haad { "lzjb", ZIO_COMPRESS_LZJB }, 111 1.1 haad { "gzip", ZIO_COMPRESS_GZIP_6 }, /* gzip default */ 112 1.1 haad { "gzip-1", ZIO_COMPRESS_GZIP_1 }, 113 1.1 haad { "gzip-2", ZIO_COMPRESS_GZIP_2 }, 114 1.1 haad { "gzip-3", ZIO_COMPRESS_GZIP_3 }, 115 1.1 haad { "gzip-4", ZIO_COMPRESS_GZIP_4 }, 116 1.1 haad { "gzip-5", ZIO_COMPRESS_GZIP_5 }, 117 1.1 haad { "gzip-6", ZIO_COMPRESS_GZIP_6 }, 118 1.1 haad { "gzip-7", ZIO_COMPRESS_GZIP_7 }, 119 1.1 haad { "gzip-8", ZIO_COMPRESS_GZIP_8 }, 120 1.1 haad { "gzip-9", ZIO_COMPRESS_GZIP_9 }, 121 1.2 chs { "zle", ZIO_COMPRESS_ZLE }, 122 1.2 chs { "lz4", ZIO_COMPRESS_LZ4 }, 123 1.1 haad { NULL } 124 1.1 haad }; 125 1.1 haad 126 1.1 haad static zprop_index_t snapdir_table[] = { 127 1.1 haad { "hidden", ZFS_SNAPDIR_HIDDEN }, 128 1.1 haad { "visible", ZFS_SNAPDIR_VISIBLE }, 129 1.1 haad { NULL } 130 1.1 haad }; 131 1.1 haad 132 1.1 haad static zprop_index_t acl_mode_table[] = { 133 1.1 haad { "discard", ZFS_ACL_DISCARD }, 134 1.1 haad { "groupmask", ZFS_ACL_GROUPMASK }, 135 1.1 haad { "passthrough", ZFS_ACL_PASSTHROUGH }, 136 1.2 chs { "restricted", ZFS_ACL_RESTRICTED }, 137 1.1 haad { NULL } 138 1.1 haad }; 139 1.1 haad 140 1.1 haad static zprop_index_t acl_inherit_table[] = { 141 1.1 haad { "discard", ZFS_ACL_DISCARD }, 142 1.1 haad { "noallow", ZFS_ACL_NOALLOW }, 143 1.1 haad { "restricted", ZFS_ACL_RESTRICTED }, 144 1.1 haad { "passthrough", ZFS_ACL_PASSTHROUGH }, 145 1.1 haad { "secure", ZFS_ACL_RESTRICTED }, /* bkwrd compatability */ 146 1.1 haad { "passthrough-x", ZFS_ACL_PASSTHROUGH_X }, 147 1.1 haad { NULL } 148 1.1 haad }; 149 1.1 haad 150 1.1 haad static zprop_index_t case_table[] = { 151 1.1 haad { "sensitive", ZFS_CASE_SENSITIVE }, 152 1.1 haad { "insensitive", ZFS_CASE_INSENSITIVE }, 153 1.1 haad { "mixed", ZFS_CASE_MIXED }, 154 1.1 haad { NULL } 155 1.1 haad }; 156 1.1 haad 157 1.1 haad static zprop_index_t copies_table[] = { 158 1.1 haad { "1", 1 }, 159 1.1 haad { "2", 2 }, 160 1.1 haad { "3", 3 }, 161 1.1 haad { NULL } 162 1.1 haad }; 163 1.1 haad 164 1.1 haad /* 165 1.1 haad * Use the unique flags we have to send to u8_strcmp() and/or 166 1.1 haad * u8_textprep() to represent the various normalization property 167 1.1 haad * values. 168 1.1 haad */ 169 1.1 haad static zprop_index_t normalize_table[] = { 170 1.1 haad { "none", 0 }, 171 1.1 haad { "formD", U8_TEXTPREP_NFD }, 172 1.1 haad { "formKC", U8_TEXTPREP_NFKC }, 173 1.1 haad { "formC", U8_TEXTPREP_NFC }, 174 1.1 haad { "formKD", U8_TEXTPREP_NFKD }, 175 1.1 haad { NULL } 176 1.1 haad }; 177 1.1 haad 178 1.1 haad static zprop_index_t version_table[] = { 179 1.1 haad { "1", 1 }, 180 1.1 haad { "2", 2 }, 181 1.1 haad { "3", 3 }, 182 1.2 chs { "4", 4 }, 183 1.2 chs { "5", 5 }, 184 1.1 haad { "current", ZPL_VERSION }, 185 1.1 haad { NULL } 186 1.1 haad }; 187 1.1 haad 188 1.1 haad static zprop_index_t boolean_table[] = { 189 1.1 haad { "off", 0 }, 190 1.1 haad { "on", 1 }, 191 1.1 haad { NULL } 192 1.1 haad }; 193 1.1 haad 194 1.2 chs static zprop_index_t logbias_table[] = { 195 1.2 chs { "latency", ZFS_LOGBIAS_LATENCY }, 196 1.2 chs { "throughput", ZFS_LOGBIAS_THROUGHPUT }, 197 1.2 chs { NULL } 198 1.2 chs }; 199 1.2 chs 200 1.1 haad static zprop_index_t canmount_table[] = { 201 1.1 haad { "off", ZFS_CANMOUNT_OFF }, 202 1.1 haad { "on", ZFS_CANMOUNT_ON }, 203 1.1 haad { "noauto", ZFS_CANMOUNT_NOAUTO }, 204 1.1 haad { NULL } 205 1.1 haad }; 206 1.1 haad 207 1.1 haad static zprop_index_t cache_table[] = { 208 1.1 haad { "none", ZFS_CACHE_NONE }, 209 1.1 haad { "metadata", ZFS_CACHE_METADATA }, 210 1.1 haad { "all", ZFS_CACHE_ALL }, 211 1.1 haad { NULL } 212 1.1 haad }; 213 1.1 haad 214 1.2 chs static zprop_index_t sync_table[] = { 215 1.2 chs { "standard", ZFS_SYNC_STANDARD }, 216 1.2 chs { "always", ZFS_SYNC_ALWAYS }, 217 1.2 chs { "disabled", ZFS_SYNC_DISABLED }, 218 1.2 chs { NULL } 219 1.2 chs }; 220 1.2 chs 221 1.2 chs static zprop_index_t volmode_table[] = { 222 1.2 chs { "default", ZFS_VOLMODE_DEFAULT }, 223 1.2 chs { "geom", ZFS_VOLMODE_GEOM }, 224 1.2 chs { "dev", ZFS_VOLMODE_DEV }, 225 1.2 chs { "none", ZFS_VOLMODE_NONE }, 226 1.2 chs { NULL } 227 1.2 chs }; 228 1.2 chs 229 1.2 chs static zprop_index_t redundant_metadata_table[] = { 230 1.2 chs { "all", ZFS_REDUNDANT_METADATA_ALL }, 231 1.2 chs { "most", ZFS_REDUNDANT_METADATA_MOST }, 232 1.2 chs { NULL } 233 1.2 chs }; 234 1.2 chs 235 1.1 haad /* inherit index properties */ 236 1.2 chs zprop_register_index(ZFS_PROP_REDUNDANT_METADATA, "redundant_metadata", 237 1.2 chs ZFS_REDUNDANT_METADATA_ALL, 238 1.2 chs PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 239 1.2 chs "all | most", "REDUND_MD", 240 1.2 chs redundant_metadata_table); 241 1.2 chs zprop_register_index(ZFS_PROP_SYNC, "sync", ZFS_SYNC_STANDARD, 242 1.1 haad PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 243 1.2 chs "standard | always | disabled", "SYNC", 244 1.2 chs sync_table); 245 1.2 chs zprop_register_index(ZFS_PROP_CHECKSUM, "checksum", 246 1.2 chs ZIO_CHECKSUM_DEFAULT, PROP_INHERIT, ZFS_TYPE_FILESYSTEM | 247 1.2 chs ZFS_TYPE_VOLUME, 248 1.2 chs "on | off | fletcher2 | fletcher4 | sha256 | sha512 | " 249 1.2 chs "skein | edonr", "CHECKSUM", checksum_table); 250 1.2 chs zprop_register_index(ZFS_PROP_DEDUP, "dedup", ZIO_CHECKSUM_OFF, 251 1.2 chs PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 252 1.2 chs "on | off | verify | sha256[,verify], sha512[,verify], " 253 1.2 chs "skein[,verify], edonr,verify", "DEDUP", dedup_table); 254 1.2 chs zprop_register_index(ZFS_PROP_COMPRESSION, "compression", 255 1.1 haad ZIO_COMPRESS_DEFAULT, PROP_INHERIT, 256 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 257 1.2 chs "on | off | lzjb | gzip | gzip-[1-9] | zle | lz4", 258 1.2 chs "COMPRESS", compress_table); 259 1.2 chs zprop_register_index(ZFS_PROP_SNAPDIR, "snapdir", ZFS_SNAPDIR_HIDDEN, 260 1.1 haad PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 261 1.1 haad "hidden | visible", "SNAPDIR", snapdir_table); 262 1.2 chs zprop_register_index(ZFS_PROP_ACLMODE, "aclmode", ZFS_ACL_DISCARD, 263 1.1 haad PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 264 1.2 chs "discard | groupmask | passthrough | restricted", "ACLMODE", 265 1.2 chs acl_mode_table); 266 1.2 chs zprop_register_index(ZFS_PROP_ACLINHERIT, "aclinherit", 267 1.2 chs ZFS_ACL_RESTRICTED, PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 268 1.1 haad "discard | noallow | restricted | passthrough | passthrough-x", 269 1.1 haad "ACLINHERIT", acl_inherit_table); 270 1.2 chs zprop_register_index(ZFS_PROP_COPIES, "copies", 1, PROP_INHERIT, 271 1.2 chs ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 272 1.1 haad "1 | 2 | 3", "COPIES", copies_table); 273 1.2 chs zprop_register_index(ZFS_PROP_PRIMARYCACHE, "primarycache", 274 1.1 haad ZFS_CACHE_ALL, PROP_INHERIT, 275 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME, 276 1.1 haad "all | none | metadata", "PRIMARYCACHE", cache_table); 277 1.2 chs zprop_register_index(ZFS_PROP_SECONDARYCACHE, "secondarycache", 278 1.1 haad ZFS_CACHE_ALL, PROP_INHERIT, 279 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME, 280 1.1 haad "all | none | metadata", "SECONDARYCACHE", cache_table); 281 1.2 chs zprop_register_index(ZFS_PROP_LOGBIAS, "logbias", ZFS_LOGBIAS_LATENCY, 282 1.2 chs PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 283 1.2 chs "latency | throughput", "LOGBIAS", logbias_table); 284 1.2 chs zprop_register_index(ZFS_PROP_VOLMODE, "volmode", 285 1.2 chs ZFS_VOLMODE_DEFAULT, PROP_INHERIT, 286 1.2 chs ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME, 287 1.2 chs "default | geom | dev | none", "VOLMODE", volmode_table); 288 1.1 haad 289 1.1 haad /* inherit index (boolean) properties */ 290 1.2 chs zprop_register_index(ZFS_PROP_ATIME, "atime", 1, PROP_INHERIT, 291 1.1 haad ZFS_TYPE_FILESYSTEM, "on | off", "ATIME", boolean_table); 292 1.2 chs zprop_register_index(ZFS_PROP_DEVICES, "devices", 1, PROP_INHERIT, 293 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "DEVICES", 294 1.1 haad boolean_table); 295 1.2 chs zprop_register_index(ZFS_PROP_EXEC, "exec", 1, PROP_INHERIT, 296 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "EXEC", 297 1.1 haad boolean_table); 298 1.2 chs zprop_register_index(ZFS_PROP_SETUID, "setuid", 1, PROP_INHERIT, 299 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "SETUID", 300 1.1 haad boolean_table); 301 1.2 chs zprop_register_index(ZFS_PROP_READONLY, "readonly", 0, PROP_INHERIT, 302 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "on | off", "RDONLY", 303 1.1 haad boolean_table); 304 1.2 chs zprop_register_index(ZFS_PROP_ZONED, "jailed", 0, PROP_INHERIT, 305 1.2 chs ZFS_TYPE_FILESYSTEM, "on | off", "JAILED", boolean_table); 306 1.2 chs zprop_register_index(ZFS_PROP_XATTR, "xattr", 1, PROP_INHERIT, 307 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "XATTR", 308 1.1 haad boolean_table); 309 1.2 chs zprop_register_index(ZFS_PROP_VSCAN, "vscan", 0, PROP_INHERIT, 310 1.1 haad ZFS_TYPE_FILESYSTEM, "on | off", "VSCAN", 311 1.1 haad boolean_table); 312 1.2 chs zprop_register_index(ZFS_PROP_NBMAND, "nbmand", 0, PROP_INHERIT, 313 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "NBMAND", 314 1.1 haad boolean_table); 315 1.1 haad 316 1.1 haad /* default index properties */ 317 1.2 chs zprop_register_index(ZFS_PROP_VERSION, "version", 0, PROP_DEFAULT, 318 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 319 1.2 chs "1 | 2 | 3 | 4 | 5 | current", "VERSION", version_table); 320 1.2 chs zprop_register_index(ZFS_PROP_CANMOUNT, "canmount", ZFS_CANMOUNT_ON, 321 1.1 haad PROP_DEFAULT, ZFS_TYPE_FILESYSTEM, "on | off | noauto", 322 1.1 haad "CANMOUNT", canmount_table); 323 1.1 haad 324 1.1 haad /* readonly index (boolean) properties */ 325 1.2 chs zprop_register_index(ZFS_PROP_MOUNTED, "mounted", 0, PROP_READONLY, 326 1.1 haad ZFS_TYPE_FILESYSTEM, "yes | no", "MOUNTED", boolean_table); 327 1.2 chs zprop_register_index(ZFS_PROP_DEFER_DESTROY, "defer_destroy", 0, 328 1.2 chs PROP_READONLY, ZFS_TYPE_SNAPSHOT, "yes | no", "DEFER_DESTROY", 329 1.2 chs boolean_table); 330 1.1 haad 331 1.1 haad /* set once index properties */ 332 1.2 chs zprop_register_index(ZFS_PROP_NORMALIZE, "normalization", 0, 333 1.1 haad PROP_ONETIME, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 334 1.1 haad "none | formC | formD | formKC | formKD", "NORMALIZATION", 335 1.1 haad normalize_table); 336 1.2 chs zprop_register_index(ZFS_PROP_CASE, "casesensitivity", 337 1.2 chs ZFS_CASE_SENSITIVE, PROP_ONETIME, ZFS_TYPE_FILESYSTEM | 338 1.2 chs ZFS_TYPE_SNAPSHOT, 339 1.1 haad "sensitive | insensitive | mixed", "CASE", case_table); 340 1.1 haad 341 1.1 haad /* set once index (boolean) properties */ 342 1.2 chs zprop_register_index(ZFS_PROP_UTF8ONLY, "utf8only", 0, PROP_ONETIME, 343 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, 344 1.1 haad "on | off", "UTF8ONLY", boolean_table); 345 1.1 haad 346 1.1 haad /* string properties */ 347 1.2 chs zprop_register_string(ZFS_PROP_ORIGIN, "origin", NULL, PROP_READONLY, 348 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<snapshot>", "ORIGIN"); 349 1.2 chs zprop_register_string(ZFS_PROP_CLONES, "clones", NULL, PROP_READONLY, 350 1.2 chs ZFS_TYPE_SNAPSHOT, "<dataset>[,...]", "CLONES"); 351 1.2 chs zprop_register_string(ZFS_PROP_MOUNTPOINT, "mountpoint", "/", 352 1.2 chs PROP_INHERIT, ZFS_TYPE_FILESYSTEM, "<path> | legacy | none", 353 1.2 chs "MOUNTPOINT"); 354 1.2 chs zprop_register_string(ZFS_PROP_SHARENFS, "sharenfs", "off", 355 1.2 chs PROP_INHERIT, ZFS_TYPE_FILESYSTEM, "on | off | share(1M) options", 356 1.2 chs "SHARENFS"); 357 1.2 chs zprop_register_string(ZFS_PROP_TYPE, "type", NULL, PROP_READONLY, 358 1.2 chs ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, 359 1.2 chs "filesystem | volume | snapshot | bookmark", "TYPE"); 360 1.2 chs zprop_register_string(ZFS_PROP_SHARESMB, "sharesmb", "off", 361 1.2 chs PROP_INHERIT, ZFS_TYPE_FILESYSTEM, 362 1.2 chs "on | off | sharemgr(1M) options", "SHARESMB"); 363 1.2 chs zprop_register_string(ZFS_PROP_MLSLABEL, "mlslabel", 364 1.2 chs ZFS_MLSLABEL_DEFAULT, PROP_INHERIT, ZFS_TYPE_DATASET, 365 1.2 chs "<sensitivity label>", "MLSLABEL"); 366 1.2 chs zprop_register_string(ZFS_PROP_RECEIVE_RESUME_TOKEN, 367 1.2 chs "receive_resume_token", 368 1.2 chs NULL, PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 369 1.2 chs "<string token>", "RESUMETOK"); 370 1.1 haad 371 1.1 haad /* readonly number properties */ 372 1.2 chs zprop_register_number(ZFS_PROP_USED, "used", 0, PROP_READONLY, 373 1.1 haad ZFS_TYPE_DATASET, "<size>", "USED"); 374 1.2 chs zprop_register_number(ZFS_PROP_AVAILABLE, "available", 0, PROP_READONLY, 375 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", "AVAIL"); 376 1.2 chs zprop_register_number(ZFS_PROP_REFERENCED, "referenced", 0, 377 1.2 chs PROP_READONLY, ZFS_TYPE_DATASET, "<size>", "REFER"); 378 1.2 chs zprop_register_number(ZFS_PROP_COMPRESSRATIO, "compressratio", 0, 379 1.1 haad PROP_READONLY, ZFS_TYPE_DATASET, 380 1.1 haad "<1.00x or higher if compressed>", "RATIO"); 381 1.2 chs zprop_register_number(ZFS_PROP_REFRATIO, "refcompressratio", 0, 382 1.2 chs PROP_READONLY, ZFS_TYPE_DATASET, 383 1.2 chs "<1.00x or higher if compressed>", "REFRATIO"); 384 1.2 chs zprop_register_number(ZFS_PROP_VOLBLOCKSIZE, "volblocksize", 385 1.2 chs ZVOL_DEFAULT_BLOCKSIZE, PROP_ONETIME, 386 1.1 haad ZFS_TYPE_VOLUME, "512 to 128k, power of 2", "VOLBLOCK"); 387 1.2 chs zprop_register_number(ZFS_PROP_USEDSNAP, "usedbysnapshots", 0, 388 1.2 chs PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", 389 1.2 chs "USEDSNAP"); 390 1.2 chs zprop_register_number(ZFS_PROP_USEDDS, "usedbydataset", 0, 391 1.2 chs PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", 392 1.2 chs "USEDDS"); 393 1.2 chs zprop_register_number(ZFS_PROP_USEDCHILD, "usedbychildren", 0, 394 1.2 chs PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", 395 1.2 chs "USEDCHILD"); 396 1.2 chs zprop_register_number(ZFS_PROP_USEDREFRESERV, "usedbyrefreservation", 0, 397 1.1 haad PROP_READONLY, 398 1.1 haad ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", "USEDREFRESERV"); 399 1.2 chs zprop_register_number(ZFS_PROP_USERREFS, "userrefs", 0, PROP_READONLY, 400 1.2 chs ZFS_TYPE_SNAPSHOT, "<count>", "USERREFS"); 401 1.2 chs zprop_register_number(ZFS_PROP_WRITTEN, "written", 0, PROP_READONLY, 402 1.2 chs ZFS_TYPE_DATASET, "<size>", "WRITTEN"); 403 1.2 chs zprop_register_number(ZFS_PROP_LOGICALUSED, "logicalused", 0, 404 1.2 chs PROP_READONLY, ZFS_TYPE_DATASET, "<size>", "LUSED"); 405 1.2 chs zprop_register_number(ZFS_PROP_LOGICALREFERENCED, "logicalreferenced", 406 1.2 chs 0, PROP_READONLY, ZFS_TYPE_DATASET, "<size>", "LREFER"); 407 1.1 haad 408 1.1 haad /* default number properties */ 409 1.2 chs zprop_register_number(ZFS_PROP_QUOTA, "quota", 0, PROP_DEFAULT, 410 1.1 haad ZFS_TYPE_FILESYSTEM, "<size> | none", "QUOTA"); 411 1.2 chs zprop_register_number(ZFS_PROP_RESERVATION, "reservation", 0, 412 1.2 chs PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 413 1.2 chs "<size> | none", "RESERV"); 414 1.2 chs zprop_register_number(ZFS_PROP_VOLSIZE, "volsize", 0, PROP_DEFAULT, 415 1.1 haad ZFS_TYPE_VOLUME, "<size>", "VOLSIZE"); 416 1.2 chs zprop_register_number(ZFS_PROP_REFQUOTA, "refquota", 0, PROP_DEFAULT, 417 1.1 haad ZFS_TYPE_FILESYSTEM, "<size> | none", "REFQUOTA"); 418 1.2 chs zprop_register_number(ZFS_PROP_REFRESERVATION, "refreservation", 0, 419 1.1 haad PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 420 1.1 haad "<size> | none", "REFRESERV"); 421 1.2 chs zprop_register_number(ZFS_PROP_FILESYSTEM_LIMIT, "filesystem_limit", 422 1.2 chs UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM, 423 1.2 chs "<count> | none", "FSLIMIT"); 424 1.2 chs zprop_register_number(ZFS_PROP_SNAPSHOT_LIMIT, "snapshot_limit", 425 1.2 chs UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 426 1.2 chs "<count> | none", "SSLIMIT"); 427 1.2 chs zprop_register_number(ZFS_PROP_FILESYSTEM_COUNT, "filesystem_count", 428 1.2 chs UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM, 429 1.2 chs "<count>", "FSCOUNT"); 430 1.2 chs zprop_register_number(ZFS_PROP_SNAPSHOT_COUNT, "snapshot_count", 431 1.2 chs UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, 432 1.2 chs "<count>", "SSCOUNT"); 433 1.1 haad 434 1.1 haad /* inherit number properties */ 435 1.2 chs zprop_register_number(ZFS_PROP_RECORDSIZE, "recordsize", 436 1.2 chs SPA_OLD_MAXBLOCKSIZE, PROP_INHERIT, 437 1.2 chs ZFS_TYPE_FILESYSTEM, "512 to 1M, power of 2", "RECSIZE"); 438 1.1 haad 439 1.1 haad /* hidden properties */ 440 1.2 chs zprop_register_hidden(ZFS_PROP_CREATETXG, "createtxg", PROP_TYPE_NUMBER, 441 1.2 chs PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "CREATETXG"); 442 1.2 chs zprop_register_hidden(ZFS_PROP_NUMCLONES, "numclones", PROP_TYPE_NUMBER, 443 1.2 chs PROP_READONLY, ZFS_TYPE_SNAPSHOT, "NUMCLONES"); 444 1.2 chs zprop_register_hidden(ZFS_PROP_NAME, "name", PROP_TYPE_STRING, 445 1.2 chs PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "NAME"); 446 1.2 chs zprop_register_hidden(ZFS_PROP_ISCSIOPTIONS, "iscsioptions", 447 1.2 chs PROP_TYPE_STRING, PROP_INHERIT, ZFS_TYPE_VOLUME, "ISCSIOPTIONS"); 448 1.2 chs zprop_register_hidden(ZFS_PROP_STMF_SHAREINFO, "stmf_sbd_lu", 449 1.2 chs PROP_TYPE_STRING, PROP_INHERIT, ZFS_TYPE_VOLUME, 450 1.2 chs "STMF_SBD_LU"); 451 1.2 chs zprop_register_hidden(ZFS_PROP_GUID, "guid", PROP_TYPE_NUMBER, 452 1.2 chs PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "GUID"); 453 1.2 chs zprop_register_hidden(ZFS_PROP_USERACCOUNTING, "useraccounting", 454 1.2 chs PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_DATASET, 455 1.2 chs "USERACCOUNTING"); 456 1.2 chs zprop_register_hidden(ZFS_PROP_UNIQUE, "unique", PROP_TYPE_NUMBER, 457 1.2 chs PROP_READONLY, ZFS_TYPE_DATASET, "UNIQUE"); 458 1.2 chs zprop_register_hidden(ZFS_PROP_OBJSETID, "objsetid", PROP_TYPE_NUMBER, 459 1.2 chs PROP_READONLY, ZFS_TYPE_DATASET, "OBJSETID"); 460 1.2 chs zprop_register_hidden(ZFS_PROP_INCONSISTENT, "inconsistent", 461 1.2 chs PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_DATASET, "INCONSISTENT"); 462 1.2 chs zprop_register_hidden(ZFS_PROP_PREV_SNAP, "prevsnap", PROP_TYPE_STRING, 463 1.2 chs PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "PREVSNAP"); 464 1.1 haad 465 1.1 haad /* oddball properties */ 466 1.2 chs zprop_register_impl(ZFS_PROP_CREATION, "creation", PROP_TYPE_NUMBER, 0, 467 1.2 chs NULL, PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, 468 1.1 haad "<date>", "CREATION", B_FALSE, B_TRUE, NULL); 469 1.1 haad } 470 1.1 haad 471 1.1 haad boolean_t 472 1.1 haad zfs_prop_delegatable(zfs_prop_t prop) 473 1.1 haad { 474 1.1 haad zprop_desc_t *pd = &zfs_prop_table[prop]; 475 1.2 chs 476 1.2 chs /* The mlslabel property is never delegatable. */ 477 1.2 chs if (prop == ZFS_PROP_MLSLABEL) 478 1.2 chs return (B_FALSE); 479 1.2 chs 480 1.1 haad return (pd->pd_attr != PROP_READONLY); 481 1.1 haad } 482 1.1 haad 483 1.1 haad /* 484 1.1 haad * Given a zfs dataset property name, returns the corresponding property ID. 485 1.1 haad */ 486 1.1 haad zfs_prop_t 487 1.1 haad zfs_name_to_prop(const char *propname) 488 1.1 haad { 489 1.1 haad return (zprop_name_to_prop(propname, ZFS_TYPE_DATASET)); 490 1.1 haad } 491 1.1 haad 492 1.1 haad /* 493 1.1 haad * For user property names, we allow all lowercase alphanumeric characters, plus 494 1.1 haad * a few useful punctuation characters. 495 1.1 haad */ 496 1.1 haad static int 497 1.1 haad valid_char(char c) 498 1.1 haad { 499 1.1 haad return ((c >= 'a' && c <= 'z') || 500 1.1 haad (c >= '0' && c <= '9') || 501 1.1 haad c == '-' || c == '_' || c == '.' || c == ':'); 502 1.1 haad } 503 1.1 haad 504 1.1 haad /* 505 1.1 haad * Returns true if this is a valid user-defined property (one with a ':'). 506 1.1 haad */ 507 1.1 haad boolean_t 508 1.1 haad zfs_prop_user(const char *name) 509 1.1 haad { 510 1.1 haad int i; 511 1.1 haad char c; 512 1.1 haad boolean_t foundsep = B_FALSE; 513 1.1 haad 514 1.1 haad for (i = 0; i < strlen(name); i++) { 515 1.1 haad c = name[i]; 516 1.1 haad if (!valid_char(c)) 517 1.1 haad return (B_FALSE); 518 1.1 haad if (c == ':') 519 1.1 haad foundsep = B_TRUE; 520 1.1 haad } 521 1.1 haad 522 1.1 haad if (!foundsep) 523 1.1 haad return (B_FALSE); 524 1.1 haad 525 1.1 haad return (B_TRUE); 526 1.1 haad } 527 1.1 haad 528 1.1 haad /* 529 1.2 chs * Returns true if this is a valid userspace-type property (one with a '@'). 530 1.2 chs * Note that after the @, any character is valid (eg, another @, for SID 531 1.2 chs * user@domain). 532 1.2 chs */ 533 1.2 chs boolean_t 534 1.2 chs zfs_prop_userquota(const char *name) 535 1.2 chs { 536 1.2 chs zfs_userquota_prop_t prop; 537 1.2 chs 538 1.2 chs for (prop = 0; prop < ZFS_NUM_USERQUOTA_PROPS; prop++) { 539 1.2 chs if (strncmp(name, zfs_userquota_prop_prefixes[prop], 540 1.2 chs strlen(zfs_userquota_prop_prefixes[prop])) == 0) { 541 1.2 chs return (B_TRUE); 542 1.2 chs } 543 1.2 chs } 544 1.2 chs 545 1.2 chs return (B_FALSE); 546 1.2 chs } 547 1.2 chs 548 1.2 chs /* 549 1.2 chs * Returns true if this is a valid written@ property. 550 1.2 chs * Note that after the @, any character is valid (eg, another @, for 551 1.2 chs * written@pool/fs@origin). 552 1.2 chs */ 553 1.2 chs boolean_t 554 1.2 chs zfs_prop_written(const char *name) 555 1.2 chs { 556 1.2 chs static const char *prefix = "written@"; 557 1.2 chs return (strncmp(name, prefix, strlen(prefix)) == 0); 558 1.2 chs } 559 1.2 chs 560 1.2 chs /* 561 1.1 haad * Tables of index types, plus functions to convert between the user view 562 1.1 haad * (strings) and internal representation (uint64_t). 563 1.1 haad */ 564 1.1 haad int 565 1.1 haad zfs_prop_string_to_index(zfs_prop_t prop, const char *string, uint64_t *index) 566 1.1 haad { 567 1.1 haad return (zprop_string_to_index(prop, string, index, ZFS_TYPE_DATASET)); 568 1.1 haad } 569 1.1 haad 570 1.1 haad int 571 1.1 haad zfs_prop_index_to_string(zfs_prop_t prop, uint64_t index, const char **string) 572 1.1 haad { 573 1.1 haad return (zprop_index_to_string(prop, index, string, ZFS_TYPE_DATASET)); 574 1.1 haad } 575 1.1 haad 576 1.2 chs uint64_t 577 1.2 chs zfs_prop_random_value(zfs_prop_t prop, uint64_t seed) 578 1.2 chs { 579 1.2 chs return (zprop_random_value(prop, seed, ZFS_TYPE_DATASET)); 580 1.2 chs } 581 1.2 chs 582 1.1 haad /* 583 1.1 haad * Returns TRUE if the property applies to any of the given dataset types. 584 1.1 haad */ 585 1.1 haad boolean_t 586 1.1 haad zfs_prop_valid_for_type(int prop, zfs_type_t types) 587 1.1 haad { 588 1.1 haad return (zprop_valid_for_type(prop, types)); 589 1.1 haad } 590 1.1 haad 591 1.1 haad zprop_type_t 592 1.1 haad zfs_prop_get_type(zfs_prop_t prop) 593 1.1 haad { 594 1.1 haad return (zfs_prop_table[prop].pd_proptype); 595 1.1 haad } 596 1.1 haad 597 1.1 haad /* 598 1.1 haad * Returns TRUE if the property is readonly. 599 1.1 haad */ 600 1.1 haad boolean_t 601 1.1 haad zfs_prop_readonly(zfs_prop_t prop) 602 1.1 haad { 603 1.1 haad return (zfs_prop_table[prop].pd_attr == PROP_READONLY || 604 1.1 haad zfs_prop_table[prop].pd_attr == PROP_ONETIME); 605 1.1 haad } 606 1.1 haad 607 1.1 haad /* 608 1.1 haad * Returns TRUE if the property is only allowed to be set once. 609 1.1 haad */ 610 1.1 haad boolean_t 611 1.1 haad zfs_prop_setonce(zfs_prop_t prop) 612 1.1 haad { 613 1.1 haad return (zfs_prop_table[prop].pd_attr == PROP_ONETIME); 614 1.1 haad } 615 1.1 haad 616 1.1 haad const char * 617 1.1 haad zfs_prop_default_string(zfs_prop_t prop) 618 1.1 haad { 619 1.1 haad return (zfs_prop_table[prop].pd_strdefault); 620 1.1 haad } 621 1.1 haad 622 1.1 haad uint64_t 623 1.1 haad zfs_prop_default_numeric(zfs_prop_t prop) 624 1.1 haad { 625 1.1 haad return (zfs_prop_table[prop].pd_numdefault); 626 1.1 haad } 627 1.1 haad 628 1.1 haad /* 629 1.1 haad * Given a dataset property ID, returns the corresponding name. 630 1.1 haad * Assuming the zfs dataset property ID is valid. 631 1.1 haad */ 632 1.1 haad const char * 633 1.1 haad zfs_prop_to_name(zfs_prop_t prop) 634 1.1 haad { 635 1.1 haad return (zfs_prop_table[prop].pd_name); 636 1.1 haad } 637 1.1 haad 638 1.1 haad /* 639 1.1 haad * Returns TRUE if the property is inheritable. 640 1.1 haad */ 641 1.1 haad boolean_t 642 1.1 haad zfs_prop_inheritable(zfs_prop_t prop) 643 1.1 haad { 644 1.1 haad return (zfs_prop_table[prop].pd_attr == PROP_INHERIT || 645 1.1 haad zfs_prop_table[prop].pd_attr == PROP_ONETIME); 646 1.1 haad } 647 1.1 haad 648 1.1 haad #ifndef _KERNEL 649 1.1 haad 650 1.1 haad /* 651 1.1 haad * Returns a string describing the set of acceptable values for the given 652 1.1 haad * zfs property, or NULL if it cannot be set. 653 1.1 haad */ 654 1.1 haad const char * 655 1.1 haad zfs_prop_values(zfs_prop_t prop) 656 1.1 haad { 657 1.1 haad return (zfs_prop_table[prop].pd_values); 658 1.1 haad } 659 1.1 haad 660 1.1 haad /* 661 1.1 haad * Returns TRUE if this property is a string type. Note that index types 662 1.1 haad * (compression, checksum) are treated as strings in userland, even though they 663 1.1 haad * are stored numerically on disk. 664 1.1 haad */ 665 1.1 haad int 666 1.1 haad zfs_prop_is_string(zfs_prop_t prop) 667 1.1 haad { 668 1.1 haad return (zfs_prop_table[prop].pd_proptype == PROP_TYPE_STRING || 669 1.1 haad zfs_prop_table[prop].pd_proptype == PROP_TYPE_INDEX); 670 1.1 haad } 671 1.1 haad 672 1.1 haad /* 673 1.1 haad * Returns the column header for the given property. Used only in 674 1.1 haad * 'zfs list -o', but centralized here with the other property information. 675 1.1 haad */ 676 1.1 haad const char * 677 1.1 haad zfs_prop_column_name(zfs_prop_t prop) 678 1.1 haad { 679 1.1 haad return (zfs_prop_table[prop].pd_colname); 680 1.1 haad } 681 1.1 haad 682 1.1 haad /* 683 1.1 haad * Returns whether the given property should be displayed right-justified for 684 1.1 haad * 'zfs list'. 685 1.1 haad */ 686 1.1 haad boolean_t 687 1.1 haad zfs_prop_align_right(zfs_prop_t prop) 688 1.1 haad { 689 1.1 haad return (zfs_prop_table[prop].pd_rightalign); 690 1.1 haad } 691 1.1 haad 692 1.1 haad #endif 693