linux/include/trace/events/afs.h

/* SPDX-License-Identifier: GPL-2.0-or-later */
/* AFS tracepoints
 *
 * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
 * Written by David Howells ([email protected])
 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM

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

#include <linux/tracepoint.h>

/*
 * Define enums for tracing information.
 */
#ifndef __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
#define __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY

enum afs_fs_operation {};

enum afs_vl_operation {};

enum afs_cm_operation {};

enum yfs_cm_operation {};

#endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */

/*
 * Declare tracing information enums and their string mappings for display.
 */
#define afs_call_traces

#define afs_server_traces

#define afs_volume_traces

#define afs_cell_traces

#define afs_alist_traces

#define afs_estate_traces

#define afs_fs_operations

#define afs_vl_operations

#define afs_cm_operations

#define yfs_cm_operations

#define afs_edit_dir_ops

#define afs_edit_dir_reasons

#define afs_eproto_causes

#define afs_io_errors

#define afs_file_errors

#define afs_flock_types

#define afs_flock_states

#define afs_flock_events

#define afs_flock_operations

#define afs_cb_break_reasons

#define afs_rotate_traces

/*
 * Generate enums for tracing information.
 */
#ifndef __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY
#define __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY

#undef EM
#undef E_
#define EM(a, b)
#define E_(a, b)

enum afs_alist_trace		{} __mode();
enum afs_call_trace		{} __mode();
enum afs_cb_break_reason	{} __mode();
enum afs_cell_trace		{} __mode();
enum afs_edit_dir_op		{} __mode();
enum afs_edit_dir_reason	{} __mode();
enum afs_eproto_cause		{} __mode();
enum afs_estate_trace		{} __mode();
enum afs_file_error		{} __mode();
enum afs_flock_event		{} __mode();
enum afs_flock_operation	{} __mode();
enum afs_io_error		{} __mode();
enum afs_rotate_trace		{} __mode();
enum afs_server_trace		{} __mode();
enum afs_volume_trace		{} __mode();

#endif /* end __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY */

/*
 * Export enum symbols via userspace.
 */
#undef EM
#undef E_
#define EM(a, b)
#define E_(a, b)

afs_alist_traces;
afs_call_traces;
afs_cb_break_reasons;
afs_cell_traces;
afs_cm_operations;
afs_edit_dir_ops;
afs_edit_dir_reasons;
afs_eproto_causes;
afs_estate_traces;
afs_file_errors;
afs_flock_operations;
afs_flock_types;
afs_fs_operations;
afs_io_errors;
afs_rotate_traces;
afs_server_traces;
afs_vl_operations;
yfs_cm_operations;

/*
 * Now redefine the EM() and E_() macros to map the enums to the strings that
 * will be printed in the output.
 */
#undef EM
#undef E_
#define EM(a, b)
#define E_(a, b)

TRACE_EVENT(afs_receive_data,
	    TP_PROTO(struct afs_call *call, struct iov_iter *iter,
		     bool want_more, int ret),

	    TP_ARGS(call, iter, want_more, ret),

	    TP_STRUCT__entry(
		    __field(loff_t,			remain)
		    __field(unsigned int,		call)
		    __field(enum afs_call_state,	state)
		    __field(unsigned short,		unmarshall)
		    __field(bool,			want_more)
		    __field(int,			ret)
			     ),

	    TP_fast_assign(
		    __entry->call	= call->debug_id;
		    __entry->state	= call->state;
		    __entry->unmarshall	= call->unmarshall;
		    __entry->remain	= iov_iter_count(iter);
		    __entry->want_more	= want_more;
		    __entry->ret	= ret;
			   ),

	    TP_printk("c=%08x r=%llu u=%u w=%u s=%u ret=%d",
		      __entry->call,
		      __entry->remain,
		      __entry->unmarshall,
		      __entry->want_more,
		      __entry->state,
		      __entry->ret)
	    );

TRACE_EVENT(afs_notify_call,
	    TP_PROTO(struct rxrpc_call *rxcall, struct afs_call *call),

	    TP_ARGS(rxcall, call),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(enum afs_call_state,	state)
		    __field(unsigned short,		unmarshall)
			     ),

	    TP_fast_assign(
		    __entry->call	= call->debug_id;
		    __entry->state	= call->state;
		    __entry->unmarshall	= call->unmarshall;
			   ),

	    TP_printk("c=%08x s=%u u=%u",
		      __entry->call,
		      __entry->state, __entry->unmarshall)
	    );

