xref: /kernel/linux/linux-6.6/fs/btrfs/messages.h (revision 62306a36)
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