/*
 * CDDL HEADER START
 *
 * This file and its contents are supplied under the terms of the
 * Common Development and Distribution License ("CDDL"), version 1.0.
 * You may only use this file in accordance with the terms of version
 * 1.0 of the CDDL.
 *
 * A full copy of the text of the CDDL should have accompanied this
 * source.  A copy of the CDDL is also available via the Internet at
 * http://www.illumos.org/license/CDDL.
 *
 * CDDL HEADER END
 */

/*
 * Copyright (c) 2014, 2019 by Delphix. All rights reserved.
 */

#ifndef _SYS_VDEV_REMOVAL_H
#define	_SYS_VDEV_REMOVAL_H

#include <sys/spa.h>
#include <sys/bpobj.h>
#include <sys/vdev_indirect_mapping.h>
#include <sys/vdev_indirect_births.h>

#ifdef	__cplusplus
extern "C" {
#endif

typedef struct spa_vdev_removal {
	uint64_t	svr_vdev_id;
	uint64_t	svr_max_offset_to_sync[TXG_SIZE];
	/* Thread performing a vdev removal. */
	kthread_t	*svr_thread;
	/* Segments left to copy from the current metaslab. */
	range_tree_t	*svr_allocd_segs;
	kmutex_t	svr_lock;
	kcondvar_t	svr_cv;
	boolean_t	svr_thread_exit;

	/*
	 * New mappings to write out each txg.
	 */
	list_t		svr_new_segments[TXG_SIZE];

	/*
	 * Ranges that were freed while a mapping was in flight.  This is
	 * a subset of the ranges covered by vdev_im_new_segments.
	 */
	range_tree_t	*svr_frees[TXG_SIZE];

	/*
	 * Number of bytes which we have finished our work for
	 * in each txg.  This could be data copied (which will be part of
	 * the mappings in vdev_im_new_segments), or data freed before
	 * we got around to copying it.
	 */
	uint64_t	svr_bytes_done[TXG_SIZE];

	/* List of leaf zap objects to be unlinked */
	nvlist_t	*svr_zaplist;
} spa_vdev_removal_t;

typedef struct spa_condensing_indirect {
	/*
	 * New mappings to write out each txg.
	 */
	list_t		sci_new_mapping_entries[TXG_SIZE];

	vdev_indirect_mapping_t *sci_new_mapping;
} spa_condensing_indirect_t;

extern int spa_remove_init(spa_t *);
extern void spa_restart_removal(spa_t *);
extern int spa_condense_init(spa_t *);
extern void spa_condense_fini(spa_t *);
extern void spa_start_indirect_condensing_thread(spa_t *);
extern void spa_vdev_condense_suspend(spa_t *);
extern int spa_vdev_remove(spa_t *, uint64_t, boolean_t);
extern void free_from_removing_vdev(vdev_t *, uint64_t, uint64_t);
extern int spa_removal_get_stats(spa_t *, pool_removal_stat_t *);
extern void svr_sync(spa_t *, dmu_tx_t *);
extern void spa_vdev_remove_suspend(spa_t *);
extern int spa_vdev_remove_cancel(spa_t *);
extern void spa_vdev_removal_destroy(spa_vdev_removal_t *);
extern uint64_t spa_remove_max_segment(spa_t *);

extern int vdev_removal_max_span;

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_VDEV_REMOVAL_H */
