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