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