TRACE_EVENT(afs_cb_call,
	    TP_PROTO(struct afs_call *call),

	    TP_ARGS(call),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(u32,			op)
		    __field(u16,			service_id)
			     ),

	    TP_fast_assign(
		    __entry->call	= call->debug_id;
		    __entry->op		= call->operation_ID;
		    __entry->service_id	= call->service_id;
			   ),

	    TP_printk("c=%08x %s",
		      __entry->call,
		      __entry->service_id == 2501 ?
		      __print_symbolic(__entry->op, yfs_cm_operations) :
		      __print_symbolic(__entry->op, afs_cm_operations))
	    );

TRACE_EVENT(afs_call,
	    TP_PROTO(unsigned int call_debug_id, enum afs_call_trace op,
		     int ref, int outstanding, const void *where),

	    TP_ARGS(call_debug_id, op, ref, outstanding, where),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(int,			op)
		    __field(int,			ref)
		    __field(int,			outstanding)
		    __field(const void *,		where)
			     ),

	    TP_fast_assign(
		    __entry->call = call_debug_id;
		    __entry->op = op;
		    __entry->ref = ref;
		    __entry->outstanding = outstanding;
		    __entry->where = where;
			   ),

	    TP_printk("c=%08x %s r=%d o=%d sp=%pSR",
		      __entry->call,
		      __print_symbolic(__entry->op, afs_call_traces),
		      __entry->ref,
		      __entry->outstanding,
		      __entry->where)
	    );

TRACE_EVENT(afs_make_fs_call,
	    TP_PROTO(struct afs_call *call, const struct afs_fid *fid),

	    TP_ARGS(call, fid),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(enum afs_fs_operation,	op)
		    __field_struct(struct afs_fid,	fid)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->op = call->operation_ID;
		    if (fid) {
			    __entry->fid = *fid;
		    } else {
			    __entry->fid.vid = 0;
			    __entry->fid.vnode = 0;
			    __entry->fid.unique = 0;
		    }
			   ),

	    TP_printk("c=%08x %06llx:%06llx:%06x %s",
		      __entry->call,
		      __entry->fid.vid,
		      __entry->fid.vnode,
		      __entry->fid.unique,
		      __print_symbolic(__entry->op, afs_fs_operations))
	    );

TRACE_EVENT(afs_make_fs_calli,
	    TP_PROTO(struct afs_call *call, const struct afs_fid *fid,
		     unsigned int i),

	    TP_ARGS(call, fid, i),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(unsigned int,		i)
		    __field(enum afs_fs_operation,	op)
		    __field_struct(struct afs_fid,	fid)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->i = i;
		    __entry->op = call->operation_ID;
		    if (fid) {
			    __entry->fid = *fid;
		    } else {
			    __entry->fid.vid = 0;
			    __entry->fid.vnode = 0;
			    __entry->fid.unique = 0;
		    }
			   ),

	    TP_printk("c=%08x %06llx:%06llx:%06x %s i=%u",
		      __entry->call,
		      __entry->fid.vid,
		      __entry->fid.vnode,
		      __entry->fid.unique,
		      __print_symbolic(__entry->op, afs_fs_operations),
		      __entry->i)
	    );

TRACE_EVENT(afs_make_fs_call1,
	    TP_PROTO(struct afs_call *call, const struct afs_fid *fid,
		     const struct qstr *name),

	    TP_ARGS(call, fid, name),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(enum afs_fs_operation,	op)
		    __field_struct(struct afs_fid,	fid)
		    __array(char,			name, 24)
			     ),

	    TP_fast_assign(
		    unsigned int __len = min_t(unsigned int, name->len, 23);
		    __entry->call = call->debug_id;
		    __entry->op = call->operation_ID;
		    if (fid) {
			    __entry->fid = *fid;
		    } else {
			    __entry->fid.vid = 0;
			    __entry->fid.vnode = 0;
			    __entry->fid.unique = 0;
		    }
		    memcpy(__entry->name, name->name, __len);
		    __entry->name[__len] = 0;
			   ),

	    TP_printk("c=%08x %06llx:%06llx:%06x %s \"%s\"",
		      __entry->call,
		      __entry->fid.vid,
		      __entry->fid.vnode,
		      __entry->fid.unique,
		      __print_symbolic(__entry->op, afs_fs_operations),
		      __entry->name)
	    );

