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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_SPA_IMPL_H 28 #define _SYS_SPA_IMPL_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <sys/spa.h> 33 #include <sys/vdev.h> 34 #include <sys/metaslab.h> 35 #include <sys/dmu.h> 36 #include <sys/dsl_pool.h> 37 #include <sys/uberblock_impl.h> 38 #include <sys/zfs_context.h> 39 #include <sys/avl.h> 40 #include <sys/refcount.h> 41 #include <sys/bplist.h> 42 43 #ifdef __cplusplus 44 extern "C" { 45 #endif 46 47 typedef struct spa_config_lock { 48 kmutex_t scl_lock; 49 uint64_t scl_count; 50 kthread_t *scl_writer; 51 kcondvar_t scl_cv; 52 } spa_config_lock_t; 53 54 struct spa { 55 /* 56 * Fields protected by spa_namespace_lock. 57 */ 58 char *spa_name; 59 avl_node_t spa_avl; 60 int spa_anon; 61 nvlist_t *spa_config; 62 uint64_t spa_config_txg; /* txg of last config change */ 63 spa_config_lock_t spa_config_lock; /* configuration changes */ 64 kmutex_t spa_config_cache_lock; /* for spa_config RW_READER */ 65 int spa_sync_pass; /* iterate-to-convergence */ 66 int spa_state; /* pool state */ 67 uint8_t spa_minref; /* min refcnt of open pool */ 68 uint8_t spa_traverse_wanted; /* traverse lock wanted */ 69 taskq_t *spa_vdev_retry_taskq; 70 taskq_t *spa_zio_issue_taskq[ZIO_TYPES]; 71 taskq_t *spa_zio_intr_taskq[ZIO_TYPES]; 72 dsl_pool_t *spa_dsl_pool; 73 metaslab_class_t *spa_normal_class; /* normal data class */ 74 uint64_t spa_first_txg; /* first txg after spa_open() */ 75 uint64_t spa_freeze_txg; /* freeze pool at this txg */ 76 objset_t *spa_meta_objset; /* copy of dp->dp_meta_objset */ 77 txg_list_t spa_vdev_txg_list; /* per-txg dirty vdev list */ 78 vdev_t *spa_root_vdev; /* top-level vdev container */ 79 list_t spa_dirty_list; /* vdevs with dirty labels */ 80 uint64_t spa_config_object; /* MOS object for pool config */ 81 uint64_t spa_syncing_txg; /* txg currently syncing */ 82 uint64_t spa_sync_bplist_obj; /* object for deferred frees */ 83 bplist_t spa_sync_bplist; /* deferred-free bplist */ 84 krwlock_t spa_traverse_lock; /* traverse vs. spa_sync() */ 85 uberblock_t spa_ubsync; /* last synced uberblock */ 86 uberblock_t spa_uberblock; /* current uberblock */ 87 kmutex_t spa_scrub_lock; /* resilver/scrub lock */ 88 kthread_t *spa_scrub_thread; /* scrub/resilver thread */ 89 traverse_handle_t *spa_scrub_th; /* scrub traverse handle */ 90 uint64_t spa_scrub_restart_txg; /* need to restart */ 91 uint64_t spa_scrub_maxtxg; /* max txg we'll scrub */ 92 uint64_t spa_scrub_inflight; /* in-flight scrub I/Os */ 93 uint64_t spa_scrub_errors; /* scrub I/O error count */ 94 kcondvar_t spa_scrub_cv; /* scrub thread state change */ 95 kcondvar_t spa_scrub_io_cv; /* scrub I/O completion */ 96 uint8_t spa_scrub_stop; /* tell scrubber to stop */ 97 uint8_t spa_scrub_suspend; /* tell scrubber to suspend */ 98 uint8_t spa_scrub_active; /* active or suspended? */ 99 uint8_t spa_scrub_type; /* type of scrub we're doing */ 100 int spa_sync_on; /* sync threads are running */ 101 char *spa_root; /* alternate root directory */ 102 kmutex_t spa_uberblock_lock; /* vdev_uberblock_load_done() */ 103 /* 104 * spa_refcnt must be the last element because it changes size based on 105 * compilation options. In order for the MDB module to function 106 * correctly, the other fields must remain in the same location. 107 */ 108 refcount_t spa_refcount; /* number of opens */ 109 }; 110 111 extern const char *spa_config_dir; 112 extern kmutex_t spa_namespace_lock; 113 114 #ifdef __cplusplus 115 } 116 #endif 117 118 #endif /* _SYS_SPA_IMPL_H */ 119