/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2018, Intel Corporation. * Copyright (c) 2020 by Lawrence Livermore National Security, LLC. */ #ifndef _SYS_VDEV_REBUILD_H #define _SYS_VDEV_REBUILD_H #include #ifdef __cplusplus extern "C" { #endif /* * Number of entries in the physical vdev_rebuild_phys structure. This * state is stored per top-level as VDEV_ZAP_TOP_VDEV_REBUILD_PHYS. */ #define REBUILD_PHYS_ENTRIES 12 /* * On-disk rebuild configuration and state. When adding new fields they * must be added to the end of the structure. */ typedef struct vdev_rebuild_phys { uint64_t vrp_rebuild_state; /* vdev_rebuild_state_t */ uint64_t vrp_last_offset; /* last rebuilt offset */ uint64_t vrp_min_txg; /* minimum missing txg */ uint64_t vrp_max_txg; /* maximum missing txg */ uint64_t vrp_start_time; /* start time */ uint64_t vrp_end_time; /* end time */ uint64_t vrp_scan_time_ms; /* total run time in ms */ uint64_t vrp_bytes_scanned; /* alloc bytes scanned */ uint64_t vrp_bytes_issued; /* read bytes rebuilt */ uint64_t vrp_bytes_rebuilt; /* rebuilt bytes */ uint64_t vrp_bytes_est; /* total bytes to scan */ uint64_t vrp_errors; /* errors during rebuild */ } vdev_rebuild_phys_t; /* * The vdev_rebuild_t describes the current state and how a top-level vdev * should be rebuilt. The core elements are the top-vdev, the metaslab being * rebuilt, range tree containing the allocated extents and the on-disk state. */ typedef struct vdev_rebuild { vdev_t *vr_top_vdev; /* top-level vdev to rebuild */ metaslab_t *vr_scan_msp; /* scanning disabled metaslab */ range_tree_t *vr_scan_tree; /* scan ranges (in metaslab) */ kmutex_t vr_io_lock; /* inflight IO lock */ kcondvar_t vr_io_cv; /* inflight IO cv */ /* In-core state and progress */ uint64_t vr_scan_offset[TXG_SIZE]; uint64_t vr_prev_scan_time_ms; /* any previous scan time */ uint64_t vr_bytes_inflight_max; /* maximum bytes inflight */ uint64_t vr_bytes_inflight; /* current bytes inflight */ /* Per-rebuild pass statistics for calculating bandwidth */ uint64_t vr_pass_start_time; uint64_t vr_pass_bytes_scanned; uint64_t vr_pass_bytes_issued; /* On-disk state updated by vdev_rebuild_zap_update_sync() */ vdev_rebuild_phys_t vr_rebuild_phys; } vdev_rebuild_t; boolean_t vdev_rebuild_active(vdev_t *); int vdev_rebuild_load(vdev_t *); void vdev_rebuild(vdev_t *); void vdev_rebuild_stop_wait(vdev_t *); void vdev_rebuild_stop_all(spa_t *); void vdev_rebuild_restart(spa_t *); void vdev_rebuild_clear_sync(void *, dmu_tx_t *); int vdev_rebuild_get_stats(vdev_t *, vdev_rebuild_stat_t *); #ifdef __cplusplus } #endif #endif /* _SYS_VDEV_REBUILD_H */