/*
 * 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) 2017 by Lawrence Livermore National Security, LLC.
 */

#ifndef _SYS_MMP_H
#define	_SYS_MMP_H

#include <sys/spa.h>
#include <sys/zfs_context.h>
#include <sys/uberblock_impl.h>

#ifdef	__cplusplus
extern "C" {
#endif

#define	MMP_MIN_INTERVAL		100	/* ms */
#define	MMP_DEFAULT_INTERVAL		1000	/* ms */
#define	MMP_DEFAULT_IMPORT_INTERVALS	20
#define	MMP_DEFAULT_FAIL_INTERVALS	10
#define	MMP_MIN_FAIL_INTERVALS		2	/* min if != 0 */
#define	MMP_IMPORT_SAFETY_FACTOR	200	/* pct */
#define	MMP_INTERVAL_OK(interval)	MAX(interval, MMP_MIN_INTERVAL)
#define	MMP_FAIL_INTVS_OK(fails)	(fails == 0 ? 0 : MAX(fails, \
					    MMP_MIN_FAIL_INTERVALS))

typedef struct mmp_thread {
	kmutex_t	mmp_thread_lock; /* protect thread mgmt fields */
	kcondvar_t	mmp_thread_cv;
	kthread_t	*mmp_thread;
	uint8_t		mmp_thread_exiting;
	kmutex_t	mmp_io_lock;	/* protect below */
	hrtime_t	mmp_last_write;	/* last successful MMP write */
	uint64_t	mmp_delay;	/* decaying avg ns between MMP writes */
	uberblock_t	mmp_ub;		/* last ub written by sync */
	zio_t		*mmp_zio_root;	/* root of mmp write zios */
	uint64_t	mmp_kstat_id;	/* unique id for next MMP write kstat */
	int		mmp_skip_error; /* reason for last skipped write */
	vdev_t		*mmp_last_leaf;	/* last mmp write sent here */
	uint64_t	mmp_leaf_last_gen;	/* last mmp write sent here */
	uint32_t	mmp_seq;	/* intra-second update counter */
} mmp_thread_t;


extern void mmp_init(struct spa *spa);
extern void mmp_fini(struct spa *spa);
extern void mmp_thread_start(struct spa *spa);
extern void mmp_thread_stop(struct spa *spa);
extern void mmp_update_uberblock(struct spa *spa, struct uberblock *ub);
extern void mmp_signal_all_threads(void);

/* Global tuning */
extern ulong_t zfs_multihost_interval;
extern uint_t zfs_multihost_fail_intervals;
extern uint_t zfs_multihost_import_intervals;

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_MMP_H */
