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