linux/fs/cifs/cifs_debug.h
<<
>>
Prefs
   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
  11void cifs_dump_mem(char *label, void *data, int length);
  12void cifs_dump_detail(void *buf, struct TCP_Server_Info *ptcp_info);
  13void cifs_dump_mids(struct TCP_Server_Info *);
  14extern bool traceSMB;           /* flag which enables the function below */
  15void dump_smb(void *, int);
  16#define CIFS_INFO       0x01
  17#define CIFS_RC         0x02
  18#define CIFS_TIMER      0x04
  19
  20#define VFS 1
  21#define FYI 2
  22extern int cifsFYI;
  23#ifdef CONFIG_CIFS_DEBUG2
  24#define NOISY 4
  25#else
  26#define NOISY 0
  27#endif
  28#define ONCE 8
  29
  30/*
  31 *      debug ON
  32 *      --------
  33 */
  34#ifdef CONFIG_CIFS_DEBUG
  35
  36
  37/*
  38 * When adding tracepoints and debug messages we have various choices.
  39 * Some considerations:
  40 *
  41 * Use cifs_dbg(VFS, ...) for things we always want logged, and the user to see
  42 *     cifs_info(...) slightly less important, admin can filter via loglevel > 6
  43 *     cifs_dbg(FYI, ...) minor debugging messages, off by default
  44 *     trace_smb3_*  ftrace functions are preferred for complex debug messages
  45 *                 intended for developers or experienced admins, off by default
  46 */
  47
  48/* Information level messages, minor events */
  49#define cifs_info_func(ratefunc, fmt, ...)                      \
  50do {                                                            \
  51        pr_info_ ## ratefunc("CIFS: " fmt, ##__VA_ARGS__);      \
  52} while (0)
  53
  54#define cifs_info(fmt, ...)                                     \
  55do {                                                            \
  56        cifs_info_func(ratelimited, fmt, ##__VA_ARGS__);        \
  57} while (0)
  58
  59/* information message: e.g., configuration, major event */
  60#define cifs_dbg_func(ratefunc, type, fmt, ...)                 \
  61do {                                                            \
  62        if ((type) & FYI && cifsFYI & CIFS_INFO) {              \
  63                pr_debug_ ## ratefunc("%s: "                    \
  64                                fmt, __FILE__, ##__VA_ARGS__);  \
  65        } else if ((type) & VFS) {                              \
  66                pr_err_ ## ratefunc("CIFS VFS: "                \
  67                                 fmt, ##__VA_ARGS__);           \
  68        } else if ((type) & NOISY && (NOISY != 0)) {            \
  69                pr_debug_ ## ratefunc(fmt, ##__VA_ARGS__);      \
  70        }                                                       \
  71} while (0)
  72
  73#define cifs_dbg(type, fmt, ...) \
  74do {                                                    \
  75        if ((type) & ONCE)                              \
  76                cifs_dbg_func(once,                     \
  77                         type, fmt, ##__VA_ARGS__);     \
  78        else                                            \
  79                cifs_dbg_func(ratelimited,              \
  80                        type, fmt, ##__VA_ARGS__);      \
  81} while (0)
  82
  83#define cifs_server_dbg_func(ratefunc, type, fmt, ...)          \
  84do {                                                            \
  85        const char *sn = "";                                    \
  86        if (server && server->hostname)                         \
  87                sn = server->hostname;                          \
  88        if ((type) & FYI && cifsFYI & CIFS_INFO) {              \
  89                pr_debug_ ## ratefunc("%s: \\\\%s "     fmt,    \
  90                        __FILE__, sn, ##__VA_ARGS__);           \
  91        } else if ((type) & VFS) {                              \
  92                pr_err_ ## ratefunc("CIFS VFS: \\\\%s " fmt,    \
  93                        sn, ##__VA_ARGS__);                     \
  94        } else if ((type) & NOISY && (NOISY != 0)) {            \
  95                pr_debug_ ## ratefunc("\\\\%s " fmt,            \
  96                        sn, ##__VA_ARGS__);                     \
  97        }                                                       \
  98} while (0)
  99
 100#define cifs_server_dbg(type, fmt, ...)                 \
 101do {                                                    \
 102        if ((type) & ONCE)                              \
 103                cifs_server_dbg_func(once,              \
 104                        type, fmt, ##__VA_ARGS__);      \
 105        else                                            \
 106                cifs_server_dbg_func(ratelimited,       \
 107                        type, fmt, ##__VA_ARGS__);      \
 108} while (0)
 109
 110#define cifs_tcon_dbg_func(ratefunc, type, fmt, ...)            \
 111do {                                                            \
 112        const char *tn = "";                                    \
 113        if (tcon && tcon->treeName)                             \
 114                tn = tcon->treeName;                            \
 115        if ((type) & FYI && cifsFYI & CIFS_INFO) {              \
 116                pr_debug_ ## ratefunc("%s: %s " fmt,            \
 117                        __FILE__, tn, ##__VA_ARGS__);           \
 118        } else if ((type) & VFS) {                              \
 119                pr_err_ ## ratefunc("CIFS VFS: %s " fmt,        \
 120                        tn, ##__VA_ARGS__);                     \
 121        } else if ((type) & NOISY && (NOISY != 0)) {            \
 122                pr_debug_ ## ratefunc("%s " fmt,                \
 123                        tn, ##__VA_ARGS__);                     \
 124        }                                                       \
 125} while (0)
 126
 127#define cifs_tcon_dbg(type, fmt, ...)                   \
 128do {                                                    \
 129        if ((type) & ONCE)                              \
 130                cifs_tcon_dbg_func(once,                \
 131                        type, fmt, ##__VA_ARGS__);      \
 132        else                                            \
 133                cifs_tcon_dbg_func(ratelimited, \
 134                        type, fmt, ##__VA_ARGS__);      \
 135} while (0)
 136
 137/*
 138 *      debug OFF
 139 *      ---------
 140 */
 141#else           /* _CIFS_DEBUG */
 142#define cifs_dbg(type, fmt, ...)                                        \
 143do {                                                                    \
 144        if (0)                                                          \
 145                pr_debug(fmt, ##__VA_ARGS__);                           \
 146} while (0)
 147
 148#define cifs_server_dbg(type, fmt, ...)                                 \
 149do {                                                                    \
 150        if (0)                                                          \
 151                pr_debug("\\\\%s " fmt,                                 \
 152                         server->hostname, ##__VA_ARGS__);              \
 153} while (0)
 154
 155#define cifs_tcon_dbg(type, fmt, ...)                                   \
 156do {                                                                    \
 157        if (0)                                                          \
 158                pr_debug("%s " fmt, tcon->treeName, ##__VA_ARGS__);     \
 159} while (0)
 160
 161#define cifs_info(fmt, ...)                                             \
 162do {                                                                    \
 163        pr_info("CIFS: "fmt, ##__VA_ARGS__);                            \
 164} while (0)
 165#endif
 166
 167#endif                          /* _H_CIFS_DEBUG */
 168