161 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 *4 * Copyright (c) International Business Machines Corp., 2000,20025 * Modified by Steve French (sfrench@us.ibm.com)6 */7 8#ifndef _H_CIFS_DEBUG9#define _H_CIFS_DEBUG10 11#ifdef pr_fmt12#undef pr_fmt13#endif14 15#define pr_fmt(fmt) "CIFS: " fmt16 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 0x0123#define CIFS_RC 0x0224#define CIFS_TIMER 0x0425 26#define VFS 127#define FYI 228extern int cifsFYI;29#ifdef CONFIG_CIFS_DEBUG230#define NOISY 431#else32#define NOISY 033#endif34#define ONCE 835 36/*37 * debug ON38 * --------39 */40#ifdef CONFIG_CIFS_DEBUG41 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 see48 * cifs_info(...) slightly less important, admin can filter via loglevel > 649 * cifs_dbg(FYI, ...) minor debugging messages, off by default50 * trace_smb3_* ftrace functions are preferred for complex debug messages51 * intended for developers or experienced admins, off by default52 */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 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, ...) \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->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, ...) \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 OFF134 * ---------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->tree_name, ##__VA_ARGS__); \154} while (0)155 156#define cifs_info(fmt, ...) \157 pr_info(fmt, ##__VA_ARGS__)158#endif159 160#endif /* _H_CIFS_DEBUG */161