/*
 * 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 <sys/spa.h>

#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 */