TRACE_EVENT(afs_make_fs_call2,
	    TP_PROTO(struct afs_call *call, const struct afs_fid *fid,
		     const struct qstr *name, const struct qstr *name2),

	    TP_ARGS(call, fid, name, name2),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(enum afs_fs_operation,	op)
		    __field_struct(struct afs_fid,	fid)
		    __array(char,			name, 24)
		    __array(char,			name2, 24)
			     ),

	    TP_fast_assign(
		    unsigned int __len = min_t(unsigned int, name->len, 23);
		    unsigned int __len2 = min_t(unsigned int, name2->len, 23);
		    __entry->call = call->debug_id;
		    __entry->op = call->operation_ID;
		    if (fid) {
			    __entry->fid = *fid;
		    } else {
			    __entry->fid.vid = 0;
			    __entry->fid.vnode = 0;
			    __entry->fid.unique = 0;
		    }
		    memcpy(__entry->name, name->name, __len);
		    __entry->name[__len] = 0;
		    memcpy(__entry->name2, name2->name, __len2);
		    __entry->name2[__len2] = 0;
			   ),

	    TP_printk("c=%08x %06llx:%06llx:%06x %s \"%s\" \"%s\"",
		      __entry->call,
		      __entry->fid.vid,
		      __entry->fid.vnode,
		      __entry->fid.unique,
		      __print_symbolic(__entry->op, afs_fs_operations),
		      __entry->name,
		      __entry->name2)
	    );

TRACE_EVENT(afs_make_vl_call,
	    TP_PROTO(struct afs_call *call),

	    TP_ARGS(call),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(enum afs_vl_operation,	op)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->op = call->operation_ID;
			   ),

	    TP_printk("c=%08x %s",
		      __entry->call,
		      __print_symbolic(__entry->op, afs_vl_operations))
	    );

TRACE_EVENT(afs_call_done,
	    TP_PROTO(struct afs_call *call),

	    TP_ARGS(call),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(struct rxrpc_call *,	rx_call)
		    __field(int,			ret)
		    __field(u32,			abort_code)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->rx_call = call->rxcall;
		    __entry->ret = call->error;
		    __entry->abort_code = call->abort_code;
			   ),

	    TP_printk("   c=%08x ret=%d ab=%d [%p]",
		      __entry->call,
		      __entry->ret,
		      __entry->abort_code,
		      __entry->rx_call)
	    );

TRACE_EVENT(afs_send_data,
	    TP_PROTO(struct afs_call *call, struct msghdr *msg),

	    TP_ARGS(call, msg),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(unsigned int,		flags)
		    __field(loff_t,			offset)
		    __field(loff_t,			count)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->flags = msg->msg_flags;
		    __entry->offset = msg->msg_iter.xarray_start + msg->msg_iter.iov_offset;
		    __entry->count = iov_iter_count(&msg->msg_iter);
			   ),

	    TP_printk(" c=%08x o=%llx n=%llx f=%x",
		      __entry->call, __entry->offset, __entry->count,
		      __entry->flags)
	    );

TRACE_EVENT(afs_sent_data,
	    TP_PROTO(struct afs_call *call, struct msghdr *msg, int ret),

	    TP_ARGS(call, msg, ret),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(int,			ret)
		    __field(loff_t,			offset)
		    __field(loff_t,			count)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->ret = ret;
		    __entry->offset = msg->msg_iter.xarray_start + msg->msg_iter.iov_offset;
		    __entry->count = iov_iter_count(&msg->msg_iter);
			   ),

	    TP_printk(" c=%08x o=%llx n=%llx r=%x",
		      __entry->call, __entry->offset, __entry->count,
		      __entry->ret)
	    );

TRACE_EVENT(afs_dir_check_failed,
	    TP_PROTO(struct afs_vnode *vnode, loff_t off, loff_t i_size),

	    TP_ARGS(vnode, off, i_size),

	    TP_STRUCT__entry(
		    __field(struct afs_vnode *,		vnode)
		    __field(loff_t,			off)
		    __field(loff_t,			i_size)
			     ),

	    TP_fast_assign(
		    __entry->vnode = vnode;
		    __entry->off = off;
		    __entry->i_size = i_size;
			   ),

	    TP_printk("vn=%p %llx/%llx",
		      __entry->vnode, __entry->off, __entry->i_size)
	    );

TRACE_EVENT(afs_call_state,
	    TP_PROTO(struct afs_call *call,
		     enum afs_call_state from,
		     enum afs_call_state to,
		     int ret, u32 remote_abort),

	    TP_ARGS(call, from, to, ret, remote_abort),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(enum afs_call_state,	from)
		    __field(enum afs_call_state,	to)
		    __field(int,			ret)
		    __field(u32,			abort)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->from = from;
		    __entry->to = to;
		    __entry->ret = ret;
		    __entry->abort = remote_abort;
			   ),

	    TP_printk("c=%08x %u->%u r=%d ab=%d",
		      __entry->call,
		      __entry->from, __entry->to,
		      __entry->ret, __entry->abort)
	    );

