1 // SPDX-License-Identifier: CDDL-1.0 2 /* 3 * CDDL HEADER START 4 * 5 * The contents of this file are subject to the terms of the 6 * Common Development and Distribution License (the "License"). 7 * You may not use this file except in compliance with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or https://opensource.org/licenses/CDDL-1.0. 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 (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 24 * Copyright (c) 2011, 2018 by Delphix. All rights reserved. 25 * Copyright (c) 2017, Intel Corporation. 26 */ 27 28 #ifndef _SYS_METASLAB_H 29 #define _SYS_METASLAB_H 30 31 #include <sys/spa.h> 32 #include <sys/space_map.h> 33 #include <sys/txg.h> 34 #include <sys/zio.h> 35 #include <sys/avl.h> 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 42 typedef struct metaslab_ops { 43 const char *msop_name; 44 uint64_t (*msop_alloc)(metaslab_t *, uint64_t, uint64_t, uint64_t *); 45 } metaslab_ops_t; 46 47 48 extern const metaslab_ops_t zfs_metaslab_ops; 49 50 int metaslab_init(metaslab_group_t *, uint64_t, uint64_t, uint64_t, 51 metaslab_t **); 52 void metaslab_fini(metaslab_t *); 53 54 void metaslab_set_unflushed_dirty(metaslab_t *, boolean_t); 55 void metaslab_set_unflushed_txg(metaslab_t *, uint64_t, dmu_tx_t *); 56 void metaslab_set_estimated_condensed_size(metaslab_t *, uint64_t, dmu_tx_t *); 57 boolean_t metaslab_unflushed_dirty(metaslab_t *); 58 uint64_t metaslab_unflushed_txg(metaslab_t *); 59 uint64_t metaslab_estimated_condensed_size(metaslab_t *); 60 int metaslab_sort_by_flushed(const void *, const void *); 61 void metaslab_unflushed_bump(metaslab_t *, dmu_tx_t *, boolean_t); 62 uint64_t metaslab_unflushed_changes_memused(metaslab_t *); 63 64 int metaslab_load(metaslab_t *); 65 void metaslab_unload(metaslab_t *); 66 boolean_t metaslab_flush(metaslab_t *, dmu_tx_t *); 67 68 uint64_t metaslab_allocated_space(metaslab_t *); 69 70 void metaslab_sync(metaslab_t *, uint64_t); 71 void metaslab_sync_done(metaslab_t *, uint64_t); 72 void metaslab_sync_reassess(metaslab_group_t *); 73 uint64_t metaslab_largest_allocatable(metaslab_t *); 74 75 /* 76 * metaslab alloc flags 77 */ 78 #define METASLAB_ZIL 0x1 79 #define METASLAB_GANG_HEADER 0x2 80 #define METASLAB_GANG_CHILD 0x4 81 #define METASLAB_ASYNC_ALLOC 0x8 82 83 int metaslab_alloc(spa_t *, metaslab_class_t *, uint64_t, blkptr_t *, int, 84 uint64_t, const blkptr_t *, int, zio_alloc_list_t *, int, const void *); 85 int metaslab_alloc_range(spa_t *, metaslab_class_t *, uint64_t, uint64_t, 86 blkptr_t *, int, uint64_t, const blkptr_t *, int, zio_alloc_list_t *, 87 int, const void *, uint64_t *); 88 int metaslab_alloc_dva(spa_t *, metaslab_class_t *, uint64_t, 89 dva_t *, int, const dva_t *, uint64_t, int, zio_alloc_list_t *, int); 90 void metaslab_free(spa_t *, const blkptr_t *, uint64_t, boolean_t); 91 void metaslab_free_concrete(vdev_t *, uint64_t, uint64_t, boolean_t); 92 void metaslab_free_dva(spa_t *, const dva_t *, boolean_t); 93 void metaslab_free_impl_cb(uint64_t, vdev_t *, uint64_t, uint64_t, void *); 94 void metaslab_unalloc_dva(spa_t *, const dva_t *, uint64_t); 95 int metaslab_claim(spa_t *, const blkptr_t *, uint64_t); 96 int metaslab_claim_impl(vdev_t *, uint64_t, uint64_t, uint64_t); 97 void metaslab_check_free(spa_t *, const blkptr_t *); 98 99 void metaslab_stat_init(void); 100 void metaslab_stat_fini(void); 101 void metaslab_trace_move(zio_alloc_list_t *, zio_alloc_list_t *); 102 void metaslab_trace_init(zio_alloc_list_t *); 103 void metaslab_trace_fini(zio_alloc_list_t *); 104 105 metaslab_class_t *metaslab_class_create(spa_t *, const char *, 106 const metaslab_ops_t *, boolean_t); 107 void metaslab_class_destroy(metaslab_class_t *); 108 void metaslab_class_validate(metaslab_class_t *); 109 void metaslab_class_balance(metaslab_class_t *mc, boolean_t onsync); 110 void metaslab_class_histogram_verify(metaslab_class_t *); 111 uint64_t metaslab_class_fragmentation(metaslab_class_t *); 112 uint64_t metaslab_class_expandable_space(metaslab_class_t *); 113 boolean_t metaslab_class_throttle_reserve(metaslab_class_t *, int, zio_t *, 114 boolean_t, boolean_t *); 115 boolean_t metaslab_class_throttle_unreserve(metaslab_class_t *, int, zio_t *); 116 void metaslab_class_evict_old(metaslab_class_t *, uint64_t); 117 const char *metaslab_class_get_name(metaslab_class_t *); 118 uint64_t metaslab_class_get_alloc(metaslab_class_t *); 119 uint64_t metaslab_class_get_space(metaslab_class_t *); 120 uint64_t metaslab_class_get_dspace(metaslab_class_t *); 121 uint64_t metaslab_class_get_deferred(metaslab_class_t *); 122 123 void metaslab_space_update(vdev_t *, metaslab_class_t *, 124 int64_t, int64_t, int64_t); 125 126 metaslab_group_t *metaslab_group_create(metaslab_class_t *, vdev_t *); 127 void metaslab_group_destroy(metaslab_group_t *); 128 void metaslab_group_activate(metaslab_group_t *); 129 void metaslab_group_passivate(metaslab_group_t *); 130 boolean_t metaslab_group_initialized(metaslab_group_t *); 131 uint64_t metaslab_group_get_space(metaslab_group_t *); 132 void metaslab_group_histogram_verify(metaslab_group_t *); 133 uint64_t metaslab_group_fragmentation(metaslab_group_t *); 134 void metaslab_group_histogram_remove(metaslab_group_t *, metaslab_t *); 135 void metaslab_group_alloc_increment_all(spa_t *, blkptr_t *, int, int, 136 uint64_t, const void *); 137 void metaslab_group_alloc_decrement(spa_t *, uint64_t, int, int, uint64_t, 138 const void *); 139 void metaslab_recalculate_weight_and_sort(metaslab_t *); 140 void metaslab_disable(metaslab_t *); 141 void metaslab_enable(metaslab_t *, boolean_t, boolean_t); 142 void metaslab_set_selected_txg(metaslab_t *, uint64_t); 143 144 extern int metaslab_debug_load; 145 146 zfs_range_seg_type_t metaslab_calculate_range_tree_type(vdev_t *vdev, 147 metaslab_t *msp, uint64_t *start, uint64_t *shift); 148 149 #ifdef __cplusplus 150 } 151 #endif 152 153 #endif /* _SYS_METASLAB_H */ 154