15913Sperrin /* 25913Sperrin * CDDL HEADER START 35913Sperrin * 45913Sperrin * The contents of this file are subject to the terms of the 55913Sperrin * Common Development and Distribution License (the "License"). 65913Sperrin * You may not use this file except in compliance with the License. 75913Sperrin * 85913Sperrin * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95913Sperrin * or http://www.opensolaris.org/os/licensing. 105913Sperrin * See the License for the specific language governing permissions 115913Sperrin * and limitations under the License. 125913Sperrin * 135913Sperrin * When distributing Covered Code, include this CDDL HEADER in each 145913Sperrin * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155913Sperrin * If applicable, add the following below this CDDL HEADER, with the 165913Sperrin * fields enclosed by brackets "[]" replaced with your own identifying 175913Sperrin * information: Portions Copyright [yyyy] [name of copyright owner] 185913Sperrin * 195913Sperrin * CDDL HEADER END 205913Sperrin */ 215913Sperrin /* 22*12296SLin.Ling@Sun.COM * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 235913Sperrin */ 245913Sperrin 255913Sperrin /* 265913Sperrin * This file is intended for functions that ought to be common between user 275913Sperrin * land (libzfs) and the kernel. When many common routines need to be shared 285913Sperrin * then a separate file should to be created. 295913Sperrin */ 305913Sperrin 315913Sperrin #if defined(_KERNEL) 325913Sperrin #include <sys/systm.h> 3310921STim.Haley@Sun.COM #else 3410921STim.Haley@Sun.COM #include <string.h> 355913Sperrin #endif 365913Sperrin 375913Sperrin #include <sys/types.h> 385913Sperrin #include <sys/fs/zfs.h> 3910921STim.Haley@Sun.COM #include <sys/int_limits.h> 405913Sperrin #include <sys/nvpair.h> 4111935SMark.Shellenbaum@Sun.COM #include "zfs_comutil.h" 425913Sperrin 435913Sperrin /* 445913Sperrin * Are there allocatable vdevs? 455913Sperrin */ 465913Sperrin boolean_t 475913Sperrin zfs_allocatable_devs(nvlist_t *nv) 485913Sperrin { 495913Sperrin uint64_t is_log; 505913Sperrin uint_t c; 515913Sperrin nvlist_t **child; 525913Sperrin uint_t children; 535913Sperrin 545913Sperrin if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, 555913Sperrin &child, &children) != 0) { 565913Sperrin return (B_FALSE); 575913Sperrin } 585913Sperrin for (c = 0; c < children; c++) { 595913Sperrin is_log = 0; 605913Sperrin (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG, 615913Sperrin &is_log); 625913Sperrin if (!is_log) 635913Sperrin return (B_TRUE); 645913Sperrin } 655913Sperrin return (B_FALSE); 665913Sperrin } 6710921STim.Haley@Sun.COM 6810921STim.Haley@Sun.COM void 6910921STim.Haley@Sun.COM zpool_get_rewind_policy(nvlist_t *nvl, zpool_rewind_policy_t *zrpp) 7010921STim.Haley@Sun.COM { 7110921STim.Haley@Sun.COM nvlist_t *policy; 7210921STim.Haley@Sun.COM nvpair_t *elem; 7310921STim.Haley@Sun.COM char *nm; 7410921STim.Haley@Sun.COM 7510921STim.Haley@Sun.COM /* Defaults */ 7610921STim.Haley@Sun.COM zrpp->zrp_request = ZPOOL_NO_REWIND; 7710921STim.Haley@Sun.COM zrpp->zrp_maxmeta = 0; 7811727SVictor.Latushkin@Sun.COM zrpp->zrp_maxdata = UINT64_MAX; 7910921STim.Haley@Sun.COM zrpp->zrp_txg = UINT64_MAX; 8010921STim.Haley@Sun.COM 8110921STim.Haley@Sun.COM if (nvl == NULL) 8210921STim.Haley@Sun.COM return; 8310921STim.Haley@Sun.COM 8410921STim.Haley@Sun.COM elem = NULL; 8510921STim.Haley@Sun.COM while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) { 8610921STim.Haley@Sun.COM nm = nvpair_name(elem); 8710921STim.Haley@Sun.COM if (strcmp(nm, ZPOOL_REWIND_POLICY) == 0) { 8810921STim.Haley@Sun.COM if (nvpair_value_nvlist(elem, &policy) == 0) 8910921STim.Haley@Sun.COM zpool_get_rewind_policy(policy, zrpp); 9010921STim.Haley@Sun.COM return; 9110921STim.Haley@Sun.COM } else if (strcmp(nm, ZPOOL_REWIND_REQUEST) == 0) { 9211727SVictor.Latushkin@Sun.COM if (nvpair_value_uint32(elem, &zrpp->zrp_request) == 0) 9311727SVictor.Latushkin@Sun.COM if (zrpp->zrp_request & ~ZPOOL_REWIND_POLICIES) 9410921STim.Haley@Sun.COM zrpp->zrp_request = ZPOOL_NO_REWIND; 9510921STim.Haley@Sun.COM } else if (strcmp(nm, ZPOOL_REWIND_REQUEST_TXG) == 0) { 9610921STim.Haley@Sun.COM (void) nvpair_value_uint64(elem, &zrpp->zrp_txg); 9710921STim.Haley@Sun.COM } else if (strcmp(nm, ZPOOL_REWIND_META_THRESH) == 0) { 9811727SVictor.Latushkin@Sun.COM (void) nvpair_value_uint64(elem, &zrpp->zrp_maxmeta); 9910921STim.Haley@Sun.COM } else if (strcmp(nm, ZPOOL_REWIND_DATA_THRESH) == 0) { 10011727SVictor.Latushkin@Sun.COM (void) nvpair_value_uint64(elem, &zrpp->zrp_maxdata); 10110921STim.Haley@Sun.COM } 10210921STim.Haley@Sun.COM } 10311727SVictor.Latushkin@Sun.COM if (zrpp->zrp_request == 0) 10411727SVictor.Latushkin@Sun.COM zrpp->zrp_request = ZPOOL_NO_REWIND; 10510921STim.Haley@Sun.COM } 10611935SMark.Shellenbaum@Sun.COM 10711935SMark.Shellenbaum@Sun.COM typedef struct zfs_version_spa_map { 10811935SMark.Shellenbaum@Sun.COM int version_zpl; 10911935SMark.Shellenbaum@Sun.COM int version_spa; 11011935SMark.Shellenbaum@Sun.COM } zfs_version_spa_map_t; 11111935SMark.Shellenbaum@Sun.COM 11211935SMark.Shellenbaum@Sun.COM /* 11311935SMark.Shellenbaum@Sun.COM * Keep this table in monotonically increasing version number order. 11411935SMark.Shellenbaum@Sun.COM */ 11511935SMark.Shellenbaum@Sun.COM static zfs_version_spa_map_t zfs_version_table[] = { 11611935SMark.Shellenbaum@Sun.COM {ZPL_VERSION_INITIAL, SPA_VERSION_INITIAL}, 11711935SMark.Shellenbaum@Sun.COM {ZPL_VERSION_DIRENT_TYPE, SPA_VERSION_INITIAL}, 11811935SMark.Shellenbaum@Sun.COM {ZPL_VERSION_FUID, SPA_VERSION_FUID}, 11911935SMark.Shellenbaum@Sun.COM {ZPL_VERSION_USERSPACE, SPA_VERSION_USERSPACE}, 12011935SMark.Shellenbaum@Sun.COM {ZPL_VERSION_SA, SPA_VERSION_SA}, 12111935SMark.Shellenbaum@Sun.COM {0, 0} 12211935SMark.Shellenbaum@Sun.COM }; 12311935SMark.Shellenbaum@Sun.COM 12411935SMark.Shellenbaum@Sun.COM /* 12511935SMark.Shellenbaum@Sun.COM * Return the max zpl version for a corresponding spa version 12611935SMark.Shellenbaum@Sun.COM * -1 is returned if no mapping exists. 12711935SMark.Shellenbaum@Sun.COM */ 12811935SMark.Shellenbaum@Sun.COM int 12911935SMark.Shellenbaum@Sun.COM zfs_zpl_version_map(int spa_version) 13011935SMark.Shellenbaum@Sun.COM { 13111935SMark.Shellenbaum@Sun.COM int i; 13211935SMark.Shellenbaum@Sun.COM int version = -1; 13311935SMark.Shellenbaum@Sun.COM 13411935SMark.Shellenbaum@Sun.COM for (i = 0; zfs_version_table[i].version_spa; i++) { 13511935SMark.Shellenbaum@Sun.COM if (spa_version >= zfs_version_table[i].version_spa) 13611935SMark.Shellenbaum@Sun.COM version = zfs_version_table[i].version_zpl; 13711935SMark.Shellenbaum@Sun.COM } 13811935SMark.Shellenbaum@Sun.COM 13911935SMark.Shellenbaum@Sun.COM return (version); 14011935SMark.Shellenbaum@Sun.COM } 14111935SMark.Shellenbaum@Sun.COM 14211935SMark.Shellenbaum@Sun.COM /* 14311935SMark.Shellenbaum@Sun.COM * Return the min spa version for a corresponding spa version 14411935SMark.Shellenbaum@Sun.COM * -1 is returned if no mapping exists. 14511935SMark.Shellenbaum@Sun.COM */ 14611935SMark.Shellenbaum@Sun.COM int 14711935SMark.Shellenbaum@Sun.COM zfs_spa_version_map(int zpl_version) 14811935SMark.Shellenbaum@Sun.COM { 14911935SMark.Shellenbaum@Sun.COM int i; 15011935SMark.Shellenbaum@Sun.COM int version = -1; 15111935SMark.Shellenbaum@Sun.COM 15211935SMark.Shellenbaum@Sun.COM for (i = 0; zfs_version_table[i].version_zpl; i++) { 15311935SMark.Shellenbaum@Sun.COM if (zfs_version_table[i].version_zpl >= zpl_version) 15411935SMark.Shellenbaum@Sun.COM return (zfs_version_table[i].version_spa); 15511935SMark.Shellenbaum@Sun.COM } 15611935SMark.Shellenbaum@Sun.COM 15711935SMark.Shellenbaum@Sun.COM return (version); 15811935SMark.Shellenbaum@Sun.COM } 159*12296SLin.Ling@Sun.COM 160*12296SLin.Ling@Sun.COM const char *zfs_history_event_names[LOG_END] = { 161*12296SLin.Ling@Sun.COM "invalid event", 162*12296SLin.Ling@Sun.COM "pool create", 163*12296SLin.Ling@Sun.COM "vdev add", 164*12296SLin.Ling@Sun.COM "pool remove", 165*12296SLin.Ling@Sun.COM "pool destroy", 166*12296SLin.Ling@Sun.COM "pool export", 167*12296SLin.Ling@Sun.COM "pool import", 168*12296SLin.Ling@Sun.COM "vdev attach", 169*12296SLin.Ling@Sun.COM "vdev replace", 170*12296SLin.Ling@Sun.COM "vdev detach", 171*12296SLin.Ling@Sun.COM "vdev online", 172*12296SLin.Ling@Sun.COM "vdev offline", 173*12296SLin.Ling@Sun.COM "vdev upgrade", 174*12296SLin.Ling@Sun.COM "pool clear", 175*12296SLin.Ling@Sun.COM "pool scrub", 176*12296SLin.Ling@Sun.COM "pool property set", 177*12296SLin.Ling@Sun.COM "create", 178*12296SLin.Ling@Sun.COM "clone", 179*12296SLin.Ling@Sun.COM "destroy", 180*12296SLin.Ling@Sun.COM "destroy_begin_sync", 181*12296SLin.Ling@Sun.COM "inherit", 182*12296SLin.Ling@Sun.COM "property set", 183*12296SLin.Ling@Sun.COM "quota set", 184*12296SLin.Ling@Sun.COM "permission update", 185*12296SLin.Ling@Sun.COM "permission remove", 186*12296SLin.Ling@Sun.COM "permission who remove", 187*12296SLin.Ling@Sun.COM "promote", 188*12296SLin.Ling@Sun.COM "receive", 189*12296SLin.Ling@Sun.COM "rename", 190*12296SLin.Ling@Sun.COM "reservation set", 191*12296SLin.Ling@Sun.COM "replay_inc_sync", 192*12296SLin.Ling@Sun.COM "replay_full_sync", 193*12296SLin.Ling@Sun.COM "rollback", 194*12296SLin.Ling@Sun.COM "snapshot", 195*12296SLin.Ling@Sun.COM "filesystem version upgrade", 196*12296SLin.Ling@Sun.COM "refquota set", 197*12296SLin.Ling@Sun.COM "refreservation set", 198*12296SLin.Ling@Sun.COM "pool scrub done", 199*12296SLin.Ling@Sun.COM "user hold", 200*12296SLin.Ling@Sun.COM "user release", 201*12296SLin.Ling@Sun.COM "pool split", 202*12296SLin.Ling@Sun.COM }; 203