| 1 | /* | 
| 2 |  * CDDL HEADER START | 
| 3 |  * | 
| 4 |  * The contents of this file are subject to the terms of the | 
| 5 |  * Common Development and Distribution License (the "License"). | 
| 6 |  * You may not use this file except in compliance with the License. | 
| 7 |  * | 
| 8 |  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | 
| 9 |  * or http://www.opensolaris.org/os/licensing. | 
| 10 |  * See the License for the specific language governing permissions | 
| 11 |  * and limitations under the License. | 
| 12 |  * | 
| 13 |  * When distributing Covered Code, include this CDDL HEADER in each | 
| 14 |  * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | 
| 15 |  * If applicable, add the following below this CDDL HEADER, with the | 
| 16 |  * fields enclosed by brackets "[]" replaced with your own identifying | 
| 17 |  * information: Portions Copyright [yyyy] [name of copyright owner] | 
| 18 |  * | 
| 19 |  * CDDL HEADER END | 
| 20 |  */ | 
| 21 | /* | 
| 22 |  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved. | 
| 23 |  * Use is subject to license terms. | 
| 24 |  */ | 
| 25 |  | 
| 26 | #ifndef	_ZFS_PROP_H | 
| 27 | #define	_ZFS_PROP_H | 
| 28 |  | 
| 29 | #include <sys/fs/zfs.h> | 
| 30 | #include <sys/types.h> | 
| 31 |  | 
| 32 | #ifdef	__cplusplus | 
| 33 | extern "C"  { | 
| 34 | #endif | 
| 35 |  | 
| 36 | /* | 
| 37 |  * For index types (e.g. compression and checksum), we want the numeric value | 
| 38 |  * in the kernel, but the string value in userland. | 
| 39 |  */ | 
| 40 | typedef enum { | 
| 41 | 	PROP_TYPE_NUMBER,	/* numeric value */ | 
| 42 | 	PROP_TYPE_STRING,	/* string value */ | 
| 43 | 	PROP_TYPE_INDEX		/* numeric value indexed by string */ | 
| 44 | } zprop_type_t; | 
| 45 |  | 
| 46 | typedef enum { | 
| 47 | 	PROP_DEFAULT, | 
| 48 | 	PROP_READONLY, | 
| 49 | 	PROP_INHERIT, | 
| 50 | 	/* | 
| 51 | 	 * ONETIME properties are a sort of conglomeration of READONLY | 
| 52 | 	 * and INHERIT.  They can be set only during object creation, | 
| 53 | 	 * after that they are READONLY.  If not explicitly set during | 
| 54 | 	 * creation, they can be inherited. | 
| 55 | 	 */ | 
| 56 | 	PROP_ONETIME | 
| 57 | } zprop_attr_t; | 
| 58 |  | 
| 59 | typedef struct zfs_index { | 
| 60 | 	const char *pi_name; | 
| 61 | 	uint64_t pi_value; | 
| 62 | } zprop_index_t; | 
| 63 |  | 
| 64 | typedef struct { | 
| 65 | 	const char *pd_name;		/* human-readable property name */ | 
| 66 | 	int pd_propnum;			/* property number */ | 
| 67 | 	zprop_type_t pd_proptype;	/* string, boolean, index, number */ | 
| 68 | 	const char *pd_strdefault;	/* default for strings */ | 
| 69 | 	uint64_t pd_numdefault;		/* for boolean / index / number */ | 
| 70 | 	zprop_attr_t pd_attr;		/* default, readonly, inherit */ | 
| 71 | 	int pd_types;			/* bitfield of valid dataset types */ | 
| 72 | 					/* fs | vol | snap; or pool */ | 
| 73 | 	const char *pd_values;		/* string telling acceptable values */ | 
| 74 | 	const char *pd_colname;		/* column header for "zfs list" */ | 
| 75 | 	boolean_t pd_rightalign;	/* column alignment for "zfs list" */ | 
| 76 | 	boolean_t pd_visible;		/* do we list this property with the */ | 
| 77 | 					/* "zfs get" help message */ | 
| 78 | 	const zprop_index_t *pd_table;	/* for index properties, a table */ | 
| 79 | 					/* defining the possible values */ | 
| 80 | 	size_t pd_table_size;		/* number of entries in pd_table[] */ | 
| 81 | } zprop_desc_t; | 
| 82 |  | 
| 83 | /* | 
| 84 |  * zfs dataset property functions | 
| 85 |  */ | 
| 86 | void zfs_prop_init(void); | 
| 87 | zprop_type_t zfs_prop_get_type(zfs_prop_t); | 
| 88 | boolean_t zfs_prop_delegatable(zfs_prop_t prop); | 
| 89 | zprop_desc_t *zfs_prop_get_table(void); | 
| 90 |  | 
| 91 | /* | 
| 92 |  * zpool property functions | 
| 93 |  */ | 
| 94 | void zpool_prop_init(void); | 
| 95 | zprop_type_t zpool_prop_get_type(zpool_prop_t); | 
| 96 | zprop_desc_t *zpool_prop_get_table(void); | 
| 97 |  | 
| 98 | /* | 
| 99 |  * Common routines to initialize property tables | 
| 100 |  */ | 
| 101 | void zprop_register_impl(int, const char *, zprop_type_t, uint64_t, | 
| 102 |     const char *, zprop_attr_t, int, const char *, const char *, | 
| 103 |     boolean_t, boolean_t, const zprop_index_t *); | 
| 104 | void zprop_register_string(int, const char *, const char *, | 
| 105 |     zprop_attr_t attr, int, const char *, const char *); | 
| 106 | void zprop_register_number(int, const char *, uint64_t, zprop_attr_t, int, | 
| 107 |     const char *, const char *); | 
| 108 | void zprop_register_index(int, const char *, uint64_t, zprop_attr_t, int, | 
| 109 |     const char *, const char *, const zprop_index_t *); | 
| 110 | void zprop_register_hidden(int, const char *, zprop_type_t, zprop_attr_t, | 
| 111 |     int, const char *); | 
| 112 |  | 
| 113 | /* | 
| 114 |  * Common routines for zfs and zpool property management | 
| 115 |  */ | 
| 116 | int zprop_iter_common(zprop_func, void *, boolean_t, boolean_t, zfs_type_t); | 
| 117 | int zprop_name_to_prop(const char *, zfs_type_t); | 
| 118 | int zprop_string_to_index(int, const char *, uint64_t *, zfs_type_t); | 
| 119 | int zprop_index_to_string(int, uint64_t, const char **, zfs_type_t); | 
| 120 | uint64_t zprop_random_value(int, uint64_t, zfs_type_t); | 
| 121 | const char *zprop_values(int, zfs_type_t); | 
| 122 | size_t zprop_width(int, boolean_t *, zfs_type_t); | 
| 123 | boolean_t zprop_valid_for_type(int, zfs_type_t); | 
| 124 | boolean_t zfs_prop_written(const char *name); | 
| 125 |  | 
| 126 |  | 
| 127 | #ifdef	__cplusplus | 
| 128 | } | 
| 129 | #endif | 
| 130 |  | 
| 131 | #endif	/* _ZFS_PROP_H */ | 
| 132 |  |