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.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or https://opensource.org/licenses/CDDL-1.0.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
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]
22 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
27 * This file is intended for functions that ought to be common between user
28 * land (libzfs) and the kernel. When many common routines need to be shared
29 * then a separate file should be created.
36 #include <sys/types.h>
37 #include <sys/fs/zfs.h>
38 #include <sys/nvpair.h>
39 #include "zfs_comutil.h"
40 #include <sys/zfs_ratelimit.h>
43 * Are there allocatable vdevs?
46 zfs_allocatable_devs(nvlist_t
*nv
)
53 if (nvlist_lookup_nvlist_array(nv
, ZPOOL_CONFIG_CHILDREN
,
54 &child
, &children
) != 0) {
57 for (c
= 0; c
< children
; c
++) {
59 (void) nvlist_lookup_uint64(child
[c
], ZPOOL_CONFIG_IS_LOG
,
68 * Are there special vdevs?
71 zfs_special_devs(nvlist_t
*nv
, const char *type
)
78 if (nvlist_lookup_nvlist_array(nv
, ZPOOL_CONFIG_CHILDREN
,
79 &child
, &children
) != 0) {
82 for (c
= 0; c
< children
; c
++) {
83 if (nvlist_lookup_string(child
[c
], ZPOOL_CONFIG_ALLOCATION_BIAS
,
85 if (strcmp(bias
, VDEV_ALLOC_BIAS_SPECIAL
) == 0 ||
86 strcmp(bias
, VDEV_ALLOC_BIAS_DEDUP
) == 0) {
88 (type
!= NULL
&& strcmp(bias
, type
) == 0))
97 zpool_get_load_policy(nvlist_t
*nvl
, zpool_load_policy_t
*zlpp
)
104 zlpp
->zlp_rewind
= ZPOOL_NO_REWIND
;
105 zlpp
->zlp_maxmeta
= 0;
106 zlpp
->zlp_maxdata
= UINT64_MAX
;
107 zlpp
->zlp_txg
= UINT64_MAX
;
113 while ((elem
= nvlist_next_nvpair(nvl
, elem
)) != NULL
) {
114 nm
= nvpair_name(elem
);
115 if (strcmp(nm
, ZPOOL_LOAD_POLICY
) == 0) {
116 if (nvpair_value_nvlist(elem
, &policy
) == 0)
117 zpool_get_load_policy(policy
, zlpp
);
119 } else if (strcmp(nm
, ZPOOL_LOAD_REWIND_POLICY
) == 0) {
120 if (nvpair_value_uint32(elem
, &zlpp
->zlp_rewind
) == 0)
121 if (zlpp
->zlp_rewind
& ~ZPOOL_REWIND_POLICIES
)
122 zlpp
->zlp_rewind
= ZPOOL_NO_REWIND
;
123 } else if (strcmp(nm
, ZPOOL_LOAD_REQUEST_TXG
) == 0) {
124 (void) nvpair_value_uint64(elem
, &zlpp
->zlp_txg
);
125 } else if (strcmp(nm
, ZPOOL_LOAD_META_THRESH
) == 0) {
126 (void) nvpair_value_uint64(elem
, &zlpp
->zlp_maxmeta
);
127 } else if (strcmp(nm
, ZPOOL_LOAD_DATA_THRESH
) == 0) {
128 (void) nvpair_value_uint64(elem
, &zlpp
->zlp_maxdata
);
131 if (zlpp
->zlp_rewind
== 0)
132 zlpp
->zlp_rewind
= ZPOOL_NO_REWIND
;
135 typedef struct zfs_version_spa_map
{
138 } zfs_version_spa_map_t
;
141 * Keep this table in monotonically increasing version number order.
143 static zfs_version_spa_map_t zfs_version_table
[] = {
144 {ZPL_VERSION_INITIAL
, SPA_VERSION_INITIAL
},
145 {ZPL_VERSION_DIRENT_TYPE
, SPA_VERSION_INITIAL
},
146 {ZPL_VERSION_FUID
, SPA_VERSION_FUID
},
147 {ZPL_VERSION_USERSPACE
, SPA_VERSION_USERSPACE
},
148 {ZPL_VERSION_SA
, SPA_VERSION_SA
},
153 * Return the max zpl version for a corresponding spa version
154 * -1 is returned if no mapping exists.
157 zfs_zpl_version_map(int spa_version
)
161 for (int i
= 0; zfs_version_table
[i
].version_spa
; i
++)
162 if (spa_version
>= zfs_version_table
[i
].version_spa
)
163 version
= zfs_version_table
[i
].version_zpl
;
169 * Return the min spa version for a corresponding spa version
170 * -1 is returned if no mapping exists.
173 zfs_spa_version_map(int zpl_version
)
175 for (int i
= 0; zfs_version_table
[i
].version_zpl
; i
++)
176 if (zfs_version_table
[i
].version_zpl
>= zpl_version
)
177 return (zfs_version_table
[i
].version_spa
);
183 * This is the table of legacy internal event names; it should not be modified.
184 * The internal events are now stored in the history log as strings.
186 const char *const zfs_history_event_names
[ZFS_NUM_LEGACY_HISTORY_EVENTS
] = {
206 "destroy_begin_sync",
212 "permission who remove",
221 "filesystem version upgrade",
223 "refreservation set",
231 zfs_dataset_name_hidden(const char *name
)
234 * Skip over datasets that are not visible in this zone,
235 * internal datasets (which have a $ in their name), and
236 * temporary datasets (which have a % in their name).
238 if (strpbrk(name
, "$%") != NULL
)
240 if (!INGLOBALZONE(curproc
) && !zone_dataset_visible(name
, NULL
))
246 EXPORT_SYMBOL(zfs_allocatable_devs
);
247 EXPORT_SYMBOL(zfs_special_devs
);
248 EXPORT_SYMBOL(zpool_get_load_policy
);
249 EXPORT_SYMBOL(zfs_zpl_version_map
);
250 EXPORT_SYMBOL(zfs_spa_version_map
);
251 EXPORT_SYMBOL(zfs_history_event_names
);
252 EXPORT_SYMBOL(zfs_dataset_name_hidden
);