TRACE_EVENT(afs_lookup,
	    TP_PROTO(struct afs_vnode *dvnode, const struct qstr *name,
		     struct afs_fid *fid),

	    TP_ARGS(dvnode, name, fid),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	dfid)
		    __field_struct(struct afs_fid,	fid)
		    __array(char,			name, 24)
			     ),

	    TP_fast_assign(
		    int __len = min_t(int, name->len, 23);
		    __entry->dfid = dvnode->fid;
		    __entry->fid = *fid;
		    memcpy(__entry->name, name->name, __len);
		    __entry->name[__len] = 0;
			   ),

	    TP_printk("d=%llx:%llx:%x \"%s\" f=%llx:%x",
		      __entry->dfid.vid, __entry->dfid.vnode, __entry->dfid.unique,
		      __entry->name,
		      __entry->fid.vnode, __entry->fid.unique)
	    );

TRACE_EVENT(afs_edit_dir,
	    TP_PROTO(struct afs_vnode *dvnode,
		     enum afs_edit_dir_reason why,
		     enum afs_edit_dir_op op,
		     unsigned int block,
		     unsigned int slot,
		     unsigned int f_vnode,
		     unsigned int f_unique,
		     const char *name),

	    TP_ARGS(dvnode, why, op, block, slot, f_vnode, f_unique, name),

	    TP_STRUCT__entry(
		    __field(unsigned int,		vnode)
		    __field(unsigned int,		unique)
		    __field(enum afs_edit_dir_reason,	why)
		    __field(enum afs_edit_dir_op,	op)
		    __field(unsigned int,		block)
		    __field(unsigned short,		slot)
		    __field(unsigned int,		f_vnode)
		    __field(unsigned int,		f_unique)
		    __array(char,			name, 24)
			     ),

	    TP_fast_assign(
		    int __len = strlen(name);
		    __len = min(__len, 23);
		    __entry->vnode	= dvnode->fid.vnode;
		    __entry->unique	= dvnode->fid.unique;
		    __entry->why	= why;
		    __entry->op		= op;
		    __entry->block	= block;
		    __entry->slot	= slot;
		    __entry->f_vnode	= f_vnode;
		    __entry->f_unique	= f_unique;
		    memcpy(__entry->name, name, __len);
		    __entry->name[__len] = 0;
			   ),

	    TP_printk("d=%x:%x %s %s %u[%u] f=%x:%x \"%s\"",
		      __entry->vnode, __entry->unique,
		      __print_symbolic(__entry->why, afs_edit_dir_reasons),
		      __print_symbolic(__entry->op, afs_edit_dir_ops),
		      __entry->block, __entry->slot,
		      __entry->f_vnode, __entry->f_unique,
		      __entry->name)
	    );

TRACE_EVENT(afs_protocol_error,
	    TP_PROTO(struct afs_call *call, enum afs_eproto_cause cause),

	    TP_ARGS(call, cause),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(enum afs_eproto_cause,	cause)
			     ),

	    TP_fast_assign(
		    __entry->call = call ? call->debug_id : 0;
		    __entry->cause = cause;
			   ),

	    TP_printk("c=%08x %s",
		      __entry->call,
		      __print_symbolic(__entry->cause, afs_eproto_causes))
	    );

TRACE_EVENT(afs_io_error,
	    TP_PROTO(unsigned int call, int error, enum afs_io_error where),

	    TP_ARGS(call, error, where),

	    TP_STRUCT__entry(
		    __field(unsigned int,	call)
		    __field(int,		error)
		    __field(enum afs_io_error,	where)
			     ),

	    TP_fast_assign(
		    __entry->call = call;
		    __entry->error = error;
		    __entry->where = where;
			   ),

	    TP_printk("c=%08x r=%d %s",
		      __entry->call, __entry->error,
		      __print_symbolic(__entry->where, afs_io_errors))
	    );

TRACE_EVENT(afs_file_error,
	    TP_PROTO(struct afs_vnode *vnode, int error, enum afs_file_error where),

	    TP_ARGS(vnode, error, where),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	fid)
		    __field(int,			error)
		    __field(enum afs_file_error,	where)
			     ),

	    TP_fast_assign(
		    __entry->fid = vnode->fid;
		    __entry->error = error;
		    __entry->where = where;
			   ),

	    TP_printk("%llx:%llx:%x r=%d %s",
		      __entry->fid.vid, __entry->fid.vnode, __entry->fid.unique,
		      __entry->error,
		      __print_symbolic(__entry->where, afs_file_errors))
	    );

