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/int_limits.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
);
160 const char *zfs_history_event_names
[LOG_END
] = {
180 "destroy_begin_sync",
186 "permission who remove",
195 "filesystem version upgrade",
197 "refreservation set",
204 #if defined(_KERNEL) && defined(HAVE_SPL)
205 EXPORT_SYMBOL(zfs_allocatable_devs
);
206 EXPORT_SYMBOL(zpool_get_rewind_policy
);
207 EXPORT_SYMBOL(zfs_zpl_version_map
);
208 EXPORT_SYMBOL(zfs_spa_version_map
);
209 EXPORT_SYMBOL(zfs_history_event_names
);