/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM hugetlbfs

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

#include <linux/tracepoint.h>

TRACE_EVENT(hugetlbfs_alloc_inode,

	TP_PROTO(struct inode *inode, struct inode *dir, int mode),

	TP_ARGS(inode, dir, mode),

	TP_STRUCT__entry(
		__field(u64,		ino)
		__field(u64,		dir)
		__field(dev_t,		dev)
		__field(__u16,		mode)
	),

	TP_fast_assign(
		__entry->dev		= inode->i_sb->s_dev;
		__entry->ino		= inode->i_ino;
		__entry->dir		= dir ? dir->i_ino : 0;
		__entry->mode		= mode;
	),

	TP_printk("dev %d,%d ino %llu dir %llu mode 0%o",
		MAJOR(__entry->dev), MINOR(__entry->dev),
		__entry->ino,
		__entry->dir, __entry->mode)
);

DECLARE_EVENT_CLASS(hugetlbfs__inode,

	TP_PROTO(struct inode *inode),

	TP_ARGS(inode),

	TP_STRUCT__entry(
		__field(u64,		ino)
		__field(loff_t,		size)
		__field(blkcnt_t,	blocks)
		__field(dev_t,		dev)
		__field(unsigned int,	nlink)
		__field(unsigned int,	seals)
		__field(__u16,		mode)
	),

	TP_fast_assign(
		__entry->dev		= inode->i_sb->s_dev;
		__entry->ino		= inode->i_ino;
		__entry->mode		= inode->i_mode;
		__entry->size		= inode->i_size;
		__entry->nlink		= inode->i_nlink;
		__entry->seals		= HUGETLBFS_I(inode)->seals;
		__entry->blocks		= inode->i_blocks;
	),

	TP_printk("dev %d,%d ino %llu mode 0%o size %lld nlink %u seals %u blocks %llu",
		MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino,
		__entry->mode, __entry->size, __entry->nlink, __entry->seals,
		(unsigned long long)__entry->blocks)
);

DEFINE_EVENT(hugetlbfs__inode, hugetlbfs_evict_inode,

	TP_PROTO(struct inode *inode),

	TP_ARGS(inode)
);

DEFINE_EVENT(hugetlbfs__inode, hugetlbfs_free_inode,

	TP_PROTO(struct inode *inode),

	TP_ARGS(inode)
);

TRACE_EVENT(hugetlbfs_setattr,

	TP_PROTO(struct inode *inode, struct dentry *dentry,
		struct iattr *attr),

	TP_ARGS(inode, dentry, attr),

	TP_STRUCT__entry(
		__field(u64,		ino)
		__field(loff_t,		old_size)
		__field(loff_t,		ia_size)
		__field(dev_t,		dev)
		__field(unsigned int,	d_len)
		__string(d_name,	dentry->d_name.name)
		__field(unsigned int,	ia_valid)
		__field(unsigned int,	ia_mode)
	),

	TP_fast_assign(
		__entry->dev		= inode->i_sb->s_dev;
		__entry->ino		= inode->i_ino;
		__entry->d_len		= dentry->d_name.len;
		__assign_str(d_name);
		__entry->ia_valid	= attr->ia_valid;
		__entry->ia_mode	= attr->ia_mode;
		__entry->old_size	= inode->i_size;
		__entry->ia_size	= attr->ia_size;
	),

	TP_printk("dev %d,%d ino %llu name %.*s valid %#x mode 0%o old_size %lld size %lld",
		MAJOR(__entry->dev), MINOR(__entry->dev), __entry->ino,
		__entry->d_len, __get_str(d_name), __entry->ia_valid, __entry->ia_mode,
		__entry->old_size, __entry->ia_size)
);

TRACE_EVENT(hugetlbfs_fallocate,

	TP_PROTO(struct inode *inode, int mode,
		loff_t offset, loff_t len, int ret),

	TP_ARGS(inode, mode, offset, len, ret),

	TP_STRUCT__entry(
		__field(u64,		ino)
		__field(loff_t,		offset)
		__field(loff_t,		len)
		__field(loff_t,		size)
		__field(dev_t,		dev)
		__field(int,		mode)
		__field(int,		ret)
	),

	TP_fast_assign(
		__entry->dev		= inode->i_sb->s_dev;
		__entry->ino		= inode->i_ino;
		__entry->mode		= mode;
		__entry->offset		= offset;
		__entry->len		= len;
		__entry->size		= inode->i_size;
		__entry->ret		= ret;
	),

	TP_printk("dev %d,%d ino %llu mode 0%o offset %lld len %lld size %lld ret %d",
		MAJOR(__entry->dev), MINOR(__entry->dev),
		__entry->ino, __entry->mode,
		(unsigned long long)__entry->offset,
		(unsigned long long)__entry->len,
		(unsigned long long)__entry->size,
		__entry->ret)
);

#endif /* _TRACE_HUGETLBFS_H */

 /* This part must be outside protection */
#include <trace/define_trace.h>
