1121966Smikeh/*
279971Sobrien * CDDL HEADER START
379971Sobrien *
4116424Smikeh * The contents of this file are subject to the terms of the
579971Sobrien * Common Development and Distribution License (the "License").
679971Sobrien * You may not use this file except in compliance with the License.
779971Sobrien *
879971Sobrien * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
979971Sobrien * or https://opensource.org/licenses/CDDL-1.0.
1079971Sobrien * See the License for the specific language governing permissions
1179971Sobrien * and limitations under the License.
1279971Sobrien *
1379971Sobrien * When distributing Covered Code, include this CDDL HEADER in each
1479971Sobrien * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1579971Sobrien * If applicable, add the following below this CDDL HEADER, with the
1679971Sobrien * fields enclosed by brackets "[]" replaced with your own identifying
1779971Sobrien * information: Portions Copyright [yyyy] [name of copyright owner]
1879971Sobrien *
1979971Sobrien * CDDL HEADER END
2079971Sobrien */
2179971Sobrien
2279971Sobrien#if defined(_KERNEL)
2379971Sobrien#if defined(HAVE_DECLARE_EVENT_CLASS)
2479971Sobrien
2579971Sobrien#undef TRACE_SYSTEM
2679971Sobrien#define	TRACE_SYSTEM zfs
2779971Sobrien
2879971Sobrien#undef TRACE_SYSTEM_VAR
2979971Sobrien#define	TRACE_SYSTEM_VAR zfs_acl
3079971Sobrien
3179971Sobrien#if !defined(_TRACE_ACL_H) || defined(TRACE_HEADER_MULTI_READ)
3279971Sobrien#define	_TRACE_ACL_H
3379971Sobrien
3479971Sobrien#include <linux/tracepoint.h>
3579971Sobrien#include <linux/vfs_compat.h>
3679971Sobrien#include <sys/types.h>
3779971Sobrien
3879971Sobrien/*
3979971Sobrien * Generic support for three argument tracepoints of the form:
4079971Sobrien *
4179971Sobrien * DTRACE_PROBE3(...,
4279971Sobrien *     znode_t *, ...,
4379971Sobrien *     zfs_ace_hdr_t *, ...,
4479971Sobrien *     uint32_t, ...);
4579971Sobrien */
4679971Sobrien/* BEGIN CSTYLED */
4779971SobrienDECLARE_EVENT_CLASS(zfs_ace_class,
4879971Sobrien	TP_PROTO(znode_t *zn, zfs_ace_hdr_t *ace, uint32_t mask_matched),
4979971Sobrien	TP_ARGS(zn, ace, mask_matched),
5079971Sobrien	TP_STRUCT__entry(
5179971Sobrien	    __field(uint64_t,		z_id)
5279971Sobrien	    __field(uint8_t,		z_unlinked)
5379971Sobrien	    __field(uint8_t,		z_atime_dirty)
5479971Sobrien	    __field(uint8_t,		z_zn_prefetch)
55121966Smikeh	    __field(uint_t,		z_blksz)
5679971Sobrien	    __field(uint_t,		z_seq)
5779971Sobrien	    __field(uint64_t,		z_mapcnt)
5879971Sobrien	    __field(uint64_t,		z_size)
5979971Sobrien	    __field(uint64_t,		z_pflags)
6079971Sobrien	    __field(uint32_t,		z_sync_cnt)
6179971Sobrien	    __field(uint32_t,		z_sync_writes_cnt)
6279971Sobrien	    __field(uint32_t,		z_async_writes_cnt)
6379971Sobrien	    __field(mode_t,		z_mode)
6479971Sobrien	    __field(boolean_t,		z_is_sa)
6579971Sobrien	    __field(boolean_t,		z_is_ctldir)
6679971Sobrien
6779971Sobrien	    __field(uint32_t,		i_uid)
6879971Sobrien	    __field(uint32_t,		i_gid)
6979971Sobrien	    __field(unsigned long,	i_ino)
7079971Sobrien	    __field(unsigned int,	i_nlink)
7179971Sobrien	    __field(loff_t,		i_size)
72116424Smikeh	    __field(unsigned int,	i_blkbits)
73116424Smikeh	    __field(unsigned short,	i_bytes)
74121966Smikeh	    __field(umode_t,		i_mode)
75116424Smikeh	    __field(__u32,		i_generation)
76116424Smikeh
7779971Sobrien	    __field(uint16_t,		z_type)
7879971Sobrien	    __field(uint16_t,		z_flags)
7979971Sobrien	    __field(uint32_t,		z_access_mask)
80116424Smikeh
81116424Smikeh	    __field(uint32_t,		mask_matched)
82116424Smikeh	),
83116424Smikeh	TP_fast_assign(
84116424Smikeh	    __entry->z_id		= zn->z_id;
85116424Smikeh	    __entry->z_unlinked		= zn->z_unlinked;
8679971Sobrien	    __entry->z_atime_dirty	= zn->z_atime_dirty;
87116424Smikeh	    __entry->z_zn_prefetch	= zn->z_zn_prefetch;
88116424Smikeh	    __entry->z_blksz		= zn->z_blksz;
89116424Smikeh	    __entry->z_seq		= zn->z_seq;
90116424Smikeh	    __entry->z_mapcnt		= zn->z_mapcnt;
91116424Smikeh	    __entry->z_size		= zn->z_size;
92116424Smikeh	    __entry->z_pflags		= zn->z_pflags;
93116424Smikeh	    __entry->z_sync_cnt		= zn->z_sync_cnt;
94116424Smikeh	    __entry->z_sync_writes_cnt	= zn->z_sync_writes_cnt;
95116424Smikeh	    __entry->z_async_writes_cnt	= zn->z_async_writes_cnt;
96116424Smikeh	    __entry->z_mode		= zn->z_mode;
97116424Smikeh	    __entry->z_is_sa		= zn->z_is_sa;
98116424Smikeh	    __entry->z_is_ctldir	= zn->z_is_ctldir;
99116424Smikeh
100116424Smikeh	    __entry->i_uid		= KUID_TO_SUID(ZTOI(zn)->i_uid);
10179971Sobrien	    __entry->i_gid		= KGID_TO_SGID(ZTOI(zn)->i_gid);
10279971Sobrien	    __entry->i_ino		= zn->z_inode.i_ino;
10379971Sobrien	    __entry->i_nlink		= zn->z_inode.i_nlink;
104116424Smikeh	    __entry->i_size		= zn->z_inode.i_size;
105116424Smikeh	    __entry->i_blkbits		= zn->z_inode.i_blkbits;
10679971Sobrien	    __entry->i_bytes		= zn->z_inode.i_bytes;
10779971Sobrien	    __entry->i_mode		= zn->z_inode.i_mode;
10879971Sobrien	    __entry->i_generation	= zn->z_inode.i_generation;
10979971Sobrien
11079971Sobrien	    __entry->z_type		= ace->z_type;
11179971Sobrien	    __entry->z_flags		= ace->z_flags;
11279971Sobrien	    __entry->z_access_mask	= ace->z_access_mask;
11379971Sobrien
11479971Sobrien	    __entry->mask_matched	= mask_matched;
11579971Sobrien	),
11679971Sobrien	TP_printk("zn { id %llu unlinked %u atime_dirty %u "
11779971Sobrien	    "zn_prefetch %u blksz %u seq %u "
11879971Sobrien	    "mapcnt %llu size %llu pflags %llu "
11979971Sobrien	    "sync_cnt %u sync_writes_cnt %u async_writes_cnt %u "
12079971Sobrien	    "mode 0x%x is_sa %d is_ctldir %d "
12179971Sobrien	    "inode { uid %u gid %u ino %lu nlink %u size %lli "
12279971Sobrien	    "blkbits %u bytes %u mode 0x%x generation %x } } "
12379971Sobrien	    "ace { type %u flags %u access_mask %u } mask_matched %u",
12479971Sobrien	    __entry->z_id, __entry->z_unlinked, __entry->z_atime_dirty,
12579971Sobrien	    __entry->z_zn_prefetch, __entry->z_blksz,
12679971Sobrien	    __entry->z_seq, __entry->z_mapcnt, __entry->z_size,
12779971Sobrien	    __entry->z_pflags, __entry->z_sync_cnt,
12879971Sobrien	    __entry->z_sync_writes_cnt, __entry->z_async_writes_cnt,
12979971Sobrien	    __entry->z_mode, __entry->z_is_sa, __entry->z_is_ctldir,
13079971Sobrien	    __entry->i_uid, __entry->i_gid, __entry->i_ino, __entry->i_nlink,
13179971Sobrien	    __entry->i_size, __entry->i_blkbits,
13279971Sobrien	    __entry->i_bytes, __entry->i_mode, __entry->i_generation,
13379971Sobrien	    __entry->z_type, __entry->z_flags, __entry->z_access_mask,
13479971Sobrien	    __entry->mask_matched)
13579971Sobrien);
13679971Sobrien/* END CSTYLED */
13779971Sobrien
13879971Sobrien#define	DEFINE_ACE_EVENT(name) \
13979971SobrienDEFINE_EVENT(zfs_ace_class, name, \
14079971Sobrien    TP_PROTO(znode_t *zn, zfs_ace_hdr_t *ace, uint32_t mask_matched), \
14179971Sobrien    TP_ARGS(zn, ace, mask_matched))
14279971SobrienDEFINE_ACE_EVENT(zfs_zfs__ace__denies);
14379971SobrienDEFINE_ACE_EVENT(zfs_zfs__ace__allows);
14479971Sobrien
14579971Sobrien#endif /* _TRACE_ACL_H */
14679971Sobrien
14779971Sobrien#undef TRACE_INCLUDE_PATH
14879971Sobrien#undef TRACE_INCLUDE_FILE
14979971Sobrien#define	TRACE_INCLUDE_PATH sys
15079971Sobrien#define	TRACE_INCLUDE_FILE trace_acl
15179971Sobrien#include <trace/define_trace.h>
15279971Sobrien
15379971Sobrien#else
15479971Sobrien
15579971SobrienDEFINE_DTRACE_PROBE3(zfs__ace__denies);
15679971SobrienDEFINE_DTRACE_PROBE3(zfs__ace__allows);
15779971SobrienDEFINE_DTRACE_PROBE(zfs__fastpath__execute__access__miss);
15879971Sobrien
15979971Sobrien#endif /* HAVE_DECLARE_EVENT_CLASS */
16079971Sobrien#endif /* _KERNEL */
16179971Sobrien