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 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.
33 #include <sys/systm.h>
38 #include <sys/types.h>
39 #include <sys/fs/zfs.h>
40 #include <sys/nvpair.h>
41 #include "zfs_comutil.h"
44 * Are there allocatable vdevs?
47 zfs_allocatable_devs(nvlist_t *nv)
54 if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
55 &child, &children) != 0) {
58 for (c = 0; c < children; c++) {
60 (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
69 zpool_get_rewind_policy(nvlist_t *nvl, zpool_rewind_policy_t *zrpp)
76 zrpp->zrp_request = ZPOOL_NO_REWIND;
77 zrpp->zrp_maxmeta = 0;
78 zrpp->zrp_maxdata = UINT64_MAX;
79 zrpp->zrp_txg = UINT64_MAX;
85 while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) {
86 nm = nvpair_name(elem);
87 if (strcmp(nm, ZPOOL_REWIND_POLICY) == 0) {
88 if (nvpair_value_nvlist(elem, &policy) == 0)
89 zpool_get_rewind_policy(policy, zrpp);
91 } else if (strcmp(nm, ZPOOL_REWIND_REQUEST) == 0) {
92 if (nvpair_value_uint32(elem, &zrpp->zrp_request) == 0)
93 if (zrpp->zrp_request & ~ZPOOL_REWIND_POLICIES)
94 zrpp->zrp_request = ZPOOL_NO_REWIND;
95 } else if (strcmp(nm, ZPOOL_REWIND_REQUEST_TXG) == 0) {
96 (void) nvpair_value_uint64(elem, &zrpp->zrp_txg);
97 } else if (strcmp(nm, ZPOOL_REWIND_META_THRESH) == 0) {
98 (void) nvpair_value_uint64(elem, &zrpp->zrp_maxmeta);
99 } else if (strcmp(nm, ZPOOL_REWIND_DATA_THRESH) == 0) {
100 (void) nvpair_value_uint64(elem, &zrpp->zrp_maxdata);
103 if (zrpp->zrp_request == 0)
104 zrpp->zrp_request = ZPOOL_NO_REWIND;
107 typedef struct zfs_version_spa_map {
110 } zfs_version_spa_map_t;
113 * Keep this table in monotonically increasing version number order.
115 static zfs_version_spa_map_t zfs_version_table[] = {
116 {ZPL_VERSION_INITIAL, SPA_VERSION_INITIAL},
117 {ZPL_VERSION_DIRENT_TYPE, SPA_VERSION_INITIAL},
118 {ZPL_VERSION_FUID, SPA_VERSION_FUID},
119 {ZPL_VERSION_USERSPACE, SPA_VERSION_USERSPACE},
120 {ZPL_VERSION_SA, SPA_VERSION_SA},
125 * Return the max zpl version for a corresponding spa version
126 * -1 is returned if no mapping exists.
129 zfs_zpl_version_map(int spa_version)
134 for (i = 0; zfs_version_table[i].version_spa; i++) {
135 if (spa_version >= zfs_version_table[i].version_spa)
136 version = zfs_version_table[i].version_zpl;
143 * Return the min spa version for a corresponding spa version
144 * -1 is returned if no mapping exists.
147 zfs_spa_version_map(int zpl_version)
152 for (i = 0; zfs_version_table[i].version_zpl; i++) {
153 if (zfs_version_table[i].version_zpl >= zpl_version)
154 return (zfs_version_table[i].version_spa);
161 * This is the table of legacy internal event names; it should not be modified.
162 * The internal events are now stored in the history log as strings.
164 const char *zfs_history_event_names[ZFS_NUM_LEGACY_HISTORY_EVENTS] = {
184 "destroy_begin_sync",
190 "permission who remove",
199 "filesystem version upgrade",
201 "refreservation set",