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