162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) International Business Machines Corp., 2000,2002 562306a36Sopenharmony_ci * Modified by Steve French (sfrench@us.ibm.com) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _H_CIFS_DEBUG 962306a36Sopenharmony_ci#define _H_CIFS_DEBUG 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifdef pr_fmt 1262306a36Sopenharmony_ci#undef pr_fmt 1362306a36Sopenharmony_ci#endif 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define pr_fmt(fmt) "CIFS: " fmt 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_civoid cifs_dump_mem(char *label, void *data, int length); 1862306a36Sopenharmony_civoid cifs_dump_detail(void *buf, struct TCP_Server_Info *ptcp_info); 1962306a36Sopenharmony_civoid cifs_dump_mids(struct TCP_Server_Info *); 2062306a36Sopenharmony_ciextern bool traceSMB; /* flag which enables the function below */ 2162306a36Sopenharmony_civoid dump_smb(void *, int); 2262306a36Sopenharmony_ci#define CIFS_INFO 0x01 2362306a36Sopenharmony_ci#define CIFS_RC 0x02 2462306a36Sopenharmony_ci#define CIFS_TIMER 0x04 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define VFS 1 2762306a36Sopenharmony_ci#define FYI 2 2862306a36Sopenharmony_ciextern int cifsFYI; 2962306a36Sopenharmony_ci#ifdef CONFIG_CIFS_DEBUG2 3062306a36Sopenharmony_ci#define NOISY 4 3162306a36Sopenharmony_ci#else 3262306a36Sopenharmony_ci#define NOISY 0 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci#define ONCE 8 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* 3762306a36Sopenharmony_ci * debug ON 3862306a36Sopenharmony_ci * -------- 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ci#ifdef CONFIG_CIFS_DEBUG 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* 4462306a36Sopenharmony_ci * When adding tracepoints and debug messages we have various choices. 4562306a36Sopenharmony_ci * Some considerations: 4662306a36Sopenharmony_ci * 4762306a36Sopenharmony_ci * Use cifs_dbg(VFS, ...) for things we always want logged, and the user to see 4862306a36Sopenharmony_ci * cifs_info(...) slightly less important, admin can filter via loglevel > 6 4962306a36Sopenharmony_ci * cifs_dbg(FYI, ...) minor debugging messages, off by default 5062306a36Sopenharmony_ci * trace_smb3_* ftrace functions are preferred for complex debug messages 5162306a36Sopenharmony_ci * intended for developers or experienced admins, off by default 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* Information level messages, minor events */ 5562306a36Sopenharmony_ci#define cifs_info_func(ratefunc, fmt, ...) \ 5662306a36Sopenharmony_ci pr_info_ ## ratefunc(fmt, ##__VA_ARGS__) 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define cifs_info(fmt, ...) \ 5962306a36Sopenharmony_ci cifs_info_func(ratelimited, fmt, ##__VA_ARGS__) 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* information message: e.g., configuration, major event */ 6262306a36Sopenharmony_ci#define cifs_dbg_func(ratefunc, type, fmt, ...) \ 6362306a36Sopenharmony_cido { \ 6462306a36Sopenharmony_ci if ((type) & FYI && cifsFYI & CIFS_INFO) { \ 6562306a36Sopenharmony_ci pr_debug_ ## ratefunc("%s: " fmt, \ 6662306a36Sopenharmony_ci __FILE__, ##__VA_ARGS__); \ 6762306a36Sopenharmony_ci } else if ((type) & VFS) { \ 6862306a36Sopenharmony_ci pr_err_ ## ratefunc("VFS: " fmt, ##__VA_ARGS__); \ 6962306a36Sopenharmony_ci } else if ((type) & NOISY && (NOISY != 0)) { \ 7062306a36Sopenharmony_ci pr_debug_ ## ratefunc(fmt, ##__VA_ARGS__); \ 7162306a36Sopenharmony_ci } \ 7262306a36Sopenharmony_ci} while (0) 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define cifs_dbg(type, fmt, ...) \ 7562306a36Sopenharmony_cido { \ 7662306a36Sopenharmony_ci if ((type) & ONCE) \ 7762306a36Sopenharmony_ci cifs_dbg_func(once, type, fmt, ##__VA_ARGS__); \ 7862306a36Sopenharmony_ci else \ 7962306a36Sopenharmony_ci cifs_dbg_func(ratelimited, type, fmt, ##__VA_ARGS__); \ 8062306a36Sopenharmony_ci} while (0) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define cifs_server_dbg_func(ratefunc, type, fmt, ...) \ 8362306a36Sopenharmony_cido { \ 8462306a36Sopenharmony_ci spin_lock(&server->srv_lock); \ 8562306a36Sopenharmony_ci if ((type) & FYI && cifsFYI & CIFS_INFO) { \ 8662306a36Sopenharmony_ci pr_debug_ ## ratefunc("%s: \\\\%s " fmt, \ 8762306a36Sopenharmony_ci __FILE__, server->hostname, \ 8862306a36Sopenharmony_ci ##__VA_ARGS__); \ 8962306a36Sopenharmony_ci } else if ((type) & VFS) { \ 9062306a36Sopenharmony_ci pr_err_ ## ratefunc("VFS: \\\\%s " fmt, \ 9162306a36Sopenharmony_ci server->hostname, ##__VA_ARGS__); \ 9262306a36Sopenharmony_ci } else if ((type) & NOISY && (NOISY != 0)) { \ 9362306a36Sopenharmony_ci pr_debug_ ## ratefunc("\\\\%s " fmt, \ 9462306a36Sopenharmony_ci server->hostname, ##__VA_ARGS__); \ 9562306a36Sopenharmony_ci } \ 9662306a36Sopenharmony_ci spin_unlock(&server->srv_lock); \ 9762306a36Sopenharmony_ci} while (0) 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci#define cifs_server_dbg(type, fmt, ...) \ 10062306a36Sopenharmony_cido { \ 10162306a36Sopenharmony_ci if ((type) & ONCE) \ 10262306a36Sopenharmony_ci cifs_server_dbg_func(once, type, fmt, ##__VA_ARGS__); \ 10362306a36Sopenharmony_ci else \ 10462306a36Sopenharmony_ci cifs_server_dbg_func(ratelimited, type, fmt, \ 10562306a36Sopenharmony_ci ##__VA_ARGS__); \ 10662306a36Sopenharmony_ci} while (0) 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#define cifs_tcon_dbg_func(ratefunc, type, fmt, ...) \ 10962306a36Sopenharmony_cido { \ 11062306a36Sopenharmony_ci const char *tn = ""; \ 11162306a36Sopenharmony_ci if (tcon && tcon->tree_name) \ 11262306a36Sopenharmony_ci tn = tcon->tree_name; \ 11362306a36Sopenharmony_ci if ((type) & FYI && cifsFYI & CIFS_INFO) { \ 11462306a36Sopenharmony_ci pr_debug_ ## ratefunc("%s: %s " fmt, \ 11562306a36Sopenharmony_ci __FILE__, tn, ##__VA_ARGS__); \ 11662306a36Sopenharmony_ci } else if ((type) & VFS) { \ 11762306a36Sopenharmony_ci pr_err_ ## ratefunc("VFS: %s " fmt, tn, ##__VA_ARGS__); \ 11862306a36Sopenharmony_ci } else if ((type) & NOISY && (NOISY != 0)) { \ 11962306a36Sopenharmony_ci pr_debug_ ## ratefunc("%s " fmt, tn, ##__VA_ARGS__); \ 12062306a36Sopenharmony_ci } \ 12162306a36Sopenharmony_ci} while (0) 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci#define cifs_tcon_dbg(type, fmt, ...) \ 12462306a36Sopenharmony_cido { \ 12562306a36Sopenharmony_ci if ((type) & ONCE) \ 12662306a36Sopenharmony_ci cifs_tcon_dbg_func(once, type, fmt, ##__VA_ARGS__); \ 12762306a36Sopenharmony_ci else \ 12862306a36Sopenharmony_ci cifs_tcon_dbg_func(ratelimited, type, fmt, \ 12962306a36Sopenharmony_ci ##__VA_ARGS__); \ 13062306a36Sopenharmony_ci} while (0) 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci/* 13362306a36Sopenharmony_ci * debug OFF 13462306a36Sopenharmony_ci * --------- 13562306a36Sopenharmony_ci */ 13662306a36Sopenharmony_ci#else /* _CIFS_DEBUG */ 13762306a36Sopenharmony_ci#define cifs_dbg(type, fmt, ...) \ 13862306a36Sopenharmony_cido { \ 13962306a36Sopenharmony_ci if (0) \ 14062306a36Sopenharmony_ci pr_debug(fmt, ##__VA_ARGS__); \ 14162306a36Sopenharmony_ci} while (0) 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci#define cifs_server_dbg(type, fmt, ...) \ 14462306a36Sopenharmony_cido { \ 14562306a36Sopenharmony_ci if (0) \ 14662306a36Sopenharmony_ci pr_debug("\\\\%s " fmt, \ 14762306a36Sopenharmony_ci server->hostname, ##__VA_ARGS__); \ 14862306a36Sopenharmony_ci} while (0) 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci#define cifs_tcon_dbg(type, fmt, ...) \ 15162306a36Sopenharmony_cido { \ 15262306a36Sopenharmony_ci if (0) \ 15362306a36Sopenharmony_ci pr_debug("%s " fmt, tcon->tree_name, ##__VA_ARGS__); \ 15462306a36Sopenharmony_ci} while (0) 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci#define cifs_info(fmt, ...) \ 15762306a36Sopenharmony_ci pr_info(fmt, ##__VA_ARGS__) 15862306a36Sopenharmony_ci#endif 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#endif /* _H_CIFS_DEBUG */ 161