TRACE_EVENT(afs_bulkstat_error,
	    TP_PROTO(struct afs_operation *op, struct afs_fid *fid, unsigned int index, s32 abort),

	    TP_ARGS(op, fid, index, abort),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	fid)
		    __field(unsigned int,		op)
		    __field(unsigned int,		index)
		    __field(s32,			abort)
			     ),

	    TP_fast_assign(
		    __entry->op = op->debug_id;
		    __entry->fid = *fid;
		    __entry->index = index;
		    __entry->abort = abort;
			   ),

	    TP_printk("OP=%08x[%02x] %llx:%llx:%x a=%d",
		      __entry->op, __entry->index,
		      __entry->fid.vid, __entry->fid.vnode, __entry->fid.unique,
		      __entry->abort)
	    );

TRACE_EVENT(afs_cm_no_server,
	    TP_PROTO(struct afs_call *call, struct sockaddr_rxrpc *srx),

	    TP_ARGS(call, srx),

	    TP_STRUCT__entry(
		    __field(unsigned int,			call)
		    __field(unsigned int,			op_id)
		    __field_struct(struct sockaddr_rxrpc,	srx)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->op_id = call->operation_ID;
		    memcpy(&__entry->srx, srx, sizeof(__entry->srx));
			   ),

	    TP_printk("c=%08x op=%u %pISpc",
		      __entry->call, __entry->op_id, &__entry->srx.transport)
	    );

TRACE_EVENT(afs_cm_no_server_u,
	    TP_PROTO(struct afs_call *call, const uuid_t *uuid),

	    TP_ARGS(call, uuid),

	    TP_STRUCT__entry(
		    __field(unsigned int,			call)
		    __field(unsigned int,			op_id)
		    __field_struct(uuid_t,			uuid)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->op_id = call->operation_ID;
		    memcpy(&__entry->uuid, uuid, sizeof(__entry->uuid));
			   ),

	    TP_printk("c=%08x op=%u %pU",
		      __entry->call, __entry->op_id, &__entry->uuid)
	    );

TRACE_EVENT(afs_flock_ev,
	    TP_PROTO(struct afs_vnode *vnode, struct file_lock *fl,
		     enum afs_flock_event event, int error),

	    TP_ARGS(vnode, fl, event, error),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	fid)
		    __field(enum afs_flock_event,	event)
		    __field(enum afs_lock_state,	state)
		    __field(int,			error)
		    __field(unsigned int,		debug_id)
			     ),

	    TP_fast_assign(
		    __entry->fid = vnode->fid;
		    __entry->event = event;
		    __entry->state = vnode->lock_state;
		    __entry->error = error;
		    __entry->debug_id = fl ? fl->fl_u.afs.debug_id : 0;
			   ),

	    TP_printk("%llx:%llx:%x %04x %s s=%s e=%d",
		      __entry->fid.vid, __entry->fid.vnode, __entry->fid.unique,
		      __entry->debug_id,
		      __print_symbolic(__entry->event, afs_flock_events),
		      __print_symbolic(__entry->state, afs_flock_states),
		      __entry->error)
	    );

TRACE_EVENT(afs_flock_op,
	    TP_PROTO(struct afs_vnode *vnode, struct file_lock *fl,
		     enum afs_flock_operation op),

	    TP_ARGS(vnode, fl, op),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	fid)
		    __field(loff_t,			from)
		    __field(loff_t,			len)
		    __field(enum afs_flock_operation,	op)
		    __field(unsigned char,		type)
		    __field(unsigned int,		flags)
		    __field(unsigned int,		debug_id)
			     ),

	    TP_fast_assign(
		    __entry->fid = vnode->fid;
		    __entry->from = fl->fl_start;
		    __entry->len = fl->fl_end - fl->fl_start + 1;
		    __entry->op = op;
		    __entry->type = fl->c.flc_type;
		    __entry->flags = fl->c.flc_flags;
		    __entry->debug_id = fl->fl_u.afs.debug_id;
			   ),

	    TP_printk("%llx:%llx:%x %04x %s t=%s R=%llx/%llx f=%x",
		      __entry->fid.vid, __entry->fid.vnode, __entry->fid.unique,
		      __entry->debug_id,
		      __print_symbolic(__entry->op, afs_flock_operations),
		      __print_symbolic(__entry->type, afs_flock_types),
		      __entry->from, __entry->len, __entry->flags)
	    );

