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