Merge tag 'csky-for-linus-5.4-rc1' of git://github.com/c-sky/csky-linux
[linux-2.6-block.git] / fs / cifs / cifs_debug.h
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 */