TRACE_EVENT(afs_reload_dir,
	    TP_PROTO(struct afs_vnode *vnode),

	    TP_ARGS(vnode),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	fid)
			     ),

	    TP_fast_assign(
		    __entry->fid = vnode->fid;
			   ),

	    TP_printk("%llx:%llx:%x",
		      __entry->fid.vid, __entry->fid.vnode, __entry->fid.unique)
	    );

TRACE_EVENT(afs_silly_rename,
	    TP_PROTO(struct afs_vnode *vnode, bool done),

	    TP_ARGS(vnode, done),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	fid)
		    __field(bool,			done)
			     ),

	    TP_fast_assign(
		    __entry->fid = vnode->fid;
		    __entry->done = done;
			   ),

	    TP_printk("%llx:%llx:%x done=%u",
		      __entry->fid.vid, __entry->fid.vnode, __entry->fid.unique,
		      __entry->done)
	    );

TRACE_EVENT(afs_get_tree,
	    TP_PROTO(struct afs_cell *cell, struct afs_volume *volume),

	    TP_ARGS(cell, volume),

	    TP_STRUCT__entry(
		    __field(u64,			vid)
		    __array(char,			cell, 24)
		    __array(char,			volume, 24)
			     ),

	    TP_fast_assign(
		    int __len;
		    __entry->vid = volume->vid;
		    __len = min_t(int, cell->name_len, 23);
		    memcpy(__entry->cell, cell->name, __len);
		    __entry->cell[__len] = 0;
		    __len = min_t(int, volume->name_len, 23);
		    memcpy(__entry->volume, volume->name, __len);
		    __entry->volume[__len] = 0;
			   ),

	    TP_printk("--- MOUNT %s:%s %llx",
		      __entry->cell, __entry->volume, __entry->vid)
	    );

TRACE_EVENT(afs_cb_v_break,
	    TP_PROTO(afs_volid_t vid, unsigned int cb_v_break,
		     enum afs_cb_break_reason reason),

	    TP_ARGS(vid, cb_v_break, reason),

	    TP_STRUCT__entry(
		    __field(afs_volid_t,		vid)
		    __field(unsigned int,		cb_v_break)
		    __field(enum afs_cb_break_reason,	reason)
			     ),

	    TP_fast_assign(
		    __entry->vid	= vid;
		    __entry->cb_v_break	= cb_v_break;
		    __entry->reason	= reason;
			   ),

	    TP_printk("%llx vb=%x %s",
		      __entry->vid,
		      __entry->cb_v_break,
		      __print_symbolic(__entry->reason, afs_cb_break_reasons))
	    );

TRACE_EVENT(afs_cb_break,
	    TP_PROTO(struct afs_fid *fid, unsigned int cb_break,
		     enum afs_cb_break_reason reason, bool skipped),

	    TP_ARGS(fid, cb_break, reason, skipped),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	fid)
		    __field(unsigned int,		cb_break)
		    __field(enum afs_cb_break_reason,	reason)
		    __field(bool,			skipped)
			     ),

	    TP_fast_assign(
		    __entry->fid	= *fid;
		    __entry->cb_break	= cb_break;
		    __entry->reason	= reason;
		    __entry->skipped	= skipped;
			   ),

	    TP_printk("%llx:%llx:%x b=%x s=%u %s",
		      __entry->fid.vid, __entry->fid.vnode, __entry->fid.unique,
		      __entry->cb_break,
		      __entry->skipped,
		      __print_symbolic(__entry->reason, afs_cb_break_reasons))
	    );

TRACE_EVENT(afs_cb_miss,
	    TP_PROTO(struct afs_fid *fid, enum afs_cb_break_reason reason),

	    TP_ARGS(fid, reason),

	    TP_STRUCT__entry(
		    __field_struct(struct afs_fid,	fid)
		    __field(enum afs_cb_break_reason,	reason)
			     ),

	    TP_fast_assign(
		    __entry->fid	= *fid;
		    __entry->reason	= reason;
			   ),

	    TP_printk(" %llx:%llx:%x %s",
		      __entry->fid.vid, __entry->fid.vnode, __entry->fid.unique,
		      __print_symbolic(__entry->reason, afs_cb_break_reasons))
	    );

TRACE_EVENT(afs_server,
	    TP_PROTO(unsigned int server_debug_id, int ref, int active,
		     enum afs_server_trace reason),

	    TP_ARGS(server_debug_id, ref, active, reason),

	    TP_STRUCT__entry(
		    __field(unsigned int,		server)
		    __field(int,			ref)
		    __field(int,			active)
		    __field(int,			reason)
			     ),

	    TP_fast_assign(
		    __entry->server = server_debug_id;
		    __entry->ref = ref;
		    __entry->active = active;
		    __entry->reason = reason;
			   ),

	    TP_printk("s=%08x %s u=%d a=%d",
		      __entry->server,
		      __print_symbolic(__entry->reason, afs_server_traces),
		      __entry->ref,
		      __entry->active)
	    );

