diff options
Diffstat (limited to 'fs/smb/client/cifs_debug.h')
| -rw-r--r-- | fs/smb/client/cifs_debug.h | 160 | 
1 files changed, 160 insertions, 0 deletions
diff --git a/fs/smb/client/cifs_debug.h b/fs/smb/client/cifs_debug.h new file mode 100644 index 000000000000..ce5cfd236fdb --- /dev/null +++ b/fs/smb/client/cifs_debug.h @@ -0,0 +1,160 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * + *   Copyright (c) International Business Machines  Corp., 2000,2002 + *   Modified by Steve French (sfrench@us.ibm.com) + */ + +#ifndef _H_CIFS_DEBUG +#define _H_CIFS_DEBUG + +#ifdef pr_fmt +#undef pr_fmt +#endif + +#define pr_fmt(fmt) "CIFS: " fmt + +void cifs_dump_mem(char *label, void *data, int length); +void cifs_dump_detail(void *buf, struct TCP_Server_Info *ptcp_info); +void cifs_dump_mids(struct TCP_Server_Info *); +extern bool traceSMB;		/* flag which enables the function below */ +void dump_smb(void *, int); +#define CIFS_INFO	0x01 +#define CIFS_RC		0x02 +#define CIFS_TIMER	0x04 + +#define VFS 1 +#define FYI 2 +extern int cifsFYI; +#ifdef CONFIG_CIFS_DEBUG2 +#define NOISY 4 +#else +#define NOISY 0 +#endif +#define ONCE 8 + +/* + *	debug ON + *	-------- + */ +#ifdef CONFIG_CIFS_DEBUG + + +/* + * When adding tracepoints and debug messages we have various choices. + * Some considerations: + * + * Use cifs_dbg(VFS, ...) for things we always want logged, and the user to see + *     cifs_info(...) slightly less important, admin can filter via loglevel > 6 + *     cifs_dbg(FYI, ...) minor debugging messages, off by default + *     trace_smb3_*  ftrace functions are preferred for complex debug messages + *                 intended for developers or experienced admins, off by default + */ + +/* Information level messages, minor events */ +#define cifs_info_func(ratefunc, fmt, ...)				\ +	pr_info_ ## ratefunc(fmt, ##__VA_ARGS__) + +#define cifs_info(fmt, ...)						\ +	cifs_info_func(ratelimited, fmt, ##__VA_ARGS__) + +/* information message: e.g., configuration, major event */ +#define cifs_dbg_func(ratefunc, type, fmt, ...)				\ +do {									\ +	if ((type) & FYI && cifsFYI & CIFS_INFO) {			\ +		pr_debug_ ## ratefunc("%s: " fmt,			\ +				      __FILE__, ##__VA_ARGS__);		\ +	} else if ((type) & VFS) {					\ +		pr_err_ ## ratefunc("VFS: " fmt, ##__VA_ARGS__);	\ +	} else if ((type) & NOISY && (NOISY != 0)) {			\ +		pr_debug_ ## ratefunc(fmt, ##__VA_ARGS__);		\ +	}								\ +} while (0) + +#define cifs_dbg(type, fmt, ...)					\ +do {									\ +	if ((type) & ONCE)						\ +		cifs_dbg_func(once, type, fmt, ##__VA_ARGS__);		\ +	else								\ +		cifs_dbg_func(ratelimited, type, fmt, ##__VA_ARGS__);	\ +} while (0) + +#define cifs_server_dbg_func(ratefunc, type, fmt, ...)			\ +do {									\ +	spin_lock(&server->srv_lock);					\ +	if ((type) & FYI && cifsFYI & CIFS_INFO) {			\ +		pr_debug_ ## ratefunc("%s: \\\\%s " fmt,		\ +				      __FILE__, server->hostname,	\ +				      ##__VA_ARGS__);			\ +	} else if ((type) & VFS) {					\ +		pr_err_ ## ratefunc("VFS: \\\\%s " fmt,			\ +				    server->hostname, ##__VA_ARGS__);	\ +	} else if ((type) & NOISY && (NOISY != 0)) {			\ +		pr_debug_ ## ratefunc("\\\\%s " fmt,			\ +				      server->hostname, ##__VA_ARGS__);	\ +	}								\ +	spin_unlock(&server->srv_lock);					\ +} while (0) + +#define cifs_server_dbg(type, fmt, ...)					\ +do {									\ +	if ((type) & ONCE)						\ +		cifs_server_dbg_func(once, type, fmt, ##__VA_ARGS__);	\ +	else								\ +		cifs_server_dbg_func(ratelimited, type, fmt,		\ +				     ##__VA_ARGS__);			\ +} while (0) + +#define cifs_tcon_dbg_func(ratefunc, type, fmt, ...)			\ +do {									\ +	const char *tn = "";						\ +	if (tcon && tcon->tree_name)					\ +		tn = tcon->tree_name;					\ +	if ((type) & FYI && cifsFYI & CIFS_INFO) {			\ +		pr_debug_ ## ratefunc("%s: %s "	fmt,			\ +				      __FILE__, tn, ##__VA_ARGS__);	\ +	} else if ((type) & VFS) {					\ +		pr_err_ ## ratefunc("VFS: %s " fmt, tn, ##__VA_ARGS__);	\ +	} else if ((type) & NOISY && (NOISY != 0)) {			\ +		pr_debug_ ## ratefunc("%s " fmt, tn, ##__VA_ARGS__);	\ +	}								\ +} while (0) + +#define cifs_tcon_dbg(type, fmt, ...)					\ +do {									\ +	if ((type) & ONCE)						\ +		cifs_tcon_dbg_func(once, type, fmt, ##__VA_ARGS__);	\ +	else								\ +		cifs_tcon_dbg_func(ratelimited, type, fmt,		\ +				   ##__VA_ARGS__);			\ +} while (0) + +/* + *	debug OFF + *	--------- + */ +#else		/* _CIFS_DEBUG */ +#define cifs_dbg(type, fmt, ...)					\ +do {									\ +	if (0)								\ +		pr_debug(fmt, ##__VA_ARGS__);				\ +} while (0) + +#define cifs_server_dbg(type, fmt, ...)					\ +do {									\ +	if (0)								\ +		pr_debug("\\\\%s " fmt,					\ +			 server->hostname, ##__VA_ARGS__);		\ +} while (0) + +#define cifs_tcon_dbg(type, fmt, ...)					\ +do {									\ +	if (0)								\ +		pr_debug("%s " fmt, tcon->tree_name, ##__VA_ARGS__);	\ +} while (0) + +#define cifs_info(fmt, ...)						\ +	pr_info(fmt, ##__VA_ARGS__) +#endif + +#endif				/* _H_CIFS_DEBUG */  | 
