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

#if defined(_KERNEL) && defined(HAVE_DECLARE_EVENT_CLASS)

#undef TRACE_SYSTEM
#define	TRACE_SYSTEM zfs

#undef TRACE_SYSTEM_VAR
#define	TRACE_SYSTEM_VAR zfs_vdev

#if !defined(_TRACE_VDEV_H) || defined(TRACE_HEADER_MULTI_READ)
#define	_TRACE_VDEV_H

#include <linux/tracepoint.h>
#include <sys/types.h>

/*
 * Generic support for three argument tracepoints of the form:
 *
 * DTRACE_PROBE3(...,
 *     spa_t *, ...,
 *     uint64_t, ...,
 *     uint64_t, ...);
 */
/* BEGIN CSTYLED */
DECLARE_EVENT_CLASS(zfs_removing_class_3,
	TP_PROTO(spa_t *spa, uint64_t offset, uint64_t size),
	TP_ARGS(spa, offset, size),
	TP_STRUCT__entry(
	    __field(spa_t *,	vdev_spa)
	    __field(uint64_t,	vdev_offset)
	    __field(uint64_t,	vdev_size)
	),
	TP_fast_assign(
	    __entry->vdev_spa	= spa;
	    __entry->vdev_offset = offset;
	    __entry->vdev_size	= size;
	),
	TP_printk("spa %p offset %llu size %llu",
	    __entry->vdev_spa, __entry->vdev_offset,
	    __entry->vdev_size)
);
/* END CSTYLED */

/* BEGIN CSTYLED */
#define DEFINE_REMOVE_FREE_EVENT(name) \
DEFINE_EVENT(zfs_removing_class_3, name, \
	TP_PROTO(spa_t *spa, uint64_t offset, uint64_t size), \
	TP_ARGS(spa, offset, size))
/* END CSTYLED */
DEFINE_REMOVE_FREE_EVENT(zfs_remove__free__synced);
DEFINE_REMOVE_FREE_EVENT(zfs_remove__free__unvisited);

/*
 * Generic support for four argument tracepoints of the form:
 *
 * DTRACE_PROBE4(...,
 *     spa_t *, ...,
 *     uint64_t, ...,
 *     uint64_t, ...,
 *     uint64_t, ...);
 */
/* BEGIN CSTYLED */
DECLARE_EVENT_CLASS(zfs_removing_class_4,
	TP_PROTO(spa_t *spa, uint64_t offset, uint64_t size, uint64_t txg),
	TP_ARGS(spa, offset, size, txg),
	TP_STRUCT__entry(
	    __field(spa_t *,	vdev_spa)
	    __field(uint64_t,	vdev_offset)
	    __field(uint64_t,	vdev_size)
	    __field(uint64_t,	vdev_txg)
	),
	TP_fast_assign(
	    __entry->vdev_spa	= spa;
	    __entry->vdev_offset = offset;
	    __entry->vdev_size	= size;
	    __entry->vdev_txg	= txg;
	),
	TP_printk("spa %p offset %llu size %llu txg %llu",
	    __entry->vdev_spa, __entry->vdev_offset,
	    __entry->vdev_size, __entry->vdev_txg)
);

/* BEGIN CSTYLED */
#define DEFINE_REMOVE_FREE_EVENT_TXG(name) \
DEFINE_EVENT(zfs_removing_class_4, name, \
	TP_PROTO(spa_t *spa, uint64_t offset, uint64_t size,uint64_t txg), \
	TP_ARGS(spa, offset, size, txg))
/* END CSTYLED */
DEFINE_REMOVE_FREE_EVENT_TXG(zfs_remove__free__inflight);

#endif /* _TRACE_VDEV_H */

#undef TRACE_INCLUDE_PATH
#undef TRACE_INCLUDE_FILE
#define	TRACE_INCLUDE_PATH sys
#define	TRACE_INCLUDE_FILE trace_vdev
#include <trace/define_trace.h>

#endif /* _KERNEL && HAVE_DECLARE_EVENT_CLASS */