TRACE_EVENT(afs_volume,
	    TP_PROTO(afs_volid_t vid, int ref, enum afs_volume_trace reason),

	    TP_ARGS(vid, ref, reason),

	    TP_STRUCT__entry(
		    __field(afs_volid_t,		vid)
		    __field(int,			ref)
		    __field(enum afs_volume_trace,	reason)
			     ),

	    TP_fast_assign(
		    __entry->vid = vid;
		    __entry->ref = ref;
		    __entry->reason = reason;
			   ),

	    TP_printk("V=%llx %s ur=%d",
		      __entry->vid,
		      __print_symbolic(__entry->reason, afs_volume_traces),
		      __entry->ref)
	    );

TRACE_EVENT(afs_cell,
	    TP_PROTO(unsigned int cell_debug_id, int ref, int active,
		     enum afs_cell_trace reason),

	    TP_ARGS(cell_debug_id, ref, active, reason),

	    TP_STRUCT__entry(
		    __field(unsigned int,		cell)
		    __field(int,			ref)
		    __field(int,			active)
		    __field(int,			reason)
			     ),

	    TP_fast_assign(
		    __entry->cell = cell_debug_id;
		    __entry->ref = ref;
		    __entry->active = active;
		    __entry->reason = reason;
			   ),

	    TP_printk("L=%08x %s r=%d a=%d",
		      __entry->cell,
		      __print_symbolic(__entry->reason, afs_cell_traces),
		      __entry->ref,
		      __entry->active)
	    );

TRACE_EVENT(afs_alist,
	    TP_PROTO(unsigned int alist_debug_id, int ref, enum afs_alist_trace reason),

	    TP_ARGS(alist_debug_id, ref, reason),

	    TP_STRUCT__entry(
		    __field(unsigned int,		alist)
		    __field(int,			ref)
		    __field(int,			active)
		    __field(int,			reason)
			     ),

	    TP_fast_assign(
		    __entry->alist = alist_debug_id;
		    __entry->ref = ref;
		    __entry->reason = reason;
			   ),

	    TP_printk("AL=%08x %s r=%d",
		      __entry->alist,
		      __print_symbolic(__entry->reason, afs_alist_traces),
		      __entry->ref)
	    );

TRACE_EVENT(afs_estate,
	    TP_PROTO(unsigned int server_debug_id, unsigned int estate_debug_id,
		     int ref, enum afs_estate_trace reason),

	    TP_ARGS(server_debug_id, estate_debug_id, ref, reason),

	    TP_STRUCT__entry(
		    __field(unsigned int,		server)
		    __field(unsigned int,		estate)
		    __field(int,			ref)
		    __field(int,			active)
		    __field(int,			reason)
			     ),

	    TP_fast_assign(
		    __entry->server = server_debug_id;
		    __entry->estate = estate_debug_id;
		    __entry->ref = ref;
		    __entry->reason = reason;
			   ),

	    TP_printk("ES=%08x[%x] %s r=%d",
		      __entry->server,
		      __entry->estate,
		      __print_symbolic(__entry->reason, afs_estate_traces),
		      __entry->ref)
	    );

TRACE_EVENT(afs_fs_probe,
	    TP_PROTO(struct afs_server *server, bool tx, struct afs_endpoint_state *estate,
		     unsigned int addr_index, int error, s32 abort_code, unsigned int rtt_us),

	    TP_ARGS(server, tx, estate, addr_index, error, abort_code, rtt_us),

	    TP_STRUCT__entry(
		    __field(unsigned int,		server)
		    __field(unsigned int,		estate)
		    __field(bool,			tx)
		    __field(u16,			addr_index)
		    __field(short,			error)
		    __field(s32,			abort_code)
		    __field(unsigned int,		rtt_us)
		    __field_struct(struct sockaddr_rxrpc, srx)
			     ),

	    TP_fast_assign(
		    struct afs_addr_list *alist = estate->addresses;
		    __entry->server = server->debug_id;
		    __entry->estate = estate->probe_seq;
		    __entry->tx = tx;
		    __entry->addr_index = addr_index;
		    __entry->error = error;
		    __entry->abort_code = abort_code;
		    __entry->rtt_us = rtt_us;
		    memcpy(&__entry->srx, rxrpc_kernel_remote_srx(alist->addrs[addr_index].peer),
			   sizeof(__entry->srx));
			   ),

	    TP_printk("s=%08x %s pq=%x ax=%u e=%d ac=%d rtt=%d %pISpc",
		      __entry->server, __entry->tx ? "tx" : "rx", __entry->estate,
		      __entry->addr_index, __entry->error, __entry->abort_code, __entry->rtt_us,
		      &__entry->srx.transport)
	    );

