1 /* 2 * CDDL HEADER START 3 * 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. 7 * 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. 12 * 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] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* 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. 30 */ 31 32 #if defined(_KERNEL) 33 #include <sys/systm.h> 34 #else 35 #include <string.h> 36 #endif 37 38 #include <sys/types.h> 39 #include <sys/fs/zfs.h> 40 #include <sys/int_limits.h> 41 #include <sys/nvpair.h> 42 43 /* 44 * Are there allocatable vdevs? 45 */ 46 boolean_t 47 zfs_allocatable_devs(nvlist_t *nv) 48 { 49 uint64_t is_log; 50 uint_t c; 51 nvlist_t **child; 52 uint_t children; 53 54 if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, 55 &child, &children) != 0) { 56 return (B_FALSE); 57 } 58 for (c = 0; c < children; c++) { 59 is_log = 0; 60 (void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG, 61 &is_log); 62 if (!is_log) 63 return (B_TRUE); 64 } 65 return (B_FALSE); 66 } 67 68 void 69 zpool_get_rewind_policy(nvlist_t *nvl, zpool_rewind_policy_t *zrpp) 70 { 71 nvlist_t *policy; 72 nvpair_t *elem; 73 char *nm; 74 75 /* Defaults */ 76 zrpp->zrp_request = ZPOOL_NO_REWIND; 77 zrpp->zrp_maxmeta = 0; 78 zrpp->zrp_maxdata = UINT64_MAX; 79 zrpp->zrp_txg = UINT64_MAX; 80 81 if (nvl == NULL) 82 return; 83 84 elem = NULL; 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); 90 return; 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); 101 } 102 } 103 if (zrpp->zrp_request == 0) 104 zrpp->zrp_request = ZPOOL_NO_REWIND; 105 } 106