1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef BTRFS_MESSAGES_H 4 #define BTRFS_MESSAGES_H 5 6 #include <linux/types.h> 7 8 struct btrfs_fs_info; 9 struct btrfs_trans_handle; 10 11 static inline __printf(2, 3) __cold 12 void btrfs_no_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...) 13 { 14 } 15 16 #ifdef CONFIG_PRINTK 17 18 #define btrfs_printk(fs_info, fmt, args...) \ 19 _btrfs_printk(fs_info, fmt, ##args) 20 21 __printf(2, 3) 22 __cold 23 void _btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...); 24 25 #else 26 27 #define btrfs_printk(fs_info, fmt, args...) \ 28 btrfs_no_printk(fs_info, fmt, ##args) 29 #endif 30 31 #define btrfs_emerg(fs_info, fmt, args...) \ 32 btrfs_printk(fs_info, KERN_EMERG fmt, ##args) 33 #define btrfs_alert(fs_info, fmt, args...) \ 34 btrfs_printk(fs_info, KERN_ALERT fmt, ##args) 35 #define btrfs_crit(fs_info, fmt, args...) \ 36 btrfs_printk(fs_info, KERN_CRIT fmt, ##args) 37 #define btrfs_err(fs_info, fmt, args...) \ 38 btrfs_printk(fs_info, KERN_ERR fmt, ##args) 39 #define btrfs_warn(fs_info, fmt, args...) \ 40 btrfs_printk(fs_info, KERN_WARNING fmt, ##args) 41 #define btrfs_notice(fs_info, fmt, args...) \ 42 btrfs_printk(fs_info, KERN_NOTICE fmt, ##args) 43 #define btrfs_info(fs_info, fmt, args...) \ 44 btrfs_printk(fs_info, KERN_INFO fmt, ##args) 45 46 /* 47 * Wrappers that use printk_in_rcu 48 */ 49 #define btrfs_emerg_in_rcu(fs_info, fmt, args...) \ 50 btrfs_printk_in_rcu(fs_info, KERN_EMERG fmt, ##args) 51 #define btrfs_alert_in_rcu(fs_info, fmt, args...) \ 52 btrfs_printk_in_rcu(fs_info, KERN_ALERT fmt, ##args) 53 #define btrfs_crit_in_rcu(fs_info, fmt, args...) \ 54 btrfs_printk_in_rcu(fs_info, KERN_CRIT fmt, ##args) 55 #define btrfs_err_in_rcu(fs_info, fmt, args...) \ 56 btrfs_printk_in_rcu(fs_info, KERN_ERR fmt, ##args) 57 #define btrfs_warn_in_rcu(fs_info, fmt, args...) \ 58 btrfs_printk_in_rcu(fs_info, KERN_WARNING fmt, ##args) 59 #define btrfs_notice_in_rcu(fs_info, fmt, args...) \ 60 btrfs_printk_in_rcu(fs_info, KERN_NOTICE fmt, ##args) 61 #define btrfs_info_in_rcu(fs_info, fmt, args...) \ 62 btrfs_printk_in_rcu(fs_info, KERN_INFO fmt, ##args) 63 64 /* 65 * Wrappers that use a ratelimited printk_in_rcu 66 */ 67 #define btrfs_emerg_rl_in_rcu(fs_info, fmt, args...) \ 68 btrfs_printk_rl_in_rcu(fs_info, KERN_EMERG fmt, ##args) 69 #define btrfs_alert_rl_in_rcu(fs_info, fmt, args...) \ 70 btrfs_printk_rl_in_rcu(fs_info, KERN_ALERT fmt, ##args) 71 #define btrfs_crit_rl_in_rcu(fs_info, fmt, args...) \ 72 btrfs_printk_rl_in_rcu(fs_info, KERN_CRIT fmt, ##args) 73 #define btrfs_err_rl_in_rcu(fs_info, fmt, args...) \ 74 btrfs_printk_rl_in_rcu(fs_info, KERN_ERR fmt, ##args) 75 #define btrfs_warn_rl_in_rcu(fs_info, fmt, args...) \ 76 btrfs_printk_rl_in_rcu(fs_info, KERN_WARNING fmt, ##args) 77 #define btrfs_notice_rl_in_rcu(fs_info, fmt, args...) \ 78 btrfs_printk_rl_in_rcu(fs_info, KERN_NOTICE fmt, ##args) 79 #define btrfs_info_rl_in_rcu(fs_info, fmt, args...) \ 80 btrfs_printk_rl_in_rcu(fs_info, KERN_INFO fmt, ##args) 81 82 /* 83 * Wrappers that use a ratelimited printk 84 */ 85 #define btrfs_emerg_rl(fs_info, fmt, args...) \ 86 btrfs_printk_ratelimited(fs_info, KERN_EMERG fmt, ##args) 87 #define btrfs_alert_rl(fs_info, fmt, args...) \ 88 btrfs_printk_ratelimited(fs_info, KERN_ALERT fmt, ##args) 89 #define btrfs_crit_rl(fs_info, fmt, args...) \ 90 btrfs_printk_ratelimited(fs_info, KERN_CRIT fmt, ##args) 91 #define btrfs_err_rl(fs_info, fmt, args...) \ 92 btrfs_printk_ratelimited(fs_info, KERN_ERR fmt, ##args) 93 #define btrfs_warn_rl(fs_info, fmt, args...) \ 94 btrfs_printk_ratelimited(fs_info, KERN_WARNING fmt, ##args) 95 #define btrfs_notice_rl(fs_info, fmt, args...) \ 96 btrfs_printk_ratelimited(fs_info, KERN_NOTICE fmt, ##args) 97 #define btrfs_info_rl(fs_info, fmt, args...) \ 98 btrfs_printk_ratelimited(fs_info, KERN_INFO fmt, ##args) 99 100 #if defined(CONFIG_DYNAMIC_DEBUG) 101 #define btrfs_debug(fs_info, fmt, args...) \ 102 _dynamic_func_call_no_desc(fmt, btrfs_printk, \ 103 fs_info, KERN_DEBUG fmt, ##args) 104 #define btrfs_debug_in_rcu(fs_info, fmt, args...) \ 105 _dynamic_func_call_no_desc(fmt, btrfs_printk_in_rcu, \ 106 fs_info, KERN_DEBUG fmt, ##args) 107 #define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \ 108 _dynamic_func_call_no_desc(fmt, btrfs_printk_rl_in_rcu, \ 109 fs_info, KERN_DEBUG fmt, ##args) 110 #define btrfs_debug_rl(fs_info, fmt, args...) \ 111 _dynamic_func_call_no_desc(fmt, btrfs_printk_ratelimited, \ 112 fs_info, KERN_DEBUG fmt, ##args) 113 #elif defined(DEBUG) 114 #define btrfs_debug(fs_info, fmt, args...) \ 115 btrfs_printk(fs_info, KERN_DEBUG fmt, ##args) 116 #define btrfs_debug_in_rcu(fs_info, fmt, args...) \ 117 btrfs_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args) 118 #define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \ 119 btrfs_printk_rl_in_rcu(fs_info, KERN_DEBUG fmt, ##args) 120 #define btrfs_debug_rl(fs_info, fmt, args...) \ 121 btrfs_printk_ratelimited(fs_info, KERN_DEBUG fmt, ##args) 122 #else 123 #define btrfs_debug(fs_info, fmt, args...) \ 124 btrfs_no_printk(fs_info, KERN_DEBUG fmt, ##args) 125 #define btrfs_debug_in_rcu(fs_info, fmt, args...) \ 126 btrfs_no_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args) 127 #define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \ 128 btrfs_no_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args) 129 #define btrfs_debug_rl(fs_info, fmt, args...) \ 130 btrfs_no_printk(fs_info, KERN_DEBUG fmt, ##args) 131 #endif 132 133 #define btrfs_printk_in_rcu(fs_info, fmt, args...) \ 134 do { \ 135 rcu_read_lock(); \ 136 btrfs_printk(fs_info, fmt, ##args); \ 137 rcu_read_unlock(); \ 138 } while (0) 139 140 #define btrfs_no_printk_in_rcu(fs_info, fmt, args...) \ 141 do { \ 142 rcu_read_lock(); \ 143 btrfs_no_printk(fs_info, fmt, ##args); \ 144 rcu_read_unlock(); \ 145 } while (0) 146 147 #define btrfs_printk_ratelimited(fs_info, fmt, args...) \ 148 do { \ 149 static DEFINE_RATELIMIT_STATE(_rs, \ 150 DEFAULT_RATELIMIT_INTERVAL, \ 151 DEFAULT_RATELIMIT_BURST); \ 152 if (__ratelimit(&_rs)) \ 153 btrfs_printk(fs_info, fmt, ##args); \ 154 } while (0) 155 156 #define btrfs_printk_rl_in_rcu(fs_info, fmt, args...) \ 157 do { \ 158 rcu_read_lock(); \ 159 btrfs_printk_ratelimited(fs_info, fmt, ##args); \ 160 rcu_read_unlock(); \ 161 } while (0) 162 163 #ifdef CONFIG_BTRFS_ASSERT 164 void __cold btrfs_assertfail(const char *expr, const char *file, int line); 165 166 #define ASSERT(expr) \ 167 (likely(expr) ? (void)0 : btrfs_assertfail(#expr, __FILE__, __LINE__)) 168 #else 169 #define ASSERT(expr) (void)(expr) 170 #endif 171 172 void __cold btrfs_print_v0_err(struct btrfs_fs_info *fs_info); 173 174 __printf(5, 6) 175 __cold 176 void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function, 177 unsigned int line, int errno, const char *fmt, ...); 178 179 const char * __attribute_const__ btrfs_decode_error(int errno); 180 181 __cold 182 void __btrfs_abort_transaction(struct btrfs_trans_handle *trans, 183 const char *function, 184 unsigned int line, int errno, bool first_hit); 185 186 bool __cold abort_should_print_stack(int errno); 187 188 /* 189 * Call btrfs_abort_transaction as early as possible when an error condition is 190 * detected, that way the exact stack trace is reported for some errors. 191 */ 192 #define btrfs_abort_transaction(trans, errno) \ 193 do { \ 194 bool first = false; \ 195 /* Report first abort since mount */ \ 196 if (!test_and_set_bit(BTRFS_FS_STATE_TRANS_ABORTED, \ 197 &((trans)->fs_info->fs_state))) { \ 198 first = true; \ 199 if (WARN(abort_should_print_stack(errno), \ 200 KERN_ERR \ 201 "BTRFS: Transaction aborted (error %d)\n", \ 202 (errno))) { \ 203 /* Stack trace printed. */ \ 204 } else { \ 205 btrfs_err((trans)->fs_info, \ 206 "Transaction aborted (error %d)", \ 207 (errno)); \ 208 } \ 209 } \ 210 __btrfs_abort_transaction((trans), __func__, \ 211 __LINE__, (errno), first); \ 212 } while (0) 213 214 #define btrfs_handle_fs_error(fs_info, errno, fmt, args...) \ 215 __btrfs_handle_fs_error((fs_info), __func__, __LINE__, \ 216 (errno), fmt, ##args) 217 218 __printf(5, 6) 219 __cold 220 void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function, 221 unsigned int line, int errno, const char *fmt, ...); 222 /* 223 * If BTRFS_MOUNT_PANIC_ON_FATAL_ERROR is in mount_opt, __btrfs_panic 224 * will panic(). Otherwise we BUG() here. 225 */ 226 #define btrfs_panic(fs_info, errno, fmt, args...) \ 227 do { \ 228 __btrfs_panic(fs_info, __func__, __LINE__, errno, fmt, ##args); \ 229 BUG(); \ 230 } while (0) 231 232 #if BITS_PER_LONG == 32 233 #define BTRFS_32BIT_MAX_FILE_SIZE (((u64)ULONG_MAX + 1) << PAGE_SHIFT) 234 /* 235 * The warning threshold is 5/8th of the MAX_LFS_FILESIZE that limits the logical 236 * addresses of extents. 237 * 238 * For 4K page size it's about 10T, for 64K it's 160T. 239 */ 240 #define BTRFS_32BIT_EARLY_WARN_THRESHOLD (BTRFS_32BIT_MAX_FILE_SIZE * 5 / 8) 241 void btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info); 242 void btrfs_err_32bit_limit(struct btrfs_fs_info *fs_info); 243 #endif 244 245 #endif 246