1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *
4  *   Copyright (c) International Business Machines  Corp., 2000,2002
5  *   Modified by Steve French (sfrench@us.ibm.com)
6  */
7 
8 #ifndef _H_CIFS_DEBUG
9 #define _H_CIFS_DEBUG
10 
11 #ifdef pr_fmt
12 #undef pr_fmt
13 #endif
14 
15 #define pr_fmt(fmt) "CIFS: " fmt
16 
17 void cifs_dump_mem(char *label, void *data, int length);
18 void cifs_dump_detail(void *buf, struct TCP_Server_Info *ptcp_info);
19 void cifs_dump_mids(struct TCP_Server_Info *);
20 extern bool traceSMB;		/* flag which enables the function below */
21 void dump_smb(void *, int);
22 #define CIFS_INFO	0x01
23 #define CIFS_RC		0x02
24 #define CIFS_TIMER	0x04
25 
26 #define VFS 1
27 #define FYI 2
28 extern int cifsFYI;
29 #ifdef CONFIG_CIFS_DEBUG2
30 #define NOISY 4
31 #else
32 #define NOISY 0
33 #endif
34 #define ONCE 8
35 
36 /*
37  *	debug ON
38  *	--------
39  */
40 #ifdef CONFIG_CIFS_DEBUG
41 
42 
43 /*
44  * When adding tracepoints and debug messages we have various choices.
45  * Some considerations:
46  *
47  * Use cifs_dbg(VFS, ...) for things we always want logged, and the user to see
48  *     cifs_info(...) slightly less important, admin can filter via loglevel > 6
49  *     cifs_dbg(FYI, ...) minor debugging messages, off by default
50  *     trace_smb3_*  ftrace functions are preferred for complex debug messages
51  *                 intended for developers or experienced admins, off by default
52  */
53 
54 /* Information level messages, minor events */
55 #define cifs_info_func(ratefunc, fmt, ...)				\
56 	pr_info_ ## ratefunc(fmt, ##__VA_ARGS__)
57 
58 #define cifs_info(fmt, ...)						\
59 	cifs_info_func(ratelimited, fmt, ##__VA_ARGS__)
60 
61 /* information message: e.g., configuration, major event */
62 #define cifs_dbg_func(ratefunc, type, fmt, ...)				\
63 do {									\
64 	if ((type) & FYI && cifsFYI & CIFS_INFO) {			\
65 		pr_debug_ ## ratefunc("%s: " fmt,			\
66 				      __FILE__, ##__VA_ARGS__);		\
67 	} else if ((type) & VFS) {					\
68 		pr_err_ ## ratefunc("VFS: " fmt, ##__VA_ARGS__);	\
69 	} else if ((type) & NOISY && (NOISY != 0)) {			\
70 		pr_debug_ ## ratefunc(fmt, ##__VA_ARGS__);		\
71 	}								\
72 } while (0)
73 
74 #define cifs_dbg(type, fmt, ...)					\
75 do {									\
76 	if ((type) & ONCE)						\
77 		cifs_dbg_func(once, type, fmt, ##__VA_ARGS__);		\
78 	else								\
79 		cifs_dbg_func(ratelimited, type, fmt, ##__VA_ARGS__);	\
80 } while (0)
81 
82 #define cifs_server_dbg_func(ratefunc, type, fmt, ...)			\
83 do {									\
84 	spin_lock(&server->srv_lock);					\
85 	if ((type) & FYI && cifsFYI & CIFS_INFO) {			\
86 		pr_debug_ ## ratefunc("%s: \\\\%s " fmt,		\
87 				      __FILE__, server->hostname,	\
88 				      ##__VA_ARGS__);			\
89 	} else if ((type) & VFS) {					\
90 		pr_err_ ## ratefunc("VFS: \\\\%s " fmt,			\
91 				    server->hostname, ##__VA_ARGS__);	\
92 	} else if ((type) & NOISY && (NOISY != 0)) {			\
93 		pr_debug_ ## ratefunc("\\\\%s " fmt,			\
94 				      server->hostname, ##__VA_ARGS__);	\
95 	}								\
96 	spin_unlock(&server->srv_lock);					\
97 } while (0)
98 
99 #define cifs_server_dbg(type, fmt, ...)					\
100 do {									\
101 	if ((type) & ONCE)						\
102 		cifs_server_dbg_func(once, type, fmt, ##__VA_ARGS__);	\
103 	else								\
104 		cifs_server_dbg_func(ratelimited, type, fmt,		\
105 				     ##__VA_ARGS__);			\
106 } while (0)
107 
108 #define cifs_tcon_dbg_func(ratefunc, type, fmt, ...)			\
109 do {									\
110 	const char *tn = "";						\
111 	if (tcon && tcon->tree_name)					\
112 		tn = tcon->tree_name;					\
113 	if ((type) & FYI && cifsFYI & CIFS_INFO) {			\
114 		pr_debug_ ## ratefunc("%s: %s "	fmt,			\
115 				      __FILE__, tn, ##__VA_ARGS__);	\
116 	} else if ((type) & VFS) {					\
117 		pr_err_ ## ratefunc("VFS: %s " fmt, tn, ##__VA_ARGS__);	\
118 	} else if ((type) & NOISY && (NOISY != 0)) {			\
119 		pr_debug_ ## ratefunc("%s " fmt, tn, ##__VA_ARGS__);	\
120 	}								\
121 } while (0)
122 
123 #define cifs_tcon_dbg(type, fmt, ...)					\
124 do {									\
125 	if ((type) & ONCE)						\
126 		cifs_tcon_dbg_func(once, type, fmt, ##__VA_ARGS__);	\
127 	else								\
128 		cifs_tcon_dbg_func(ratelimited, type, fmt,		\
129 				   ##__VA_ARGS__);			\
130 } while (0)
131 
132 /*
133  *	debug OFF
134  *	---------
135  */
136 #else		/* _CIFS_DEBUG */
137 #define cifs_dbg(type, fmt, ...)					\
138 do {									\
139 	if (0)								\
140 		pr_debug(fmt, ##__VA_ARGS__);				\
141 } while (0)
142 
143 #define cifs_server_dbg(type, fmt, ...)					\
144 do {									\
145 	if (0)								\
146 		pr_debug("\\\\%s " fmt,					\
147 			 server->hostname, ##__VA_ARGS__);		\
148 } while (0)
149 
150 #define cifs_tcon_dbg(type, fmt, ...)					\
151 do {									\
152 	if (0)								\
153 		pr_debug("%s " fmt, tcon->tree_name, ##__VA_ARGS__);	\
154 } while (0)
155 
156 #define cifs_info(fmt, ...)						\
157 	pr_info(fmt, ##__VA_ARGS__)
158 #endif
159 
160 #endif				/* _H_CIFS_DEBUG */
161