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.
26 * This file is intended for functions that ought to be common between user
27 * land (libzfs) and the kernel. When many common routines need to be shared
28 * then a separate file should to be created.
32 #include <sys/systm.h>
37 #include <sys/types.h>
38 #include <sys/fs/zfs.h>
39 #include <sys/nvpair.h>
40 #include "zfs_comutil.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 zpool_get_rewind_policy(nvlist_t *nvl, zpool_rewind_policy_t *zrpp)
75 zrpp->zrp_request = ZPOOL_NO_REWIND;
76 zrpp->zrp_maxmeta = 0;
77 zrpp->zrp_maxdata = UINT64_MAX;
78 zrpp->zrp_txg = UINT64_MAX;
84 while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) {
85 nm = nvpair_name(elem);
86 if (strcmp(nm, ZPOOL_REWIND_POLICY) == 0) {
87 if (nvpair_value_nvlist(elem, &policy) == 0)
88 zpool_get_rewind_policy(policy, zrpp);
90 } else if (strcmp(nm, ZPOOL_REWIND_REQUEST) == 0) {
91 if (nvpair_value_uint32(elem, &zrpp->zrp_request) == 0)
92 if (zrpp->zrp_request & ~ZPOOL_REWIND_POLICIES)
93 zrpp->zrp_request = ZPOOL_NO_REWIND;
94 } else if (strcmp(nm, ZPOOL_REWIND_REQUEST_TXG) == 0) {
95 (void) nvpair_value_uint64(elem, &zrpp->zrp_txg);
96 } else if (strcmp(nm, ZPOOL_REWIND_META_THRESH) == 0) {
97 (void) nvpair_value_uint64(elem, &zrpp->zrp_maxmeta);
98 } else if (strcmp(nm, ZPOOL_REWIND_DATA_THRESH) == 0) {
99 (void) nvpair_value_uint64(elem, &zrpp->zrp_maxdata);
102 if (zrpp->zrp_request == 0)
103 zrpp->zrp_request = ZPOOL_NO_REWIND;
106 typedef struct zfs_version_spa_map {
109 } zfs_version_spa_map_t;
112 * Keep this table in monotonically increasing version number order.
114 static zfs_version_spa_map_t zfs_version_table[] = {
115 {ZPL_VERSION_INITIAL, SPA_VERSION_INITIAL},
116 {ZPL_VERSION_DIRENT_TYPE, SPA_VERSION_INITIAL},
117 {ZPL_VERSION_FUID, SPA_VERSION_FUID},
118 {ZPL_VERSION_USERSPACE, SPA_VERSION_USERSPACE},
119 {ZPL_VERSION_SA, SPA_VERSION_SA},
124 * Return the max zpl version for a corresponding spa version
125 * -1 is returned if no mapping exists.
128 zfs_zpl_version_map(int spa_version)
133 for (i = 0; zfs_version_table[i].version_spa; i++) {
134 if (spa_version >= zfs_version_table[i].version_spa)
135 version = zfs_version_table[i].version_zpl;
142 * Return the min spa version for a corresponding spa version
143 * -1 is returned if no mapping exists.
146 zfs_spa_version_map(int zpl_version)
151 for (i = 0; zfs_version_table[i].version_zpl; i++) {
152 if (zfs_version_table[i].version_zpl >= zpl_version)
153 return (zfs_version_table[i].version_spa);
159 const char *zfs_history_event_names[LOG_END] = {
179 "destroy_begin_sync",
185 "permission who remove",
194 "filesystem version upgrade",
196 "refreservation set",