162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#ifndef BTRFS_MESSAGES_H 462306a36Sopenharmony_ci#define BTRFS_MESSAGES_H 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/types.h> 762306a36Sopenharmony_ci#include <linux/printk.h> 862306a36Sopenharmony_ci#include <linux/bug.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistruct btrfs_fs_info; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* 1362306a36Sopenharmony_ci * We want to be able to override this in btrfs-progs. 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_ci#ifdef __KERNEL__ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic inline __printf(2, 3) __cold 1862306a36Sopenharmony_civoid btrfs_no_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#endif 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#ifdef CONFIG_PRINTK 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define btrfs_printk(fs_info, fmt, args...) \ 2762306a36Sopenharmony_ci _btrfs_printk(fs_info, fmt, ##args) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci__printf(2, 3) 3062306a36Sopenharmony_ci__cold 3162306a36Sopenharmony_civoid _btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#else 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define btrfs_printk(fs_info, fmt, args...) \ 3662306a36Sopenharmony_ci btrfs_no_printk(fs_info, fmt, ##args) 3762306a36Sopenharmony_ci#endif 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define btrfs_emerg(fs_info, fmt, args...) \ 4062306a36Sopenharmony_ci btrfs_printk(fs_info, KERN_EMERG fmt, ##args) 4162306a36Sopenharmony_ci#define btrfs_alert(fs_info, fmt, args...) \ 4262306a36Sopenharmony_ci btrfs_printk(fs_info, KERN_ALERT fmt, ##args) 4362306a36Sopenharmony_ci#define btrfs_crit(fs_info, fmt, args...) \ 4462306a36Sopenharmony_ci btrfs_printk(fs_info, KERN_CRIT fmt, ##args) 4562306a36Sopenharmony_ci#define btrfs_err(fs_info, fmt, args...) \ 4662306a36Sopenharmony_ci btrfs_printk(fs_info, KERN_ERR fmt, ##args) 4762306a36Sopenharmony_ci#define btrfs_warn(fs_info, fmt, args...) \ 4862306a36Sopenharmony_ci btrfs_printk(fs_info, KERN_WARNING fmt, ##args) 4962306a36Sopenharmony_ci#define btrfs_notice(fs_info, fmt, args...) \ 5062306a36Sopenharmony_ci btrfs_printk(fs_info, KERN_NOTICE fmt, ##args) 5162306a36Sopenharmony_ci#define btrfs_info(fs_info, fmt, args...) \ 5262306a36Sopenharmony_ci btrfs_printk(fs_info, KERN_INFO fmt, ##args) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* 5562306a36Sopenharmony_ci * Wrappers that use printk_in_rcu 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_ci#define btrfs_emerg_in_rcu(fs_info, fmt, args...) \ 5862306a36Sopenharmony_ci btrfs_printk_in_rcu(fs_info, KERN_EMERG fmt, ##args) 5962306a36Sopenharmony_ci#define btrfs_alert_in_rcu(fs_info, fmt, args...) \ 6062306a36Sopenharmony_ci btrfs_printk_in_rcu(fs_info, KERN_ALERT fmt, ##args) 6162306a36Sopenharmony_ci#define btrfs_crit_in_rcu(fs_info, fmt, args...) \ 6262306a36Sopenharmony_ci btrfs_printk_in_rcu(fs_info, KERN_CRIT fmt, ##args) 6362306a36Sopenharmony_ci#define btrfs_err_in_rcu(fs_info, fmt, args...) \ 6462306a36Sopenharmony_ci btrfs_printk_in_rcu(fs_info, KERN_ERR fmt, ##args) 6562306a36Sopenharmony_ci#define btrfs_warn_in_rcu(fs_info, fmt, args...) \ 6662306a36Sopenharmony_ci btrfs_printk_in_rcu(fs_info, KERN_WARNING fmt, ##args) 6762306a36Sopenharmony_ci#define btrfs_notice_in_rcu(fs_info, fmt, args...) \ 6862306a36Sopenharmony_ci btrfs_printk_in_rcu(fs_info, KERN_NOTICE fmt, ##args) 6962306a36Sopenharmony_ci#define btrfs_info_in_rcu(fs_info, fmt, args...) \ 7062306a36Sopenharmony_ci btrfs_printk_in_rcu(fs_info, KERN_INFO fmt, ##args) 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* 7362306a36Sopenharmony_ci * Wrappers that use a ratelimited printk_in_rcu 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci#define btrfs_emerg_rl_in_rcu(fs_info, fmt, args...) \ 7662306a36Sopenharmony_ci btrfs_printk_rl_in_rcu(fs_info, KERN_EMERG fmt, ##args) 7762306a36Sopenharmony_ci#define btrfs_alert_rl_in_rcu(fs_info, fmt, args...) \ 7862306a36Sopenharmony_ci btrfs_printk_rl_in_rcu(fs_info, KERN_ALERT fmt, ##args) 7962306a36Sopenharmony_ci#define btrfs_crit_rl_in_rcu(fs_info, fmt, args...) \ 8062306a36Sopenharmony_ci btrfs_printk_rl_in_rcu(fs_info, KERN_CRIT fmt, ##args) 8162306a36Sopenharmony_ci#define btrfs_err_rl_in_rcu(fs_info, fmt, args...) \ 8262306a36Sopenharmony_ci btrfs_printk_rl_in_rcu(fs_info, KERN_ERR fmt, ##args) 8362306a36Sopenharmony_ci#define btrfs_warn_rl_in_rcu(fs_info, fmt, args...) \ 8462306a36Sopenharmony_ci btrfs_printk_rl_in_rcu(fs_info, KERN_WARNING fmt, ##args) 8562306a36Sopenharmony_ci#define btrfs_notice_rl_in_rcu(fs_info, fmt, args...) \ 8662306a36Sopenharmony_ci btrfs_printk_rl_in_rcu(fs_info, KERN_NOTICE fmt, ##args) 8762306a36Sopenharmony_ci#define btrfs_info_rl_in_rcu(fs_info, fmt, args...) \ 8862306a36Sopenharmony_ci btrfs_printk_rl_in_rcu(fs_info, KERN_INFO fmt, ##args) 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* 9162306a36Sopenharmony_ci * Wrappers that use a ratelimited printk 9262306a36Sopenharmony_ci */ 9362306a36Sopenharmony_ci#define btrfs_emerg_rl(fs_info, fmt, args...) \ 9462306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, KERN_EMERG fmt, ##args) 9562306a36Sopenharmony_ci#define btrfs_alert_rl(fs_info, fmt, args...) \ 9662306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, KERN_ALERT fmt, ##args) 9762306a36Sopenharmony_ci#define btrfs_crit_rl(fs_info, fmt, args...) \ 9862306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, KERN_CRIT fmt, ##args) 9962306a36Sopenharmony_ci#define btrfs_err_rl(fs_info, fmt, args...) \ 10062306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, KERN_ERR fmt, ##args) 10162306a36Sopenharmony_ci#define btrfs_warn_rl(fs_info, fmt, args...) \ 10262306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, KERN_WARNING fmt, ##args) 10362306a36Sopenharmony_ci#define btrfs_notice_rl(fs_info, fmt, args...) \ 10462306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, KERN_NOTICE fmt, ##args) 10562306a36Sopenharmony_ci#define btrfs_info_rl(fs_info, fmt, args...) \ 10662306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, KERN_INFO fmt, ##args) 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#if defined(CONFIG_DYNAMIC_DEBUG) 10962306a36Sopenharmony_ci#define btrfs_debug(fs_info, fmt, args...) \ 11062306a36Sopenharmony_ci _dynamic_func_call_no_desc(fmt, btrfs_printk, \ 11162306a36Sopenharmony_ci fs_info, KERN_DEBUG fmt, ##args) 11262306a36Sopenharmony_ci#define btrfs_debug_in_rcu(fs_info, fmt, args...) \ 11362306a36Sopenharmony_ci _dynamic_func_call_no_desc(fmt, btrfs_printk_in_rcu, \ 11462306a36Sopenharmony_ci fs_info, KERN_DEBUG fmt, ##args) 11562306a36Sopenharmony_ci#define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \ 11662306a36Sopenharmony_ci _dynamic_func_call_no_desc(fmt, btrfs_printk_rl_in_rcu, \ 11762306a36Sopenharmony_ci fs_info, KERN_DEBUG fmt, ##args) 11862306a36Sopenharmony_ci#define btrfs_debug_rl(fs_info, fmt, args...) \ 11962306a36Sopenharmony_ci _dynamic_func_call_no_desc(fmt, btrfs_printk_ratelimited, \ 12062306a36Sopenharmony_ci fs_info, KERN_DEBUG fmt, ##args) 12162306a36Sopenharmony_ci#elif defined(DEBUG) 12262306a36Sopenharmony_ci#define btrfs_debug(fs_info, fmt, args...) \ 12362306a36Sopenharmony_ci btrfs_printk(fs_info, KERN_DEBUG fmt, ##args) 12462306a36Sopenharmony_ci#define btrfs_debug_in_rcu(fs_info, fmt, args...) \ 12562306a36Sopenharmony_ci btrfs_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args) 12662306a36Sopenharmony_ci#define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \ 12762306a36Sopenharmony_ci btrfs_printk_rl_in_rcu(fs_info, KERN_DEBUG fmt, ##args) 12862306a36Sopenharmony_ci#define btrfs_debug_rl(fs_info, fmt, args...) \ 12962306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, KERN_DEBUG fmt, ##args) 13062306a36Sopenharmony_ci#else 13162306a36Sopenharmony_ci#define btrfs_debug(fs_info, fmt, args...) \ 13262306a36Sopenharmony_ci btrfs_no_printk(fs_info, KERN_DEBUG fmt, ##args) 13362306a36Sopenharmony_ci#define btrfs_debug_in_rcu(fs_info, fmt, args...) \ 13462306a36Sopenharmony_ci btrfs_no_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args) 13562306a36Sopenharmony_ci#define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \ 13662306a36Sopenharmony_ci btrfs_no_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args) 13762306a36Sopenharmony_ci#define btrfs_debug_rl(fs_info, fmt, args...) \ 13862306a36Sopenharmony_ci btrfs_no_printk(fs_info, KERN_DEBUG fmt, ##args) 13962306a36Sopenharmony_ci#endif 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#define btrfs_printk_in_rcu(fs_info, fmt, args...) \ 14262306a36Sopenharmony_cido { \ 14362306a36Sopenharmony_ci rcu_read_lock(); \ 14462306a36Sopenharmony_ci btrfs_printk(fs_info, fmt, ##args); \ 14562306a36Sopenharmony_ci rcu_read_unlock(); \ 14662306a36Sopenharmony_ci} while (0) 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci#define btrfs_no_printk_in_rcu(fs_info, fmt, args...) \ 14962306a36Sopenharmony_cido { \ 15062306a36Sopenharmony_ci rcu_read_lock(); \ 15162306a36Sopenharmony_ci btrfs_no_printk(fs_info, fmt, ##args); \ 15262306a36Sopenharmony_ci rcu_read_unlock(); \ 15362306a36Sopenharmony_ci} while (0) 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci#define btrfs_printk_ratelimited(fs_info, fmt, args...) \ 15662306a36Sopenharmony_cido { \ 15762306a36Sopenharmony_ci static DEFINE_RATELIMIT_STATE(_rs, \ 15862306a36Sopenharmony_ci DEFAULT_RATELIMIT_INTERVAL, \ 15962306a36Sopenharmony_ci DEFAULT_RATELIMIT_BURST); \ 16062306a36Sopenharmony_ci if (__ratelimit(&_rs)) \ 16162306a36Sopenharmony_ci btrfs_printk(fs_info, fmt, ##args); \ 16262306a36Sopenharmony_ci} while (0) 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci#define btrfs_printk_rl_in_rcu(fs_info, fmt, args...) \ 16562306a36Sopenharmony_cido { \ 16662306a36Sopenharmony_ci rcu_read_lock(); \ 16762306a36Sopenharmony_ci btrfs_printk_ratelimited(fs_info, fmt, ##args); \ 16862306a36Sopenharmony_ci rcu_read_unlock(); \ 16962306a36Sopenharmony_ci} while (0) 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci#ifdef CONFIG_BTRFS_ASSERT 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci#define btrfs_assertfail(expr, file, line) ({ \ 17462306a36Sopenharmony_ci pr_err("assertion failed: %s, in %s:%d\n", (expr), (file), (line)); \ 17562306a36Sopenharmony_ci BUG(); \ 17662306a36Sopenharmony_ci}) 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci#define ASSERT(expr) \ 17962306a36Sopenharmony_ci (likely(expr) ? (void)0 : btrfs_assertfail(#expr, __FILE__, __LINE__)) 18062306a36Sopenharmony_ci#else 18162306a36Sopenharmony_ci#define ASSERT(expr) (void)(expr) 18262306a36Sopenharmony_ci#endif 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci__printf(5, 6) 18562306a36Sopenharmony_ci__cold 18662306a36Sopenharmony_civoid __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function, 18762306a36Sopenharmony_ci unsigned int line, int errno, const char *fmt, ...); 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ciconst char * __attribute_const__ btrfs_decode_error(int errno); 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci#define btrfs_handle_fs_error(fs_info, errno, fmt, args...) \ 19262306a36Sopenharmony_ci __btrfs_handle_fs_error((fs_info), __func__, __LINE__, \ 19362306a36Sopenharmony_ci (errno), fmt, ##args) 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci__printf(5, 6) 19662306a36Sopenharmony_ci__cold 19762306a36Sopenharmony_civoid __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function, 19862306a36Sopenharmony_ci unsigned int line, int errno, const char *fmt, ...); 19962306a36Sopenharmony_ci/* 20062306a36Sopenharmony_ci * If BTRFS_MOUNT_PANIC_ON_FATAL_ERROR is in mount_opt, __btrfs_panic 20162306a36Sopenharmony_ci * will panic(). Otherwise we BUG() here. 20262306a36Sopenharmony_ci */ 20362306a36Sopenharmony_ci#define btrfs_panic(fs_info, errno, fmt, args...) \ 20462306a36Sopenharmony_cido { \ 20562306a36Sopenharmony_ci __btrfs_panic(fs_info, __func__, __LINE__, errno, fmt, ##args); \ 20662306a36Sopenharmony_ci BUG(); \ 20762306a36Sopenharmony_ci} while (0) 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci#if BITS_PER_LONG == 32 21062306a36Sopenharmony_ci#define BTRFS_32BIT_MAX_FILE_SIZE (((u64)ULONG_MAX + 1) << PAGE_SHIFT) 21162306a36Sopenharmony_ci/* 21262306a36Sopenharmony_ci * The warning threshold is 5/8th of the MAX_LFS_FILESIZE that limits the logical 21362306a36Sopenharmony_ci * addresses of extents. 21462306a36Sopenharmony_ci * 21562306a36Sopenharmony_ci * For 4K page size it's about 10T, for 64K it's 160T. 21662306a36Sopenharmony_ci */ 21762306a36Sopenharmony_ci#define BTRFS_32BIT_EARLY_WARN_THRESHOLD (BTRFS_32BIT_MAX_FILE_SIZE * 5 / 8) 21862306a36Sopenharmony_civoid btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info); 21962306a36Sopenharmony_civoid btrfs_err_32bit_limit(struct btrfs_fs_info *fs_info); 22062306a36Sopenharmony_ci#endif 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci#endif 223