Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * debug.c - NTFS kernel debug support. Part of the Linux-NTFS project. | |
3 | * | |
4 | * Copyright (c) 2001-2004 Anton Altaparmakov | |
5 | * | |
6 | * This program/include file is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU General Public License as published | |
8 | * by the Free Software Foundation; either version 2 of the License, or | |
9 | * (at your option) any later version. | |
10 | * | |
11 | * This program/include file is distributed in the hope that it will be | |
12 | * useful, but WITHOUT ANY WARRANTY; without even the implied warranty | |
13 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * along with this program (in the main directory of the Linux-NTFS | |
18 | * distribution in the file COPYING); if not, write to the Free Software | |
19 | * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
20 | */ | |
87c1b497 | 21 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
1da177e4 LT |
22 | #include "debug.h" |
23 | ||
1da177e4 LT |
24 | /** |
25 | * __ntfs_warning - output a warning to the syslog | |
26 | * @function: name of function outputting the warning | |
27 | * @sb: super block of mounted ntfs filesystem | |
28 | * @fmt: warning string containing format specifications | |
29 | * @...: a variable number of arguments specified in @fmt | |
30 | * | |
31 | * Outputs a warning to the syslog for the mounted ntfs filesystem described | |
32 | * by @sb. | |
33 | * | |
34 | * @fmt and the corresponding @... is printf style format string containing | |
35 | * the warning string and the corresponding format arguments, respectively. | |
36 | * | |
37 | * @function is the name of the function from which __ntfs_warning is being | |
38 | * called. | |
39 | * | |
40 | * Note, you should be using debug.h::ntfs_warning(@sb, @fmt, @...) instead | |
41 | * as this provides the @function parameter automatically. | |
42 | */ | |
43 | void __ntfs_warning(const char *function, const struct super_block *sb, | |
44 | const char *fmt, ...) | |
45 | { | |
87c1b497 | 46 | struct va_format vaf; |
1da177e4 LT |
47 | va_list args; |
48 | int flen = 0; | |
49 | ||
50 | #ifndef DEBUG | |
51 | if (!printk_ratelimit()) | |
52 | return; | |
53 | #endif | |
54 | if (function) | |
55 | flen = strlen(function); | |
1da177e4 | 56 | va_start(args, fmt); |
87c1b497 FF |
57 | vaf.fmt = fmt; |
58 | vaf.va = &args; | |
1da177e4 | 59 | if (sb) |
87c1b497 FF |
60 | pr_warn("(device %s): %s(): %pV\n", |
61 | sb->s_id, flen ? function : "", &vaf); | |
1da177e4 | 62 | else |
87c1b497 FF |
63 | pr_warn("%s(): %pV\n", flen ? function : "", &vaf); |
64 | va_end(args); | |
1da177e4 LT |
65 | } |
66 | ||
67 | /** | |
68 | * __ntfs_error - output an error to the syslog | |
69 | * @function: name of function outputting the error | |
70 | * @sb: super block of mounted ntfs filesystem | |
71 | * @fmt: error string containing format specifications | |
72 | * @...: a variable number of arguments specified in @fmt | |
73 | * | |
74 | * Outputs an error to the syslog for the mounted ntfs filesystem described | |
75 | * by @sb. | |
76 | * | |
77 | * @fmt and the corresponding @... is printf style format string containing | |
78 | * the error string and the corresponding format arguments, respectively. | |
79 | * | |
80 | * @function is the name of the function from which __ntfs_error is being | |
81 | * called. | |
82 | * | |
83 | * Note, you should be using debug.h::ntfs_error(@sb, @fmt, @...) instead | |
84 | * as this provides the @function parameter automatically. | |
85 | */ | |
86 | void __ntfs_error(const char *function, const struct super_block *sb, | |
87 | const char *fmt, ...) | |
88 | { | |
87c1b497 | 89 | struct va_format vaf; |
1da177e4 LT |
90 | va_list args; |
91 | int flen = 0; | |
92 | ||
93 | #ifndef DEBUG | |
94 | if (!printk_ratelimit()) | |
95 | return; | |
96 | #endif | |
97 | if (function) | |
98 | flen = strlen(function); | |
1da177e4 | 99 | va_start(args, fmt); |
87c1b497 FF |
100 | vaf.fmt = fmt; |
101 | vaf.va = &args; | |
1da177e4 | 102 | if (sb) |
87c1b497 FF |
103 | pr_err("(device %s): %s(): %pV\n", |
104 | sb->s_id, flen ? function : "", &vaf); | |
1da177e4 | 105 | else |
87c1b497 FF |
106 | pr_err("%s(): %pV\n", flen ? function : "", &vaf); |
107 | va_end(args); | |
1da177e4 LT |
108 | } |
109 | ||
110 | #ifdef DEBUG | |
111 | ||
112 | /* If 1, output debug messages, and if 0, don't. */ | |
113 | int debug_msgs = 0; | |
114 | ||
7143e494 | 115 | void __ntfs_debug(const char *file, int line, const char *function, |
1da177e4 LT |
116 | const char *fmt, ...) |
117 | { | |
87c1b497 | 118 | struct va_format vaf; |
1da177e4 LT |
119 | va_list args; |
120 | int flen = 0; | |
121 | ||
122 | if (!debug_msgs) | |
123 | return; | |
124 | if (function) | |
125 | flen = strlen(function); | |
1da177e4 | 126 | va_start(args, fmt); |
87c1b497 FF |
127 | vaf.fmt = fmt; |
128 | vaf.va = &args; | |
129 | pr_debug("(%s, %d): %s(): %pV", file, line, flen ? function : "", &vaf); | |
1da177e4 | 130 | va_end(args); |
1da177e4 LT |
131 | } |
132 | ||
133 | /* Dump a runlist. Caller has to provide synchronisation for @rl. */ | |
134 | void ntfs_debug_dump_runlist(const runlist_element *rl) | |
135 | { | |
136 | int i; | |
137 | const char *lcn_str[5] = { "LCN_HOLE ", "LCN_RL_NOT_MAPPED", | |
138 | "LCN_ENOENT ", "LCN_unknown " }; | |
139 | ||
140 | if (!debug_msgs) | |
141 | return; | |
87c1b497 | 142 | pr_debug("Dumping runlist (values in hex):\n"); |
1da177e4 | 143 | if (!rl) { |
87c1b497 | 144 | pr_debug("Run list not present.\n"); |
1da177e4 LT |
145 | return; |
146 | } | |
87c1b497 | 147 | pr_debug("VCN LCN Run length\n"); |
1da177e4 LT |
148 | for (i = 0; ; i++) { |
149 | LCN lcn = (rl + i)->lcn; | |
150 | ||
151 | if (lcn < (LCN)0) { | |
152 | int index = -lcn - 1; | |
153 | ||
154 | if (index > -LCN_ENOENT - 1) | |
155 | index = 3; | |
87c1b497 | 156 | pr_debug("%-16Lx %s %-16Lx%s\n", |
8907547d RD |
157 | (long long)(rl + i)->vcn, lcn_str[index], |
158 | (long long)(rl + i)->length, | |
159 | (rl + i)->length ? "" : | |
160 | " (runlist end)"); | |
1da177e4 | 161 | } else |
87c1b497 | 162 | pr_debug("%-16Lx %-16Lx %-16Lx%s\n", |
8907547d RD |
163 | (long long)(rl + i)->vcn, |
164 | (long long)(rl + i)->lcn, | |
165 | (long long)(rl + i)->length, | |
166 | (rl + i)->length ? "" : | |
167 | " (runlist end)"); | |
1da177e4 LT |
168 | if (!(rl + i)->length) |
169 | break; | |
170 | } | |
171 | } | |
172 | ||
173 | #endif |