cifs_debug.h (4410B)
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 17void cifs_dump_mem(char *label, void *data, int length); 18void cifs_dump_detail(void *buf, struct TCP_Server_Info *ptcp_info); 19void cifs_dump_mids(struct TCP_Server_Info *); 20extern bool traceSMB; /* flag which enables the function below */ 21void 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 28extern 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, ...) \ 63do { \ 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, ...) \ 75do { \ 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, ...) \ 83do { \ 84 const char *sn = ""; \ 85 if (server && server->hostname) \ 86 sn = server->hostname; \ 87 if ((type) & FYI && cifsFYI & CIFS_INFO) { \ 88 pr_debug_ ## ratefunc("%s: \\\\%s " fmt, \ 89 __FILE__, sn, ##__VA_ARGS__); \ 90 } else if ((type) & VFS) { \ 91 pr_err_ ## ratefunc("VFS: \\\\%s " fmt, \ 92 sn, ##__VA_ARGS__); \ 93 } else if ((type) & NOISY && (NOISY != 0)) { \ 94 pr_debug_ ## ratefunc("\\\\%s " fmt, \ 95 sn, ##__VA_ARGS__); \ 96 } \ 97} while (0) 98 99#define cifs_server_dbg(type, fmt, ...) \ 100do { \ 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, ...) \ 109do { \ 110 const char *tn = ""; \ 111 if (tcon && tcon->treeName) \ 112 tn = tcon->treeName; \ 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, ...) \ 124do { \ 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, ...) \ 138do { \ 139 if (0) \ 140 pr_debug(fmt, ##__VA_ARGS__); \ 141} while (0) 142 143#define cifs_server_dbg(type, fmt, ...) \ 144do { \ 145 if (0) \ 146 pr_debug("\\\\%s " fmt, \ 147 server->hostname, ##__VA_ARGS__); \ 148} while (0) 149 150#define cifs_tcon_dbg(type, fmt, ...) \ 151do { \ 152 if (0) \ 153 pr_debug("%s " fmt, tcon->treeName, ##__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 */