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 http://www.opensolaris.org/os/licensing.
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 to 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, 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) {
87 if (type != NULL && strcmp(bias, type) == 0) {
89 } else if (type == NULL) {
99 zpool_get_load_policy(nvlist_t *nvl, zpool_load_policy_t *zlpp)
106 zlpp->zlp_rewind = ZPOOL_NO_REWIND;
107 zlpp->zlp_maxmeta = 0;
108 zlpp->zlp_maxdata = UINT64_MAX;
109 zlpp->zlp_txg = UINT64_MAX;
115 while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) {
116 nm = nvpair_name(elem);
117 if (strcmp(nm, ZPOOL_LOAD_POLICY) == 0) {
118 if (nvpair_value_nvlist(elem, &policy) == 0)
119 zpool_get_load_policy(policy, zlpp);
121 } else if (strcmp(nm, ZPOOL_LOAD_REWIND_POLICY) == 0) {
122 if (nvpair_value_uint32(elem, &zlpp->zlp_rewind) == 0)
123 if (zlpp->zlp_rewind & ~ZPOOL_REWIND_POLICIES)
124 zlpp->zlp_rewind = ZPOOL_NO_REWIND;
125 } else if (strcmp(nm, ZPOOL_LOAD_REQUEST_TXG) == 0) {
126 (void) nvpair_value_uint64(elem, &zlpp->zlp_txg);
127 } else if (strcmp(nm, ZPOOL_LOAD_META_THRESH) == 0) {
128 (void) nvpair_value_uint64(elem, &zlpp->zlp_maxmeta);
129 } else if (strcmp(nm, ZPOOL_LOAD_DATA_THRESH) == 0) {
130 (void) nvpair_value_uint64(elem, &zlpp->zlp_maxdata);
133 if (zlpp->zlp_rewind == 0)
134 zlpp->zlp_rewind = ZPOOL_NO_REWIND;
137 typedef struct zfs_version_spa_map {
140 } zfs_version_spa_map_t;
143 * Keep this table in monotonically increasing version number order.
145 static zfs_version_spa_map_t zfs_version_table[] = {
146 {ZPL_VERSION_INITIAL, SPA_VERSION_INITIAL},
147 {ZPL_VERSION_DIRENT_TYPE, SPA_VERSION_INITIAL},
148 {ZPL_VERSION_FUID, SPA_VERSION_FUID},
149 {ZPL_VERSION_USERSPACE, SPA_VERSION_USERSPACE},
150 {ZPL_VERSION_SA, SPA_VERSION_SA},
155 * Return the max zpl version for a corresponding spa version
156 * -1 is returned if no mapping exists.
159 zfs_zpl_version_map(int spa_version)
164 for (i = 0; zfs_version_table[i].version_spa; i++) {
165 if (spa_version >= zfs_version_table[i].version_spa)
166 version = zfs_version_table[i].version_zpl;
173 * Return the min spa version for a corresponding spa version
174 * -1 is returned if no mapping exists.
177 zfs_spa_version_map(int zpl_version)
182 for (i = 0; zfs_version_table[i].version_zpl; i++) {
183 if (zfs_version_table[i].version_zpl >= zpl_version)
184 return (zfs_version_table[i].version_spa);
191 * This is the table of legacy internal event names; it should not be modified.
192 * The internal events are now stored in the history log as strings.
194 const char *zfs_history_event_names[ZFS_NUM_LEGACY_HISTORY_EVENTS] = {
214 "destroy_begin_sync",
220 "permission who remove",
229 "filesystem version upgrade",
231 "refreservation set",
239 zfs_dataset_name_hidden(const char *name)
242 * Skip over datasets that are not visible in this zone,
243 * internal datasets (which have a $ in their name), and
244 * temporary datasets (which have a % in their name).
246 if (strchr(name, '$') != NULL)
248 if (strchr(name, '%') != NULL)
250 if (!INGLOBALZONE(curproc) && !zone_dataset_visible(name, NULL))
256 EXPORT_SYMBOL(zfs_allocatable_devs);
257 EXPORT_SYMBOL(zfs_special_devs);
258 EXPORT_SYMBOL(zpool_get_load_policy);
259 EXPORT_SYMBOL(zfs_zpl_version_map);
260 EXPORT_SYMBOL(zfs_spa_version_map);
261 EXPORT_SYMBOL(zfs_history_event_names);
262 EXPORT_SYMBOL(zfs_dataset_name_hidden);