1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (c) International Business Machines Corp., 2000,2002 5*4882a593Smuzhiyun * Modified by Steve French (sfrench@us.ibm.com) 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _H_CIFS_DEBUG 9*4882a593Smuzhiyun #define _H_CIFS_DEBUG 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifdef pr_fmt 12*4882a593Smuzhiyun #undef pr_fmt 13*4882a593Smuzhiyun #endif 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define pr_fmt(fmt) "CIFS: " fmt 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun void cifs_dump_mem(char *label, void *data, int length); 18*4882a593Smuzhiyun void cifs_dump_detail(void *buf, struct TCP_Server_Info *ptcp_info); 19*4882a593Smuzhiyun void cifs_dump_mids(struct TCP_Server_Info *); 20*4882a593Smuzhiyun extern bool traceSMB; /* flag which enables the function below */ 21*4882a593Smuzhiyun void dump_smb(void *, int); 22*4882a593Smuzhiyun #define CIFS_INFO 0x01 23*4882a593Smuzhiyun #define CIFS_RC 0x02 24*4882a593Smuzhiyun #define CIFS_TIMER 0x04 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define VFS 1 27*4882a593Smuzhiyun #define FYI 2 28*4882a593Smuzhiyun extern int cifsFYI; 29*4882a593Smuzhiyun #ifdef CONFIG_CIFS_DEBUG2 30*4882a593Smuzhiyun #define NOISY 4 31*4882a593Smuzhiyun #else 32*4882a593Smuzhiyun #define NOISY 0 33*4882a593Smuzhiyun #endif 34*4882a593Smuzhiyun #define ONCE 8 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* 37*4882a593Smuzhiyun * debug ON 38*4882a593Smuzhiyun * -------- 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun #ifdef CONFIG_CIFS_DEBUG 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * When adding tracepoints and debug messages we have various choices. 45*4882a593Smuzhiyun * Some considerations: 46*4882a593Smuzhiyun * 47*4882a593Smuzhiyun * Use cifs_dbg(VFS, ...) for things we always want logged, and the user to see 48*4882a593Smuzhiyun * cifs_info(...) slightly less important, admin can filter via loglevel > 6 49*4882a593Smuzhiyun * cifs_dbg(FYI, ...) minor debugging messages, off by default 50*4882a593Smuzhiyun * trace_smb3_* ftrace functions are preferred for complex debug messages 51*4882a593Smuzhiyun * intended for developers or experienced admins, off by default 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* Information level messages, minor events */ 55*4882a593Smuzhiyun #define cifs_info_func(ratefunc, fmt, ...) \ 56*4882a593Smuzhiyun pr_info_ ## ratefunc(fmt, ##__VA_ARGS__) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define cifs_info(fmt, ...) \ 59*4882a593Smuzhiyun cifs_info_func(ratelimited, fmt, ##__VA_ARGS__) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* information message: e.g., configuration, major event */ 62*4882a593Smuzhiyun #define cifs_dbg_func(ratefunc, type, fmt, ...) \ 63*4882a593Smuzhiyun do { \ 64*4882a593Smuzhiyun if ((type) & FYI && cifsFYI & CIFS_INFO) { \ 65*4882a593Smuzhiyun pr_debug_ ## ratefunc("%s: " fmt, \ 66*4882a593Smuzhiyun __FILE__, ##__VA_ARGS__); \ 67*4882a593Smuzhiyun } else if ((type) & VFS) { \ 68*4882a593Smuzhiyun pr_err_ ## ratefunc("VFS: " fmt, ##__VA_ARGS__); \ 69*4882a593Smuzhiyun } else if ((type) & NOISY && (NOISY != 0)) { \ 70*4882a593Smuzhiyun pr_debug_ ## ratefunc(fmt, ##__VA_ARGS__); \ 71*4882a593Smuzhiyun } \ 72*4882a593Smuzhiyun } while (0) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define cifs_dbg(type, fmt, ...) \ 75*4882a593Smuzhiyun do { \ 76*4882a593Smuzhiyun if ((type) & ONCE) \ 77*4882a593Smuzhiyun cifs_dbg_func(once, type, fmt, ##__VA_ARGS__); \ 78*4882a593Smuzhiyun else \ 79*4882a593Smuzhiyun cifs_dbg_func(ratelimited, type, fmt, ##__VA_ARGS__); \ 80*4882a593Smuzhiyun } while (0) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define cifs_server_dbg_func(ratefunc, type, fmt, ...) \ 83*4882a593Smuzhiyun do { \ 84*4882a593Smuzhiyun const char *sn = ""; \ 85*4882a593Smuzhiyun if (server && server->hostname) \ 86*4882a593Smuzhiyun sn = server->hostname; \ 87*4882a593Smuzhiyun if ((type) & FYI && cifsFYI & CIFS_INFO) { \ 88*4882a593Smuzhiyun pr_debug_ ## ratefunc("%s: \\\\%s " fmt, \ 89*4882a593Smuzhiyun __FILE__, sn, ##__VA_ARGS__); \ 90*4882a593Smuzhiyun } else if ((type) & VFS) { \ 91*4882a593Smuzhiyun pr_err_ ## ratefunc("VFS: \\\\%s " fmt, \ 92*4882a593Smuzhiyun sn, ##__VA_ARGS__); \ 93*4882a593Smuzhiyun } else if ((type) & NOISY && (NOISY != 0)) { \ 94*4882a593Smuzhiyun pr_debug_ ## ratefunc("\\\\%s " fmt, \ 95*4882a593Smuzhiyun sn, ##__VA_ARGS__); \ 96*4882a593Smuzhiyun } \ 97*4882a593Smuzhiyun } while (0) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define cifs_server_dbg(type, fmt, ...) \ 100*4882a593Smuzhiyun do { \ 101*4882a593Smuzhiyun if ((type) & ONCE) \ 102*4882a593Smuzhiyun cifs_server_dbg_func(once, type, fmt, ##__VA_ARGS__); \ 103*4882a593Smuzhiyun else \ 104*4882a593Smuzhiyun cifs_server_dbg_func(ratelimited, type, fmt, \ 105*4882a593Smuzhiyun ##__VA_ARGS__); \ 106*4882a593Smuzhiyun } while (0) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define cifs_tcon_dbg_func(ratefunc, type, fmt, ...) \ 109*4882a593Smuzhiyun do { \ 110*4882a593Smuzhiyun const char *tn = ""; \ 111*4882a593Smuzhiyun if (tcon && tcon->treeName) \ 112*4882a593Smuzhiyun tn = tcon->treeName; \ 113*4882a593Smuzhiyun if ((type) & FYI && cifsFYI & CIFS_INFO) { \ 114*4882a593Smuzhiyun pr_debug_ ## ratefunc("%s: %s " fmt, \ 115*4882a593Smuzhiyun __FILE__, tn, ##__VA_ARGS__); \ 116*4882a593Smuzhiyun } else if ((type) & VFS) { \ 117*4882a593Smuzhiyun pr_err_ ## ratefunc("VFS: %s " fmt, tn, ##__VA_ARGS__); \ 118*4882a593Smuzhiyun } else if ((type) & NOISY && (NOISY != 0)) { \ 119*4882a593Smuzhiyun pr_debug_ ## ratefunc("%s " fmt, tn, ##__VA_ARGS__); \ 120*4882a593Smuzhiyun } \ 121*4882a593Smuzhiyun } while (0) 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define cifs_tcon_dbg(type, fmt, ...) \ 124*4882a593Smuzhiyun do { \ 125*4882a593Smuzhiyun if ((type) & ONCE) \ 126*4882a593Smuzhiyun cifs_tcon_dbg_func(once, type, fmt, ##__VA_ARGS__); \ 127*4882a593Smuzhiyun else \ 128*4882a593Smuzhiyun cifs_tcon_dbg_func(ratelimited, type, fmt, \ 129*4882a593Smuzhiyun ##__VA_ARGS__); \ 130*4882a593Smuzhiyun } while (0) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* 133*4882a593Smuzhiyun * debug OFF 134*4882a593Smuzhiyun * --------- 135*4882a593Smuzhiyun */ 136*4882a593Smuzhiyun #else /* _CIFS_DEBUG */ 137*4882a593Smuzhiyun #define cifs_dbg(type, fmt, ...) \ 138*4882a593Smuzhiyun do { \ 139*4882a593Smuzhiyun if (0) \ 140*4882a593Smuzhiyun pr_debug(fmt, ##__VA_ARGS__); \ 141*4882a593Smuzhiyun } while (0) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define cifs_server_dbg(type, fmt, ...) \ 144*4882a593Smuzhiyun do { \ 145*4882a593Smuzhiyun if (0) \ 146*4882a593Smuzhiyun pr_debug("\\\\%s " fmt, \ 147*4882a593Smuzhiyun server->hostname, ##__VA_ARGS__); \ 148*4882a593Smuzhiyun } while (0) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define cifs_tcon_dbg(type, fmt, ...) \ 151*4882a593Smuzhiyun do { \ 152*4882a593Smuzhiyun if (0) \ 153*4882a593Smuzhiyun pr_debug("%s " fmt, tcon->treeName, ##__VA_ARGS__); \ 154*4882a593Smuzhiyun } while (0) 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #define cifs_info(fmt, ...) \ 157*4882a593Smuzhiyun pr_info(fmt, ##__VA_ARGS__) 158*4882a593Smuzhiyun #endif 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #endif /* _H_CIFS_DEBUG */ 161