Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * NTFS kernel debug support.
4 *
5 * Copyright (c) 2001-2004 Anton Altaparmakov
6 */
7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8#include "debug.h"
9
10/*
11 * __ntfs_warning - output a warning to the syslog
12 * @function: name of function outputting the warning
13 * @sb: super block of mounted ntfs filesystem
14 * @fmt: warning string containing format specifications
15 * @...: a variable number of arguments specified in @fmt
16 *
17 * Outputs a warning to the syslog for the mounted ntfs filesystem described
18 * by @sb.
19 *
20 * @fmt and the corresponding @... is printf style format string containing
21 * the warning string and the corresponding format arguments, respectively.
22 *
23 * @function is the name of the function from which __ntfs_warning is being
24 * called.
25 *
26 * Note, you should be using debug.h::ntfs_warning(@sb, @fmt, @...) instead
27 * as this provides the @function parameter automatically.
28 */
29void __ntfs_warning(const char *function, const struct super_block *sb,
30 const char *fmt, ...)
31{
32 struct va_format vaf;
33 va_list args;
34 int flen = 0;
35
36 if (function)
37 flen = strlen(function);
38 va_start(args, fmt);
39 vaf.fmt = fmt;
40 vaf.va = &args;
41#ifdef DEBUG
42 if (sb)
43 pr_warn("(device %s): %s(): %pV\n",
44 sb->s_id, flen ? function : "", &vaf);
45 else
46 pr_warn("%s(): %pV\n", flen ? function : "", &vaf);
47#else
48 if (sb)
49 pr_warn_ratelimited("(device %s): %s(): %pV\n",
50 sb->s_id, flen ? function : "", &vaf);
51 else
52 pr_warn_ratelimited("%s(): %pV\n", flen ? function : "", &vaf);
53#endif
54 va_end(args);
55}
56
57/*
58 * __ntfs_error - output an error to the syslog
59 * @function: name of function outputting the error
60 * @sb: super block of mounted ntfs filesystem
61 * @fmt: error string containing format specifications
62 * @...: a variable number of arguments specified in @fmt
63 *
64 * Outputs an error to the syslog for the mounted ntfs filesystem described
65 * by @sb.
66 *
67 * @fmt and the corresponding @... is printf style format string containing
68 * the error string and the corresponding format arguments, respectively.
69 *
70 * @function is the name of the function from which __ntfs_error is being
71 * called.
72 *
73 * Note, you should be using debug.h::ntfs_error(@sb, @fmt, @...) instead
74 * as this provides the @function parameter automatically.
75 */
76void __ntfs_error(const char *function, struct super_block *sb,
77 const char *fmt, ...)
78{
79 struct va_format vaf;
80 va_list args;
81 int flen = 0;
82
83 if (function)
84 flen = strlen(function);
85 va_start(args, fmt);
86 vaf.fmt = fmt;
87 vaf.va = &args;
88#ifdef DEBUG
89 if (sb)
90 pr_err("(device %s): %s(): %pV\n",
91 sb->s_id, flen ? function : "", &vaf);
92 else
93 pr_err("%s(): %pV\n", flen ? function : "", &vaf);
94#else
95 if (sb)
96 pr_err_ratelimited("(device %s): %s(): %pV\n",
97 sb->s_id, flen ? function : "", &vaf);
98 else
99 pr_err_ratelimited("%s(): %pV\n", flen ? function : "", &vaf);
100#endif
101 va_end(args);
102
103 if (sb)
104 ntfs_handle_error(sb);
105}
106
107#ifdef DEBUG
108
109/* If 1, output debug messages, and if 0, don't. */
110int debug_msgs;
111
112void __ntfs_debug(const char *file, int line, const char *function,
113 const char *fmt, ...)
114{
115 struct va_format vaf;
116 va_list args;
117 int flen = 0;
118
119 if (!debug_msgs)
120 return;
121 if (function)
122 flen = strlen(function);
123 va_start(args, fmt);
124 vaf.fmt = fmt;
125 vaf.va = &args;
126 pr_debug("(%s, %d): %s(): %pV", file, line, flen ? function : "", &vaf);
127 va_end(args);
128}
129
130/* Dump a runlist. Caller has to provide synchronisation for @rl. */
131void ntfs_debug_dump_runlist(const struct runlist_element *rl)
132{
133 int i;
134 const char *lcn_str[5] = { "LCN_DELALLOC ", "LCN_HOLE ",
135 "LCN_RL_NOT_MAPPED", "LCN_ENOENT ",
136 "LCN_unknown " };
137
138 if (!debug_msgs)
139 return;
140 pr_debug("Dumping runlist (values in hex):\n");
141 if (!rl) {
142 pr_debug("Run list not present.\n");
143 return;
144 }
145 pr_debug("VCN LCN Run length\n");
146 for (i = 0; ; i++) {
147 s64 lcn = (rl + i)->lcn;
148
149 if (lcn < 0) {
150 int index = -lcn - 1;
151
152 if (index > -LCN_ENOENT - 1)
153 index = 3;
154 pr_debug("%-16Lx %s %-16Lx%s\n",
155 (long long)(rl + i)->vcn, lcn_str[index],
156 (long long)(rl + i)->length,
157 (rl + i)->length ? "" :
158 " (runlist end)");
159 } else
160 pr_debug("%-16Lx %-16Lx %-16Lx%s\n",
161 (long long)(rl + i)->vcn,
162 (long long)(rl + i)->lcn,
163 (long long)(rl + i)->length,
164 (rl + i)->length ? "" :
165 " (runlist end)");
166 if (!(rl + i)->length)
167 break;
168 }
169}
170
171#endif