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
  11#ifdef pr_fmt
  12#undef pr_fmt
  13#endif
  14
  15#define pr_fmt(fmt) "CIFS: " fmt
  16
  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       0x01
  23#define CIFS_RC         0x02
  24#define CIFS_TIMER      0x04
  25
  26#define VFS 1
  27#define FYI 2
  28extern int cifsFYI;
  29#ifdef CONFIG_CIFS_DEBUG2
  30#define NOISY 4
  31#else
  32#define NOISY 0
  33#endif
  34#define ONCE 8
  35
  36/*
  37 *      debug ON
  38 *      --------
  39 */
  40#ifdef CONFIG_CIFS_DEBUG
  41
  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 see
  48 *     cifs_info(...) slightly less important, admin can filter via loglevel > 6
  49 *     cifs_dbg(FYI, ...) minor debugging messages, off by default
  50 *     trace_smb3_*  ftrace functions are preferred for complex debug messages
  51 *                 intended for developers or experienced admins, off by default
  52 */
  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        const char *sn = "";                                            \
  85        if (server && server->hostname)                                 \
  86                sn = server->hostname;                                  \
  87        if ((type) & FYI && cifsFYI & CIFS_INFO) {                      \
  88                pr_debug_ ## ratefunc("%s: \\\\%s " fmt,                \
  89                                      __FILE__, sn, ##__VA_ARGS__);     \
  90        } else if ((type) & VFS) {                                      \
  91                pr_err_ ## ratefunc("VFS: \\\\%s " fmt,                 \
  92                                    sn, ##__VA_ARGS__);                 \
  93        } else if ((type) & NOISY && (NOISY != 0)) {                    \
  94                pr_debug_ ## ratefunc("\\\\%s " fmt,                    \
  95                                      sn, ##__VA_ARGS__);               \
  96        }                                                               \
  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->treeName)                                     \
 112                tn = tcon->treeName;                                    \
 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 OFF
 134 *      ---------
 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->treeName, ##__VA_ARGS__);     \
 154} while (0)
 155
 156#define cifs_info(fmt, ...)                                             \
 157        pr_info(fmt, ##__VA_ARGS__)
 158#endif
 159
 160#endif                          /* _H_CIFS_DEBUG */
 161