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