TRACE_EVENT(afs_vl_probe,
	    TP_PROTO(struct afs_vlserver *server, bool tx, struct afs_addr_list *alist,
		     unsigned int addr_index, int error, s32 abort_code, unsigned int rtt_us),

	    TP_ARGS(server, tx, alist, addr_index, error, abort_code, rtt_us),

	    TP_STRUCT__entry(
		    __field(unsigned int,		server)
		    __field(bool,			tx)
		    __field(unsigned short,		flags)
		    __field(u16,			addr_index)
		    __field(short,			error)
		    __field(s32,			abort_code)
		    __field(unsigned int,		rtt_us)
		    __field_struct(struct sockaddr_rxrpc, srx)
			     ),

	    TP_fast_assign(
		    __entry->server = server->debug_id;
		    __entry->tx = tx;
		    __entry->addr_index = addr_index;
		    __entry->error = error;
		    __entry->abort_code = abort_code;
		    __entry->rtt_us = rtt_us;
		    memcpy(&__entry->srx, rxrpc_kernel_remote_srx(alist->addrs[addr_index].peer),
			   sizeof(__entry->srx));
			   ),

	    TP_printk("vl=%08x %s ax=%u e=%d ac=%d rtt=%d %pISpc",
		      __entry->server, __entry->tx ? "tx" : "rx", __entry->addr_index,
		      __entry->error, __entry->abort_code, __entry->rtt_us,
		      &__entry->srx.transport)
	    );

TRACE_EVENT(afs_rotate,
	    TP_PROTO(struct afs_operation *op, enum afs_rotate_trace reason, unsigned int extra),

	    TP_ARGS(op, reason, extra),

	    TP_STRUCT__entry(
		    __field(unsigned int,		op)
		    __field(unsigned int,		flags)
		    __field(unsigned int,		extra)
		    __field(unsigned short,		iteration)
		    __field(short,			server_index)
		    __field(short,			addr_index)
		    __field(enum afs_rotate_trace,	reason)
			     ),

	    TP_fast_assign(
		    __entry->op = op->debug_id;
		    __entry->flags = op->flags;
		    __entry->iteration = op->nr_iterations;
		    __entry->server_index = op->server_index;
		    __entry->addr_index = op->addr_index;
		    __entry->reason = reason;
		    __entry->extra = extra;
			   ),

	    TP_printk("OP=%08x it=%02x %s fl=%x sx=%d ax=%d ext=%d",
		      __entry->op,
		      __entry->iteration,
		      __print_symbolic(__entry->reason, afs_rotate_traces),
		      __entry->flags,
		      __entry->server_index,
		      __entry->addr_index,
		      __entry->extra)
	    );

TRACE_EVENT(afs_make_call,
	    TP_PROTO(struct afs_call *call),

	    TP_ARGS(call),

	    TP_STRUCT__entry(
		    __field(unsigned int,		call)
		    __field(bool,			is_vl)
		    __field(enum afs_fs_operation,	op)
		    __field_struct(struct afs_fid,	fid)
		    __field_struct(struct sockaddr_rxrpc, srx)
			     ),

	    TP_fast_assign(
		    __entry->call = call->debug_id;
		    __entry->op = call->operation_ID;
		    __entry->fid = call->fid;
		    memcpy(&__entry->srx, rxrpc_kernel_remote_srx(call->peer),
			   sizeof(__entry->srx));
		    __entry->srx.srx_service = call->service_id;
		    __entry->is_vl = (__entry->srx.srx_service == VL_SERVICE ||
				      __entry->srx.srx_service == YFS_VL_SERVICE);
			   ),

	    TP_printk("c=%08x %pISpc+%u %s %llx:%llx:%x",
		      __entry->call,
		      &__entry->srx.transport,
		      __entry->srx.srx_service,
		      __entry->is_vl ?
		      __print_symbolic(__entry->op, afs_vl_operations) :
		      __print_symbolic(__entry->op, afs_fs_operations),
		      __entry->fid.vid,
		      __entry->fid.vnode,
		      __entry->fid.unique)
	    );

#endif /* _TRACE_AFS_H */

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