223 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2 3#ifndef BTRFS_MESSAGES_H4#define BTRFS_MESSAGES_H5 6#include <linux/types.h>7#include <linux/printk.h>8#include <linux/bug.h>9 10struct btrfs_fs_info;11 12/*13 * We want to be able to override this in btrfs-progs.14 */15#ifdef __KERNEL__16 17static inline __printf(2, 3) __cold18void btrfs_no_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)19{20}21 22#endif23 24#ifdef CONFIG_PRINTK25 26#define btrfs_printk(fs_info, fmt, args...) \27 _btrfs_printk(fs_info, fmt, ##args)28 29__printf(2, 3)30__cold31void _btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...);32 33#else34 35#define btrfs_printk(fs_info, fmt, args...) \36 btrfs_no_printk(fs_info, fmt, ##args)37#endif38 39#define btrfs_emerg(fs_info, fmt, args...) \40 btrfs_printk(fs_info, KERN_EMERG fmt, ##args)41#define btrfs_alert(fs_info, fmt, args...) \42 btrfs_printk(fs_info, KERN_ALERT fmt, ##args)43#define btrfs_crit(fs_info, fmt, args...) \44 btrfs_printk(fs_info, KERN_CRIT fmt, ##args)45#define btrfs_err(fs_info, fmt, args...) \46 btrfs_printk(fs_info, KERN_ERR fmt, ##args)47#define btrfs_warn(fs_info, fmt, args...) \48 btrfs_printk(fs_info, KERN_WARNING fmt, ##args)49#define btrfs_notice(fs_info, fmt, args...) \50 btrfs_printk(fs_info, KERN_NOTICE fmt, ##args)51#define btrfs_info(fs_info, fmt, args...) \52 btrfs_printk(fs_info, KERN_INFO fmt, ##args)53 54/*55 * Wrappers that use printk_in_rcu56 */57#define btrfs_emerg_in_rcu(fs_info, fmt, args...) \58 btrfs_printk_in_rcu(fs_info, KERN_EMERG fmt, ##args)59#define btrfs_alert_in_rcu(fs_info, fmt, args...) \60 btrfs_printk_in_rcu(fs_info, KERN_ALERT fmt, ##args)61#define btrfs_crit_in_rcu(fs_info, fmt, args...) \62 btrfs_printk_in_rcu(fs_info, KERN_CRIT fmt, ##args)63#define btrfs_err_in_rcu(fs_info, fmt, args...) \64 btrfs_printk_in_rcu(fs_info, KERN_ERR fmt, ##args)65#define btrfs_warn_in_rcu(fs_info, fmt, args...) \66 btrfs_printk_in_rcu(fs_info, KERN_WARNING fmt, ##args)67#define btrfs_notice_in_rcu(fs_info, fmt, args...) \68 btrfs_printk_in_rcu(fs_info, KERN_NOTICE fmt, ##args)69#define btrfs_info_in_rcu(fs_info, fmt, args...) \70 btrfs_printk_in_rcu(fs_info, KERN_INFO fmt, ##args)71 72/*73 * Wrappers that use a ratelimited printk_in_rcu74 */75#define btrfs_emerg_rl_in_rcu(fs_info, fmt, args...) \76 btrfs_printk_rl_in_rcu(fs_info, KERN_EMERG fmt, ##args)77#define btrfs_alert_rl_in_rcu(fs_info, fmt, args...) \78 btrfs_printk_rl_in_rcu(fs_info, KERN_ALERT fmt, ##args)79#define btrfs_crit_rl_in_rcu(fs_info, fmt, args...) \80 btrfs_printk_rl_in_rcu(fs_info, KERN_CRIT fmt, ##args)81#define btrfs_err_rl_in_rcu(fs_info, fmt, args...) \82 btrfs_printk_rl_in_rcu(fs_info, KERN_ERR fmt, ##args)83#define btrfs_warn_rl_in_rcu(fs_info, fmt, args...) \84 btrfs_printk_rl_in_rcu(fs_info, KERN_WARNING fmt, ##args)85#define btrfs_notice_rl_in_rcu(fs_info, fmt, args...) \86 btrfs_printk_rl_in_rcu(fs_info, KERN_NOTICE fmt, ##args)87#define btrfs_info_rl_in_rcu(fs_info, fmt, args...) \88 btrfs_printk_rl_in_rcu(fs_info, KERN_INFO fmt, ##args)89 90/*91 * Wrappers that use a ratelimited printk92 */93#define btrfs_emerg_rl(fs_info, fmt, args...) \94 btrfs_printk_ratelimited(fs_info, KERN_EMERG fmt, ##args)95#define btrfs_alert_rl(fs_info, fmt, args...) \96 btrfs_printk_ratelimited(fs_info, KERN_ALERT fmt, ##args)97#define btrfs_crit_rl(fs_info, fmt, args...) \98 btrfs_printk_ratelimited(fs_info, KERN_CRIT fmt, ##args)99#define btrfs_err_rl(fs_info, fmt, args...) \100 btrfs_printk_ratelimited(fs_info, KERN_ERR fmt, ##args)101#define btrfs_warn_rl(fs_info, fmt, args...) \102 btrfs_printk_ratelimited(fs_info, KERN_WARNING fmt, ##args)103#define btrfs_notice_rl(fs_info, fmt, args...) \104 btrfs_printk_ratelimited(fs_info, KERN_NOTICE fmt, ##args)105#define btrfs_info_rl(fs_info, fmt, args...) \106 btrfs_printk_ratelimited(fs_info, KERN_INFO fmt, ##args)107 108#if defined(CONFIG_DYNAMIC_DEBUG)109#define btrfs_debug(fs_info, fmt, args...) \110 _dynamic_func_call_no_desc(fmt, btrfs_printk, \111 fs_info, KERN_DEBUG fmt, ##args)112#define btrfs_debug_in_rcu(fs_info, fmt, args...) \113 _dynamic_func_call_no_desc(fmt, btrfs_printk_in_rcu, \114 fs_info, KERN_DEBUG fmt, ##args)115#define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \116 _dynamic_func_call_no_desc(fmt, btrfs_printk_rl_in_rcu, \117 fs_info, KERN_DEBUG fmt, ##args)118#define btrfs_debug_rl(fs_info, fmt, args...) \119 _dynamic_func_call_no_desc(fmt, btrfs_printk_ratelimited, \120 fs_info, KERN_DEBUG fmt, ##args)121#elif defined(DEBUG)122#define btrfs_debug(fs_info, fmt, args...) \123 btrfs_printk(fs_info, KERN_DEBUG fmt, ##args)124#define btrfs_debug_in_rcu(fs_info, fmt, args...) \125 btrfs_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args)126#define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \127 btrfs_printk_rl_in_rcu(fs_info, KERN_DEBUG fmt, ##args)128#define btrfs_debug_rl(fs_info, fmt, args...) \129 btrfs_printk_ratelimited(fs_info, KERN_DEBUG fmt, ##args)130#else131#define btrfs_debug(fs_info, fmt, args...) \132 btrfs_no_printk(fs_info, KERN_DEBUG fmt, ##args)133#define btrfs_debug_in_rcu(fs_info, fmt, args...) \134 btrfs_no_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args)135#define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \136 btrfs_no_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args)137#define btrfs_debug_rl(fs_info, fmt, args...) \138 btrfs_no_printk(fs_info, KERN_DEBUG fmt, ##args)139#endif140 141#define btrfs_printk_in_rcu(fs_info, fmt, args...) \142do { \143 rcu_read_lock(); \144 btrfs_printk(fs_info, fmt, ##args); \145 rcu_read_unlock(); \146} while (0)147 148#define btrfs_no_printk_in_rcu(fs_info, fmt, args...) \149do { \150 rcu_read_lock(); \151 btrfs_no_printk(fs_info, fmt, ##args); \152 rcu_read_unlock(); \153} while (0)154 155#define btrfs_printk_ratelimited(fs_info, fmt, args...) \156do { \157 static DEFINE_RATELIMIT_STATE(_rs, \158 DEFAULT_RATELIMIT_INTERVAL, \159 DEFAULT_RATELIMIT_BURST); \160 if (__ratelimit(&_rs)) \161 btrfs_printk(fs_info, fmt, ##args); \162} while (0)163 164#define btrfs_printk_rl_in_rcu(fs_info, fmt, args...) \165do { \166 rcu_read_lock(); \167 btrfs_printk_ratelimited(fs_info, fmt, ##args); \168 rcu_read_unlock(); \169} while (0)170 171#ifdef CONFIG_BTRFS_ASSERT172 173#define btrfs_assertfail(expr, file, line) ({ \174 pr_err("assertion failed: %s, in %s:%d\n", (expr), (file), (line)); \175 BUG(); \176})177 178#define ASSERT(expr) \179 (likely(expr) ? (void)0 : btrfs_assertfail(#expr, __FILE__, __LINE__))180#else181#define ASSERT(expr) (void)(expr)182#endif183 184__printf(5, 6)185__cold186void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function,187 unsigned int line, int error, const char *fmt, ...);188 189const char * __attribute_const__ btrfs_decode_error(int error);190 191#define btrfs_handle_fs_error(fs_info, error, fmt, args...) \192 __btrfs_handle_fs_error((fs_info), __func__, __LINE__, \193 (error), fmt, ##args)194 195__printf(5, 6)196__cold197void __btrfs_panic(const struct btrfs_fs_info *fs_info, const char *function,198 unsigned int line, int error, const char *fmt, ...);199/*200 * If BTRFS_MOUNT_PANIC_ON_FATAL_ERROR is in mount_opt, __btrfs_panic201 * will panic(). Otherwise we BUG() here.202 */203#define btrfs_panic(fs_info, error, fmt, args...) \204do { \205 __btrfs_panic(fs_info, __func__, __LINE__, error, fmt, ##args); \206 BUG(); \207} while (0)208 209#if BITS_PER_LONG == 32210#define BTRFS_32BIT_MAX_FILE_SIZE (((u64)ULONG_MAX + 1) << PAGE_SHIFT)211/*212 * The warning threshold is 5/8th of the MAX_LFS_FILESIZE that limits the logical213 * addresses of extents.214 *215 * For 4K page size it's about 10T, for 64K it's 160T.216 */217#define BTRFS_32BIT_EARLY_WARN_THRESHOLD (BTRFS_32BIT_MAX_FILE_SIZE * 5 / 8)218void btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info);219void btrfs_err_32bit_limit(struct btrfs_fs_info *fs_info);220#endif221 222#endif223