1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *   Copyright (C) 2018, Microsoft Corporation.
4  *
5  *   Author(s): Steve French <stfrench@microsoft.com>
6  *
7  *   This program is free software;  you can redistribute it and/or modify
8  *   it under the terms of the GNU General Public License as published by
9  *   the Free Software Foundation; either version 2 of the License, or
10  *   (at your option) any later version.
11  *
12  *   This program is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
15  *   the GNU General Public License for more details.
16  */
17 #undef TRACE_SYSTEM
18 #define TRACE_SYSTEM cifs
19 
20 #if !defined(_CIFS_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
21 #define _CIFS_TRACE_H
22 
23 #include <linux/tracepoint.h>
24 
25 /* For logging errors in read or write */
26 DECLARE_EVENT_CLASS(smb3_rw_err_class,
27 	TP_PROTO(unsigned int xid,
28 		__u64	fid,
29 		__u32	tid,
30 		__u64	sesid,
31 		__u64	offset,
32 		__u32	len,
33 		int	rc),
34 	TP_ARGS(xid, fid, tid, sesid, offset, len, rc),
35 	TP_STRUCT__entry(
36 		__field(unsigned int, xid)
37 		__field(__u64, fid)
38 		__field(__u32, tid)
39 		__field(__u64, sesid)
40 		__field(__u64, offset)
41 		__field(__u32, len)
42 		__field(int, rc)
43 	),
44 	TP_fast_assign(
45 		__entry->xid = xid;
46 		__entry->fid = fid;
47 		__entry->tid = tid;
48 		__entry->sesid = sesid;
49 		__entry->offset = offset;
50 		__entry->len = len;
51 		__entry->rc = rc;
52 	),
53 	TP_printk("\txid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x rc=%d",
54 		__entry->xid, __entry->sesid, __entry->tid, __entry->fid,
55 		__entry->offset, __entry->len, __entry->rc)
56 )
57 
58 #define DEFINE_SMB3_RW_ERR_EVENT(name)          \
59 DEFINE_EVENT(smb3_rw_err_class, smb3_##name,    \
60 	TP_PROTO(unsigned int xid,		\
61 		__u64	fid,			\
62 		__u32	tid,			\
63 		__u64	sesid,			\
64 		__u64	offset,			\
65 		__u32	len,			\
66 		int	rc),			\
67 	TP_ARGS(xid, fid, tid, sesid, offset, len, rc))
68 
69 DEFINE_SMB3_RW_ERR_EVENT(write_err);
70 DEFINE_SMB3_RW_ERR_EVENT(read_err);
71 
72 
73 /* For logging successful read or write */
74 DECLARE_EVENT_CLASS(smb3_rw_done_class,
75 	TP_PROTO(unsigned int xid,
76 		__u64	fid,
77 		__u32	tid,
78 		__u64	sesid,
79 		__u64	offset,
80 		__u32	len),
81 	TP_ARGS(xid, fid, tid, sesid, offset, len),
82 	TP_STRUCT__entry(
83 		__field(unsigned int, xid)
84 		__field(__u64, fid)
85 		__field(__u32, tid)
86 		__field(__u64, sesid)
87 		__field(__u64, offset)
88 		__field(__u32, len)
89 	),
90 	TP_fast_assign(
91 		__entry->xid = xid;
92 		__entry->fid = fid;
93 		__entry->tid = tid;
94 		__entry->sesid = sesid;
95 		__entry->offset = offset;
96 		__entry->len = len;
97 	),
98 	TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx offset=0x%llx len=0x%x",
99 		__entry->xid, __entry->sesid, __entry->tid, __entry->fid,
100 		__entry->offset, __entry->len)
101 )
102 
103 #define DEFINE_SMB3_RW_DONE_EVENT(name)         \
104 DEFINE_EVENT(smb3_rw_done_class, smb3_##name,   \
105 	TP_PROTO(unsigned int xid,		\
106 		__u64	fid,			\
107 		__u32	tid,			\
108 		__u64	sesid,			\
109 		__u64	offset,			\
110 		__u32	len),			\
111 	TP_ARGS(xid, fid, tid, sesid, offset, len))
112 
113 DEFINE_SMB3_RW_DONE_EVENT(write_done);
114 DEFINE_SMB3_RW_DONE_EVENT(read_done);
115 
116 /*
117  * For handle based calls other than read and write, and get/set info
118  */
119 DECLARE_EVENT_CLASS(smb3_fd_err_class,
120 	TP_PROTO(unsigned int xid,
121 		__u64	fid,
122 		__u32	tid,
123 		__u64	sesid,
124 		int	rc),
125 	TP_ARGS(xid, fid, tid, sesid, rc),
126 	TP_STRUCT__entry(
127 		__field(unsigned int, xid)
128 		__field(__u64, fid)
129 		__field(__u32, tid)
130 		__field(__u64, sesid)
131 		__field(int, rc)
132 	),
133 	TP_fast_assign(
134 		__entry->xid = xid;
135 		__entry->fid = fid;
136 		__entry->tid = tid;
137 		__entry->sesid = sesid;
138 		__entry->rc = rc;
139 	),
140 	TP_printk("\txid=%u sid=0x%llx tid=0x%x fid=0x%llx rc=%d",
141 		__entry->xid, __entry->sesid, __entry->tid, __entry->fid,
142 		__entry->rc)
143 )
144 
145 #define DEFINE_SMB3_FD_ERR_EVENT(name)          \
146 DEFINE_EVENT(smb3_fd_err_class, smb3_##name,    \
147 	TP_PROTO(unsigned int xid,		\
148 		__u64	fid,			\
149 		__u32	tid,			\
150 		__u64	sesid,			\
151 		int	rc),			\
152 	TP_ARGS(xid, fid, tid, sesid, rc))
153 
154 DEFINE_SMB3_FD_ERR_EVENT(flush_err);
155 DEFINE_SMB3_FD_ERR_EVENT(lock_err);
156 DEFINE_SMB3_FD_ERR_EVENT(close_err);
157 
158 /*
159  * For handle based query/set info calls
160  */
161 DECLARE_EVENT_CLASS(smb3_inf_err_class,
162 	TP_PROTO(unsigned int xid,
163 		__u64	fid,
164 		__u32	tid,
165 		__u64	sesid,
166 		__u8	infclass,
167 		__u32	type,
168 		int	rc),
169 	TP_ARGS(xid, fid, tid, sesid, infclass, type, rc),
170 	TP_STRUCT__entry(
171 		__field(unsigned int, xid)
172 		__field(__u64, fid)
173 		__field(__u32, tid)
174 		__field(__u64, sesid)
175 		__field(__u8, infclass)
176 		__field(__u32, type)
177 		__field(int, rc)
178 	),
179 	TP_fast_assign(
180 		__entry->xid = xid;
181 		__entry->fid = fid;
182 		__entry->tid = tid;
183 		__entry->sesid = sesid;
184 		__entry->infclass = infclass;
185 		__entry->type = type;
186 		__entry->rc = rc;
187 	),
188 	TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx class=%u type=0x%x rc=%d",
189 		__entry->xid, __entry->sesid, __entry->tid, __entry->fid,
190 		__entry->infclass, __entry->type, __entry->rc)
191 )
192 
193 #define DEFINE_SMB3_INF_ERR_EVENT(name)          \
194 DEFINE_EVENT(smb3_inf_err_class, smb3_##name,    \
195 	TP_PROTO(unsigned int xid,		\
196 		__u64	fid,			\
197 		__u32	tid,			\
198 		__u64	sesid,			\
199 		__u8	infclass,		\
200 		__u32	type,			\
201 		int	rc),			\
202 	TP_ARGS(xid, fid, tid, sesid, infclass, type, rc))
203 
204 DEFINE_SMB3_INF_ERR_EVENT(query_info_err);
205 DEFINE_SMB3_INF_ERR_EVENT(set_info_err);
206 DEFINE_SMB3_INF_ERR_EVENT(fsctl_err);
207 
208 /*
209  * For logging SMB3 Status code and Command for responses which return errors
210  */
211 DECLARE_EVENT_CLASS(smb3_cmd_err_class,
212 	TP_PROTO(__u32	tid,
213 		__u64	sesid,
214 		__u16	cmd,
215 		__u64	mid,
216 		__u32	status,
217 		int	rc),
218 	TP_ARGS(tid, sesid, cmd, mid, status, rc),
219 	TP_STRUCT__entry(
220 		__field(__u32, tid)
221 		__field(__u64, sesid)
222 		__field(__u16, cmd)
223 		__field(__u64, mid)
224 		__field(__u32, status)
225 		__field(int, rc)
226 	),
227 	TP_fast_assign(
228 		__entry->tid = tid;
229 		__entry->sesid = sesid;
230 		__entry->cmd = cmd;
231 		__entry->mid = mid;
232 		__entry->status = status;
233 		__entry->rc = rc;
234 	),
235 	TP_printk("\tsid=0x%llx tid=0x%x cmd=%u mid=%llu status=0x%x rc=%d",
236 		__entry->sesid, __entry->tid, __entry->cmd, __entry->mid,
237 		__entry->status, __entry->rc)
238 )
239 
240 #define DEFINE_SMB3_CMD_ERR_EVENT(name)          \
241 DEFINE_EVENT(smb3_cmd_err_class, smb3_##name,    \
242 	TP_PROTO(__u32	tid,			\
243 		__u64	sesid,			\
244 		__u16	cmd,			\
245 		__u64	mid,			\
246 		__u32	status,			\
247 		int	rc),			\
248 	TP_ARGS(tid, sesid, cmd, mid, status, rc))
249 
250 DEFINE_SMB3_CMD_ERR_EVENT(cmd_err);
251 
252 DECLARE_EVENT_CLASS(smb3_cmd_done_class,
253 	TP_PROTO(__u32	tid,
254 		__u64	sesid,
255 		__u16	cmd,
256 		__u64	mid),
257 	TP_ARGS(tid, sesid, cmd, mid),
258 	TP_STRUCT__entry(
259 		__field(__u32, tid)
260 		__field(__u64, sesid)
261 		__field(__u16, cmd)
262 		__field(__u64, mid)
263 	),
264 	TP_fast_assign(
265 		__entry->tid = tid;
266 		__entry->sesid = sesid;
267 		__entry->cmd = cmd;
268 		__entry->mid = mid;
269 	),
270 	TP_printk("\tsid=0x%llx tid=0x%x cmd=%u mid=%llu",
271 		__entry->sesid, __entry->tid,
272 		__entry->cmd, __entry->mid)
273 )
274 
275 #define DEFINE_SMB3_CMD_DONE_EVENT(name)          \
276 DEFINE_EVENT(smb3_cmd_done_class, smb3_##name,    \
277 	TP_PROTO(__u32	tid,			\
278 		__u64	sesid,			\
279 		__u16	cmd,			\
280 		__u64	mid),			\
281 	TP_ARGS(tid, sesid, cmd, mid))
282 
283 DEFINE_SMB3_CMD_DONE_EVENT(cmd_done);
284 DEFINE_SMB3_CMD_DONE_EVENT(ses_expired);
285 
286 DECLARE_EVENT_CLASS(smb3_mid_class,
287 	TP_PROTO(__u16	cmd,
288 		__u64	mid,
289 		__u32	pid,
290 		unsigned long when_sent,
291 		unsigned long when_received),
292 	TP_ARGS(cmd, mid, pid, when_sent, when_received),
293 	TP_STRUCT__entry(
294 		__field(__u16, cmd)
295 		__field(__u64, mid)
296 		__field(__u32, pid)
297 		__field(unsigned long, when_sent)
298 		__field(unsigned long, when_received)
299 	),
300 	TP_fast_assign(
301 		__entry->cmd = cmd;
302 		__entry->mid = mid;
303 		__entry->pid = pid;
304 		__entry->when_sent = when_sent;
305 		__entry->when_received = when_received;
306 	),
307 	TP_printk("\tcmd=%u mid=%llu pid=%u, when_sent=%lu when_rcv=%lu",
308 		__entry->cmd, __entry->mid, __entry->pid, __entry->when_sent,
309 		__entry->when_received)
310 )
311 
312 #define DEFINE_SMB3_MID_EVENT(name)          \
313 DEFINE_EVENT(smb3_mid_class, smb3_##name,    \
314 	TP_PROTO(__u16	cmd,			\
315 		__u64	mid,			\
316 		__u32	pid,			\
317 		unsigned long when_sent,	\
318 		unsigned long when_received),	\
319 	TP_ARGS(cmd, mid, pid, when_sent, when_received))
320 
321 DEFINE_SMB3_MID_EVENT(slow_rsp);
322 
323 DECLARE_EVENT_CLASS(smb3_exit_err_class,
324 	TP_PROTO(unsigned int xid,
325 		const char *func_name,
326 		int	rc),
327 	TP_ARGS(xid, func_name, rc),
328 	TP_STRUCT__entry(
329 		__field(unsigned int, xid)
330 		__field(const char *, func_name)
331 		__field(int, rc)
332 	),
333 	TP_fast_assign(
334 		__entry->xid = xid;
335 		__entry->func_name = func_name;
336 		__entry->rc = rc;
337 	),
338 	TP_printk("\t%s: xid=%u rc=%d",
339 		__entry->func_name, __entry->xid, __entry->rc)
340 )
341 
342 #define DEFINE_SMB3_EXIT_ERR_EVENT(name)          \
343 DEFINE_EVENT(smb3_exit_err_class, smb3_##name,    \
344 	TP_PROTO(unsigned int xid,		\
345 		const char *func_name,		\
346 		int	rc),			\
347 	TP_ARGS(xid, func_name, rc))
348 
349 DEFINE_SMB3_EXIT_ERR_EVENT(exit_err);
350 
351 DECLARE_EVENT_CLASS(smb3_enter_exit_class,
352 	TP_PROTO(unsigned int xid,
353 		const char *func_name),
354 	TP_ARGS(xid, func_name),
355 	TP_STRUCT__entry(
356 		__field(unsigned int, xid)
357 		__field(const char *, func_name)
358 	),
359 	TP_fast_assign(
360 		__entry->xid = xid;
361 		__entry->func_name = func_name;
362 	),
363 	TP_printk("\t%s: xid=%u",
364 		__entry->func_name, __entry->xid)
365 )
366 
367 #define DEFINE_SMB3_ENTER_EXIT_EVENT(name)        \
368 DEFINE_EVENT(smb3_enter_exit_class, smb3_##name,  \
369 	TP_PROTO(unsigned int xid,		\
370 		const char *func_name),		\
371 	TP_ARGS(xid, func_name))
372 
373 DEFINE_SMB3_ENTER_EXIT_EVENT(enter);
374 DEFINE_SMB3_ENTER_EXIT_EVENT(exit_done);
375 
376 /*
377  * For smb2/smb3 open call
378  */
379 DECLARE_EVENT_CLASS(smb3_open_err_class,
380 	TP_PROTO(unsigned int xid,
381 		__u32	tid,
382 		__u64	sesid,
383 		int	create_options,
384 		int	desired_access,
385 		int	rc),
386 	TP_ARGS(xid, tid, sesid, create_options, desired_access, rc),
387 	TP_STRUCT__entry(
388 		__field(unsigned int, xid)
389 		__field(__u32, tid)
390 		__field(__u64, sesid)
391 		__field(int,   create_options)
392 		__field(int, desired_access)
393 		__field(int, rc)
394 	),
395 	TP_fast_assign(
396 		__entry->xid = xid;
397 		__entry->tid = tid;
398 		__entry->sesid = sesid;
399 		__entry->create_options = create_options;
400 		__entry->desired_access = desired_access;
401 		__entry->rc = rc;
402 	),
403 	TP_printk("xid=%u sid=0x%llx tid=0x%x cr_opts=0x%x des_access=0x%x rc=%d",
404 		__entry->xid, __entry->sesid, __entry->tid,
405 		__entry->create_options, __entry->desired_access, __entry->rc)
406 )
407 
408 #define DEFINE_SMB3_OPEN_ERR_EVENT(name)          \
409 DEFINE_EVENT(smb3_open_err_class, smb3_##name,    \
410 	TP_PROTO(unsigned int xid,		\
411 		__u32	tid,			\
412 		__u64	sesid,			\
413 		int	create_options,		\
414 		int	desired_access,		\
415 		int	rc),			\
416 	TP_ARGS(xid, tid, sesid, create_options, desired_access, rc))
417 
418 DEFINE_SMB3_OPEN_ERR_EVENT(open_err);
419 DEFINE_SMB3_OPEN_ERR_EVENT(posix_mkdir_err);
420 
421 DECLARE_EVENT_CLASS(smb3_open_done_class,
422 	TP_PROTO(unsigned int xid,
423 		__u64	fid,
424 		__u32	tid,
425 		__u64	sesid,
426 		int	create_options,
427 		int	desired_access),
428 	TP_ARGS(xid, fid, tid, sesid, create_options, desired_access),
429 	TP_STRUCT__entry(
430 		__field(unsigned int, xid)
431 		__field(__u64, fid)
432 		__field(__u32, tid)
433 		__field(__u64, sesid)
434 		__field(int, create_options)
435 		__field(int, desired_access)
436 	),
437 	TP_fast_assign(
438 		__entry->xid = xid;
439 		__entry->fid = fid;
440 		__entry->tid = tid;
441 		__entry->sesid = sesid;
442 		__entry->create_options = create_options;
443 		__entry->desired_access = desired_access;
444 	),
445 	TP_printk("xid=%u sid=0x%llx tid=0x%x fid=0x%llx cr_opts=0x%x des_access=0x%x",
446 		__entry->xid, __entry->sesid, __entry->tid, __entry->fid,
447 		__entry->create_options, __entry->desired_access)
448 )
449 
450 #define DEFINE_SMB3_OPEN_DONE_EVENT(name)        \
451 DEFINE_EVENT(smb3_open_done_class, smb3_##name,  \
452 	TP_PROTO(unsigned int xid,		\
453 		__u64	fid,			\
454 		__u32	tid,			\
455 		__u64	sesid,			\
456 		int	create_options,		\
457 		int	desired_access),	\
458 	TP_ARGS(xid, fid, tid, sesid, create_options, desired_access))
459 
460 DEFINE_SMB3_OPEN_DONE_EVENT(open_done);
461 DEFINE_SMB3_OPEN_DONE_EVENT(posix_mkdir_done);
462 
463 DECLARE_EVENT_CLASS(smb3_reconnect_class,
464 	TP_PROTO(__u64	currmid,
465 		char *hostname),
466 	TP_ARGS(currmid, hostname),
467 	TP_STRUCT__entry(
468 		__field(__u64, currmid)
469 		__field(char *, hostname)
470 	),
471 	TP_fast_assign(
472 		__entry->currmid = currmid;
473 		__entry->hostname = hostname;
474 	),
475 	TP_printk("server=%s current_mid=0x%llx",
476 		__entry->hostname,
477 		__entry->currmid)
478 )
479 
480 #define DEFINE_SMB3_RECONNECT_EVENT(name)        \
481 DEFINE_EVENT(smb3_reconnect_class, smb3_##name,  \
482 	TP_PROTO(__u64	currmid,		\
483 		char *hostname),		\
484 	TP_ARGS(currmid, hostname))
485 
486 DEFINE_SMB3_RECONNECT_EVENT(reconnect);
487 DEFINE_SMB3_RECONNECT_EVENT(partial_send_reconnect);
488 
489 #endif /* _CIFS_TRACE_H */
490 
491 #undef TRACE_INCLUDE_PATH
492 #define TRACE_INCLUDE_PATH .
493 #define TRACE_INCLUDE_FILE trace
494 #include <trace/define_trace.h>
495