cifs: handle cases where a channel is closed
[platform/kernel/linux-rpi.git] / fs / smb / client / 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 #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 */