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 | |