~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/btrfs/messages.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/btrfs/messages.c (Version linux-6.12-rc7) and /fs/btrfs/messages.c (Version linux-6.3.13)


  1 // SPDX-License-Identifier: GPL-2.0                 1 // SPDX-License-Identifier: GPL-2.0
  2                                                     2 
  3 #include "fs.h"                                     3 #include "fs.h"
  4 #include "messages.h"                               4 #include "messages.h"
  5 #include "discard.h"                                5 #include "discard.h"
                                                   >>   6 #include "transaction.h"
                                                   >>   7 #include "space-info.h"
  6 #include "super.h"                                  8 #include "super.h"
  7                                                     9 
  8 #ifdef CONFIG_PRINTK                               10 #ifdef CONFIG_PRINTK
  9                                                    11 
 10 #define STATE_STRING_PREFACE    " state "      !!  12 #define STATE_STRING_PREFACE    ": state "
 11 #define STATE_STRING_BUF_LEN    (sizeof(STATE_ !!  13 #define STATE_STRING_BUF_LEN    (sizeof(STATE_STRING_PREFACE) + BTRFS_FS_STATE_COUNT)
 12                                                    14 
 13 /*                                                 15 /*
 14  * Characters to print to indicate error condi     16  * Characters to print to indicate error conditions or uncommon filesystem state.
 15  * RO is not an error.                             17  * RO is not an error.
 16  */                                                18  */
 17 static const char fs_state_chars[] = {             19 static const char fs_state_chars[] = {
                                                   >>  20         [BTRFS_FS_STATE_ERROR]                  = 'E',
 18         [BTRFS_FS_STATE_REMOUNTING]                21         [BTRFS_FS_STATE_REMOUNTING]             = 'M',
 19         [BTRFS_FS_STATE_RO]                        22         [BTRFS_FS_STATE_RO]                     = 0,
 20         [BTRFS_FS_STATE_TRANS_ABORTED]             23         [BTRFS_FS_STATE_TRANS_ABORTED]          = 'A',
 21         [BTRFS_FS_STATE_DEV_REPLACING]             24         [BTRFS_FS_STATE_DEV_REPLACING]          = 'R',
 22         [BTRFS_FS_STATE_DUMMY_FS_INFO]             25         [BTRFS_FS_STATE_DUMMY_FS_INFO]          = 0,
 23         [BTRFS_FS_STATE_NO_DATA_CSUMS]         !!  26         [BTRFS_FS_STATE_NO_CSUMS]               = 'C',
 24         [BTRFS_FS_STATE_SKIP_META_CSUMS]       << 
 25         [BTRFS_FS_STATE_LOG_CLEANUP_ERROR]         27         [BTRFS_FS_STATE_LOG_CLEANUP_ERROR]      = 'L',
 26 };                                                 28 };
 27                                                    29 
 28 static void btrfs_state_to_string(const struct     30 static void btrfs_state_to_string(const struct btrfs_fs_info *info, char *buf)
 29 {                                                  31 {
 30         unsigned int bit;                          32         unsigned int bit;
 31         bool states_printed = false;               33         bool states_printed = false;
 32         unsigned long fs_state = READ_ONCE(inf     34         unsigned long fs_state = READ_ONCE(info->fs_state);
 33         char *curr = buf;                          35         char *curr = buf;
 34                                                    36 
 35         memcpy(curr, STATE_STRING_PREFACE, siz     37         memcpy(curr, STATE_STRING_PREFACE, sizeof(STATE_STRING_PREFACE));
 36         curr += sizeof(STATE_STRING_PREFACE) -     38         curr += sizeof(STATE_STRING_PREFACE) - 1;
 37                                                    39 
 38         if (BTRFS_FS_ERROR(info)) {            << 
 39                 *curr++ = 'E';                 << 
 40                 states_printed = true;         << 
 41         }                                      << 
 42                                                << 
 43         for_each_set_bit(bit, &fs_state, sizeo     40         for_each_set_bit(bit, &fs_state, sizeof(fs_state)) {
 44                 WARN_ON_ONCE(bit >= BTRFS_FS_S     41                 WARN_ON_ONCE(bit >= BTRFS_FS_STATE_COUNT);
 45                 if ((bit < BTRFS_FS_STATE_COUN     42                 if ((bit < BTRFS_FS_STATE_COUNT) && fs_state_chars[bit]) {
 46                         *curr++ = fs_state_cha     43                         *curr++ = fs_state_chars[bit];
 47                         states_printed = true;     44                         states_printed = true;
 48                 }                                  45                 }
 49         }                                          46         }
 50                                                    47 
 51         /* If no states were printed, reset th     48         /* If no states were printed, reset the buffer */
 52         if (!states_printed)                       49         if (!states_printed)
 53                 curr = buf;                        50                 curr = buf;
 54                                                    51 
 55         *curr++ = 0;                               52         *curr++ = 0;
 56 }                                                  53 }
 57 #endif                                             54 #endif
 58                                                    55 
 59 /*                                                 56 /*
 60  * Generally the error codes correspond to the     57  * Generally the error codes correspond to their respective errors, but there
 61  * are a few special cases.                        58  * are a few special cases.
 62  *                                                 59  *
 63  * EUCLEAN: Any sort of corruption that we enc     60  * EUCLEAN: Any sort of corruption that we encounter.  The tree-checker for
 64  *          instance will return EUCLEAN if an     61  *          instance will return EUCLEAN if any of the blocks are corrupted in
 65  *          a way that is problematic.  We wan     62  *          a way that is problematic.  We want to reserve EUCLEAN for these
 66  *          sort of corruptions.                   63  *          sort of corruptions.
 67  *                                                 64  *
 68  * EROFS: If we check BTRFS_FS_STATE_ERROR and     65  * EROFS: If we check BTRFS_FS_STATE_ERROR and fail out with a return error, we
 69  *        need to use EROFS for this case.  We     66  *        need to use EROFS for this case.  We will have no idea of the
 70  *        original failure, that will have bee     67  *        original failure, that will have been reported at the time we tripped
 71  *        over the error.  Each subsequent err     68  *        over the error.  Each subsequent error that doesn't have any context
 72  *        of the original error should use ERO     69  *        of the original error should use EROFS when handling BTRFS_FS_STATE_ERROR.
 73  */                                                70  */
 74 const char * __attribute_const__ btrfs_decode_ !!  71 const char * __attribute_const__ btrfs_decode_error(int errno)
 75 {                                                  72 {
 76         char *errstr = "unknown";                  73         char *errstr = "unknown";
 77                                                    74 
 78         switch (error) {                       !!  75         switch (errno) {
 79         case -ENOENT:           /* -2 */           76         case -ENOENT:           /* -2 */
 80                 errstr = "No such entry";          77                 errstr = "No such entry";
 81                 break;                             78                 break;
 82         case -EIO:              /* -5 */           79         case -EIO:              /* -5 */
 83                 errstr = "IO failure";             80                 errstr = "IO failure";
 84                 break;                             81                 break;
 85         case -ENOMEM:           /* -12*/           82         case -ENOMEM:           /* -12*/
 86                 errstr = "Out of memory";          83                 errstr = "Out of memory";
 87                 break;                             84                 break;
 88         case -EEXIST:           /* -17 */          85         case -EEXIST:           /* -17 */
 89                 errstr = "Object already exist     86                 errstr = "Object already exists";
 90                 break;                             87                 break;
 91         case -ENOSPC:           /* -28 */          88         case -ENOSPC:           /* -28 */
 92                 errstr = "No space left";          89                 errstr = "No space left";
 93                 break;                             90                 break;
 94         case -EROFS:            /* -30 */          91         case -EROFS:            /* -30 */
 95                 errstr = "Readonly filesystem"     92                 errstr = "Readonly filesystem";
 96                 break;                             93                 break;
 97         case -EOPNOTSUPP:       /* -95 */          94         case -EOPNOTSUPP:       /* -95 */
 98                 errstr = "Operation not suppor     95                 errstr = "Operation not supported";
 99                 break;                             96                 break;
100         case -EUCLEAN:          /* -117 */         97         case -EUCLEAN:          /* -117 */
101                 errstr = "Filesystem corrupted     98                 errstr = "Filesystem corrupted";
102                 break;                             99                 break;
103         case -EDQUOT:           /* -122 */        100         case -EDQUOT:           /* -122 */
104                 errstr = "Quota exceeded";        101                 errstr = "Quota exceeded";
105                 break;                            102                 break;
106         }                                         103         }
107                                                   104 
108         return errstr;                            105         return errstr;
109 }                                                 106 }
110                                                   107 
111 /*                                                108 /*
112  * Decodes expected errors from the caller and !! 109  * __btrfs_handle_fs_error decodes expected errors from the caller and
113  * response.                                   !! 110  * invokes the appropriate error response.
114  */                                               111  */
115 __cold                                            112 __cold
116 void __btrfs_handle_fs_error(struct btrfs_fs_i    113 void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function,
117                        unsigned int line, int  !! 114                        unsigned int line, int errno, const char *fmt, ...)
118 {                                                 115 {
119         struct super_block *sb = fs_info->sb;     116         struct super_block *sb = fs_info->sb;
120 #ifdef CONFIG_PRINTK                              117 #ifdef CONFIG_PRINTK
121         char statestr[STATE_STRING_BUF_LEN];      118         char statestr[STATE_STRING_BUF_LEN];
122         const char *errstr;                       119         const char *errstr;
123 #endif                                            120 #endif
124                                                   121 
125 #ifdef CONFIG_PRINTK_INDEX                        122 #ifdef CONFIG_PRINTK_INDEX
126         printk_index_subsys_emit(                 123         printk_index_subsys_emit(
127                 "BTRFS: error (device %s%s) in    124                 "BTRFS: error (device %s%s) in %s:%d: errno=%d %s", KERN_CRIT, fmt);
128 #endif                                            125 #endif
129                                                   126 
130         /*                                        127         /*
131          * Special case: if the error is EROFS    128          * Special case: if the error is EROFS, and we're already under
132          * SB_RDONLY, then it is safe here.       129          * SB_RDONLY, then it is safe here.
133          */                                       130          */
134         if (error == -EROFS && sb_rdonly(sb))  !! 131         if (errno == -EROFS && sb_rdonly(sb))
135                 return;                           132                 return;
136                                                   133 
137 #ifdef CONFIG_PRINTK                              134 #ifdef CONFIG_PRINTK
138         errstr = btrfs_decode_error(error);    !! 135         errstr = btrfs_decode_error(errno);
139         btrfs_state_to_string(fs_info, statest    136         btrfs_state_to_string(fs_info, statestr);
140         if (fmt) {                                137         if (fmt) {
141                 struct va_format vaf;             138                 struct va_format vaf;
142                 va_list args;                     139                 va_list args;
143                                                   140 
144                 va_start(args, fmt);              141                 va_start(args, fmt);
145                 vaf.fmt = fmt;                    142                 vaf.fmt = fmt;
146                 vaf.va = &args;                   143                 vaf.va = &args;
147                                                   144 
148                 pr_crit("BTRFS: error (device     145                 pr_crit("BTRFS: error (device %s%s) in %s:%d: errno=%d %s (%pV)\n",
149                         sb->s_id, statestr, fu !! 146                         sb->s_id, statestr, function, line, errno, errstr, &vaf);
150                 va_end(args);                     147                 va_end(args);
151         } else {                                  148         } else {
152                 pr_crit("BTRFS: error (device     149                 pr_crit("BTRFS: error (device %s%s) in %s:%d: errno=%d %s\n",
153                         sb->s_id, statestr, fu !! 150                         sb->s_id, statestr, function, line, errno, errstr);
154         }                                         151         }
155 #endif                                            152 #endif
156                                                   153 
157         /*                                        154         /*
158          * Today we only save the error info t    155          * Today we only save the error info to memory.  Long term we'll also
159          * send it down to the disk.              156          * send it down to the disk.
160          */                                       157          */
161         WRITE_ONCE(fs_info->fs_error, error);  !! 158         set_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state);
162                                                   159 
163         /* Don't go through full error handlin    160         /* Don't go through full error handling during mount. */
164         if (!(sb->s_flags & SB_BORN))             161         if (!(sb->s_flags & SB_BORN))
165                 return;                           162                 return;
166                                                   163 
167         if (sb_rdonly(sb))                        164         if (sb_rdonly(sb))
168                 return;                           165                 return;
169                                                   166 
170         btrfs_discard_stop(fs_info);              167         btrfs_discard_stop(fs_info);
171                                                   168 
172         /* Handle error by forcing the filesys    169         /* Handle error by forcing the filesystem readonly. */
173         btrfs_set_sb_rdonly(sb);                  170         btrfs_set_sb_rdonly(sb);
174         btrfs_info(fs_info, "forced readonly")    171         btrfs_info(fs_info, "forced readonly");
175         /*                                        172         /*
176          * Note that a running device replace     173          * Note that a running device replace operation is not canceled here
177          * although there is no way to update     174          * although there is no way to update the progress. It would add the
178          * risk of a deadlock, therefore the c    175          * risk of a deadlock, therefore the canceling is omitted. The only
179          * penalty is that some I/O remains ac    176          * penalty is that some I/O remains active until the procedure
180          * completes. The next time when the f    177          * completes. The next time when the filesystem is mounted writable
181          * again, the device replace operation    178          * again, the device replace operation continues.
182          */                                       179          */
183 }                                                 180 }
184                                                   181 
185 #ifdef CONFIG_PRINTK                              182 #ifdef CONFIG_PRINTK
186 static const char * const logtypes[] = {          183 static const char * const logtypes[] = {
187         "emergency",                              184         "emergency",
188         "alert",                                  185         "alert",
189         "critical",                               186         "critical",
190         "error",                                  187         "error",
191         "warning",                                188         "warning",
192         "notice",                                 189         "notice",
193         "info",                                   190         "info",
194         "debug",                                  191         "debug",
195 };                                                192 };
196                                                   193 
197 /*                                                194 /*
198  * Use one ratelimit state per log level so th    195  * Use one ratelimit state per log level so that a flood of less important
199  * messages doesn't cause more important ones     196  * messages doesn't cause more important ones to be dropped.
200  */                                               197  */
201 static struct ratelimit_state printk_limits[]     198 static struct ratelimit_state printk_limits[] = {
202         RATELIMIT_STATE_INIT(printk_limits[0],    199         RATELIMIT_STATE_INIT(printk_limits[0], DEFAULT_RATELIMIT_INTERVAL, 100),
203         RATELIMIT_STATE_INIT(printk_limits[1],    200         RATELIMIT_STATE_INIT(printk_limits[1], DEFAULT_RATELIMIT_INTERVAL, 100),
204         RATELIMIT_STATE_INIT(printk_limits[2],    201         RATELIMIT_STATE_INIT(printk_limits[2], DEFAULT_RATELIMIT_INTERVAL, 100),
205         RATELIMIT_STATE_INIT(printk_limits[3],    202         RATELIMIT_STATE_INIT(printk_limits[3], DEFAULT_RATELIMIT_INTERVAL, 100),
206         RATELIMIT_STATE_INIT(printk_limits[4],    203         RATELIMIT_STATE_INIT(printk_limits[4], DEFAULT_RATELIMIT_INTERVAL, 100),
207         RATELIMIT_STATE_INIT(printk_limits[5],    204         RATELIMIT_STATE_INIT(printk_limits[5], DEFAULT_RATELIMIT_INTERVAL, 100),
208         RATELIMIT_STATE_INIT(printk_limits[6],    205         RATELIMIT_STATE_INIT(printk_limits[6], DEFAULT_RATELIMIT_INTERVAL, 100),
209         RATELIMIT_STATE_INIT(printk_limits[7],    206         RATELIMIT_STATE_INIT(printk_limits[7], DEFAULT_RATELIMIT_INTERVAL, 100),
210 };                                                207 };
211                                                   208 
212 void __cold _btrfs_printk(const struct btrfs_f    209 void __cold _btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
213 {                                                 210 {
214         char lvl[PRINTK_MAX_SINGLE_HEADER_LEN     211         char lvl[PRINTK_MAX_SINGLE_HEADER_LEN + 1] = "\0";
215         struct va_format vaf;                     212         struct va_format vaf;
216         va_list args;                             213         va_list args;
217         int kern_level;                           214         int kern_level;
218         const char *type = logtypes[4];           215         const char *type = logtypes[4];
219         struct ratelimit_state *ratelimit = &p    216         struct ratelimit_state *ratelimit = &printk_limits[4];
220                                                   217 
221 #ifdef CONFIG_PRINTK_INDEX                        218 #ifdef CONFIG_PRINTK_INDEX
222         printk_index_subsys_emit("%sBTRFS %s (    219         printk_index_subsys_emit("%sBTRFS %s (device %s): ", NULL, fmt);
223 #endif                                            220 #endif
224                                                   221 
225         va_start(args, fmt);                      222         va_start(args, fmt);
226                                                   223 
227         while ((kern_level = printk_get_level(    224         while ((kern_level = printk_get_level(fmt)) != 0) {
228                 size_t size = printk_skip_leve    225                 size_t size = printk_skip_level(fmt) - fmt;
229                                                   226 
230                 if (kern_level >= '' && kern_l    227                 if (kern_level >= '' && kern_level <= '7') {
231                         memcpy(lvl, fmt,  size    228                         memcpy(lvl, fmt,  size);
232                         lvl[size] = '\0';         229                         lvl[size] = '\0';
233                         type = logtypes[kern_l    230                         type = logtypes[kern_level - ''];
234                         ratelimit = &printk_li    231                         ratelimit = &printk_limits[kern_level - ''];
235                 }                                 232                 }
236                 fmt += size;                      233                 fmt += size;
237         }                                         234         }
238                                                   235 
239         vaf.fmt = fmt;                            236         vaf.fmt = fmt;
240         vaf.va = &args;                           237         vaf.va = &args;
241                                                   238 
242         /* Do not ratelimit if CONFIG_BTRFS_DE !! 239         if (__ratelimit(ratelimit)) {
243         if (IS_ENABLED(CONFIG_BTRFS_DEBUG) ||  << 
244                 if (fs_info) {                    240                 if (fs_info) {
245                         char statestr[STATE_ST    241                         char statestr[STATE_STRING_BUF_LEN];
246                                                   242 
247                         btrfs_state_to_string(    243                         btrfs_state_to_string(fs_info, statestr);
248                         _printk("%sBTRFS %s (d    244                         _printk("%sBTRFS %s (device %s%s): %pV\n", lvl, type,
249                                 fs_info->sb->s    245                                 fs_info->sb->s_id, statestr, &vaf);
250                 } else {                          246                 } else {
251                         _printk("%sBTRFS %s: %    247                         _printk("%sBTRFS %s: %pV\n", lvl, type, &vaf);
252                 }                                 248                 }
253         }                                         249         }
254                                                   250 
255         va_end(args);                             251         va_end(args);
256 }                                                 252 }
257 #endif                                            253 #endif
258                                                   254 
                                                   >> 255 #ifdef CONFIG_BTRFS_ASSERT
                                                   >> 256 void __cold btrfs_assertfail(const char *expr, const char *file, int line)
                                                   >> 257 {
                                                   >> 258         pr_err("assertion failed: %s, in %s:%d\n", expr, file, line);
                                                   >> 259         BUG();
                                                   >> 260 }
                                                   >> 261 #endif
                                                   >> 262 
                                                   >> 263 void __cold btrfs_print_v0_err(struct btrfs_fs_info *fs_info)
                                                   >> 264 {
                                                   >> 265         btrfs_err(fs_info,
                                                   >> 266 "Unsupported V0 extent filesystem detected. Aborting. Please re-create your filesystem with a newer kernel");
                                                   >> 267 }
                                                   >> 268 
259 #if BITS_PER_LONG == 32                           269 #if BITS_PER_LONG == 32
260 void __cold btrfs_warn_32bit_limit(struct btrf    270 void __cold btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info)
261 {                                                 271 {
262         if (!test_and_set_bit(BTRFS_FS_32BIT_W    272         if (!test_and_set_bit(BTRFS_FS_32BIT_WARN, &fs_info->flags)) {
263                 btrfs_warn(fs_info, "reaching     273                 btrfs_warn(fs_info, "reaching 32bit limit for logical addresses");
264                 btrfs_warn(fs_info,               274                 btrfs_warn(fs_info,
265 "due to page cache limit on 32bit systems, btr    275 "due to page cache limit on 32bit systems, btrfs can't access metadata at or beyond %lluT",
266                            BTRFS_32BIT_MAX_FIL    276                            BTRFS_32BIT_MAX_FILE_SIZE >> 40);
267                 btrfs_warn(fs_info,               277                 btrfs_warn(fs_info,
268                            "please consider up    278                            "please consider upgrading to 64bit kernel/hardware");
269         }                                         279         }
270 }                                                 280 }
271                                                   281 
272 void __cold btrfs_err_32bit_limit(struct btrfs    282 void __cold btrfs_err_32bit_limit(struct btrfs_fs_info *fs_info)
273 {                                                 283 {
274         if (!test_and_set_bit(BTRFS_FS_32BIT_E    284         if (!test_and_set_bit(BTRFS_FS_32BIT_ERROR, &fs_info->flags)) {
275                 btrfs_err(fs_info, "reached 32    285                 btrfs_err(fs_info, "reached 32bit limit for logical addresses");
276                 btrfs_err(fs_info,                286                 btrfs_err(fs_info,
277 "due to page cache limit on 32bit systems, met    287 "due to page cache limit on 32bit systems, metadata beyond %lluT can't be accessed",
278                           BTRFS_32BIT_MAX_FILE    288                           BTRFS_32BIT_MAX_FILE_SIZE >> 40);
279                 btrfs_err(fs_info,                289                 btrfs_err(fs_info,
280                            "please consider up    290                            "please consider upgrading to 64bit kernel/hardware");
281         }                                         291         }
282 }                                                 292 }
283 #endif                                            293 #endif
284                                                   294 
285 /*                                                295 /*
286  * Decode unexpected, fatal errors from the ca !! 296  * __btrfs_panic decodes unexpected, fatal errors from the caller, issues an
287  * panic or BUGs, depending on mount options.  !! 297  * alert, and either panics or BUGs, depending on mount options.
288  */                                               298  */
289 __cold                                            299 __cold
290 void __btrfs_panic(const struct btrfs_fs_info  !! 300 void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
291                    unsigned int line, int erro !! 301                    unsigned int line, int errno, const char *fmt, ...)
292 {                                                 302 {
293         char *s_id = "<unknown>";                 303         char *s_id = "<unknown>";
294         const char *errstr;                       304         const char *errstr;
295         struct va_format vaf = { .fmt = fmt };    305         struct va_format vaf = { .fmt = fmt };
296         va_list args;                             306         va_list args;
297                                                   307 
298         if (fs_info)                              308         if (fs_info)
299                 s_id = fs_info->sb->s_id;         309                 s_id = fs_info->sb->s_id;
300                                                   310 
301         va_start(args, fmt);                      311         va_start(args, fmt);
302         vaf.va = &args;                           312         vaf.va = &args;
303                                                   313 
304         errstr = btrfs_decode_error(error);    !! 314         errstr = btrfs_decode_error(errno);
305         if (fs_info && (btrfs_test_opt(fs_info    315         if (fs_info && (btrfs_test_opt(fs_info, PANIC_ON_FATAL_ERROR)))
306                 panic(KERN_CRIT "BTRFS panic (    316                 panic(KERN_CRIT "BTRFS panic (device %s) in %s:%d: %pV (errno=%d %s)\n",
307                         s_id, function, line,  !! 317                         s_id, function, line, &vaf, errno, errstr);
308                                                   318 
309         btrfs_crit(fs_info, "panic in %s:%d: %    319         btrfs_crit(fs_info, "panic in %s:%d: %pV (errno=%d %s)",
310                    function, line, &vaf, error !! 320                    function, line, &vaf, errno, errstr);
311         va_end(args);                             321         va_end(args);
312         /* Caller calls BUG() */                  322         /* Caller calls BUG() */
313 }                                                 323 }
314                                                   324 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php