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