2022-10-19 10:50:49 -04:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef BTRFS_MESSAGES_H
# define BTRFS_MESSAGES_H
# include <linux/types.h>
struct btrfs_fs_info ;
struct btrfs_trans_handle ;
static inline __printf ( 2 , 3 ) __cold
void btrfs_no_printk ( const struct btrfs_fs_info * fs_info , const char * fmt , . . . )
{
}
2022-10-19 10:50:50 -04:00
# ifdef CONFIG_PRINTK
2022-10-19 10:50:49 -04:00
# define btrfs_printk(fs_info, fmt, args...) \
_btrfs_printk ( fs_info , fmt , # # args )
__printf ( 2 , 3 )
__cold
void _btrfs_printk ( const struct btrfs_fs_info * fs_info , const char * fmt , . . . ) ;
# else
# define btrfs_printk(fs_info, fmt, args...) \
btrfs_no_printk ( fs_info , fmt , # # args )
# endif
# define btrfs_emerg(fs_info, fmt, args...) \
btrfs_printk ( fs_info , KERN_EMERG fmt , # # args )
# define btrfs_alert(fs_info, fmt, args...) \
btrfs_printk ( fs_info , KERN_ALERT fmt , # # args )
# define btrfs_crit(fs_info, fmt, args...) \
btrfs_printk ( fs_info , KERN_CRIT fmt , # # args )
# define btrfs_err(fs_info, fmt, args...) \
btrfs_printk ( fs_info , KERN_ERR fmt , # # args )
# define btrfs_warn(fs_info, fmt, args...) \
btrfs_printk ( fs_info , KERN_WARNING fmt , # # args )
# define btrfs_notice(fs_info, fmt, args...) \
btrfs_printk ( fs_info , KERN_NOTICE fmt , # # args )
# define btrfs_info(fs_info, fmt, args...) \
btrfs_printk ( fs_info , KERN_INFO fmt , # # args )
/*
* Wrappers that use printk_in_rcu
*/
# define btrfs_emerg_in_rcu(fs_info, fmt, args...) \
btrfs_printk_in_rcu ( fs_info , KERN_EMERG fmt , # # args )
# define btrfs_alert_in_rcu(fs_info, fmt, args...) \
btrfs_printk_in_rcu ( fs_info , KERN_ALERT fmt , # # args )
# define btrfs_crit_in_rcu(fs_info, fmt, args...) \
btrfs_printk_in_rcu ( fs_info , KERN_CRIT fmt , # # args )
# define btrfs_err_in_rcu(fs_info, fmt, args...) \
btrfs_printk_in_rcu ( fs_info , KERN_ERR fmt , # # args )
# define btrfs_warn_in_rcu(fs_info, fmt, args...) \
btrfs_printk_in_rcu ( fs_info , KERN_WARNING fmt , # # args )
# define btrfs_notice_in_rcu(fs_info, fmt, args...) \
btrfs_printk_in_rcu ( fs_info , KERN_NOTICE fmt , # # args )
# define btrfs_info_in_rcu(fs_info, fmt, args...) \
btrfs_printk_in_rcu ( fs_info , KERN_INFO fmt , # # args )
/*
* Wrappers that use a ratelimited printk_in_rcu
*/
# define btrfs_emerg_rl_in_rcu(fs_info, fmt, args...) \
btrfs_printk_rl_in_rcu ( fs_info , KERN_EMERG fmt , # # args )
# define btrfs_alert_rl_in_rcu(fs_info, fmt, args...) \
btrfs_printk_rl_in_rcu ( fs_info , KERN_ALERT fmt , # # args )
# define btrfs_crit_rl_in_rcu(fs_info, fmt, args...) \
btrfs_printk_rl_in_rcu ( fs_info , KERN_CRIT fmt , # # args )
# define btrfs_err_rl_in_rcu(fs_info, fmt, args...) \
btrfs_printk_rl_in_rcu ( fs_info , KERN_ERR fmt , # # args )
# define btrfs_warn_rl_in_rcu(fs_info, fmt, args...) \
btrfs_printk_rl_in_rcu ( fs_info , KERN_WARNING fmt , # # args )
# define btrfs_notice_rl_in_rcu(fs_info, fmt, args...) \
btrfs_printk_rl_in_rcu ( fs_info , KERN_NOTICE fmt , # # args )
# define btrfs_info_rl_in_rcu(fs_info, fmt, args...) \
btrfs_printk_rl_in_rcu ( fs_info , KERN_INFO fmt , # # args )
/*
* Wrappers that use a ratelimited printk
*/
# define btrfs_emerg_rl(fs_info, fmt, args...) \
btrfs_printk_ratelimited ( fs_info , KERN_EMERG fmt , # # args )
# define btrfs_alert_rl(fs_info, fmt, args...) \
btrfs_printk_ratelimited ( fs_info , KERN_ALERT fmt , # # args )
# define btrfs_crit_rl(fs_info, fmt, args...) \
btrfs_printk_ratelimited ( fs_info , KERN_CRIT fmt , # # args )
# define btrfs_err_rl(fs_info, fmt, args...) \
btrfs_printk_ratelimited ( fs_info , KERN_ERR fmt , # # args )
# define btrfs_warn_rl(fs_info, fmt, args...) \
btrfs_printk_ratelimited ( fs_info , KERN_WARNING fmt , # # args )
# define btrfs_notice_rl(fs_info, fmt, args...) \
btrfs_printk_ratelimited ( fs_info , KERN_NOTICE fmt , # # args )
# define btrfs_info_rl(fs_info, fmt, args...) \
btrfs_printk_ratelimited ( fs_info , KERN_INFO fmt , # # args )
# if defined(CONFIG_DYNAMIC_DEBUG)
# define btrfs_debug(fs_info, fmt, args...) \
_dynamic_func_call_no_desc ( fmt , btrfs_printk , \
fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_in_rcu(fs_info, fmt, args...) \
_dynamic_func_call_no_desc ( fmt , btrfs_printk_in_rcu , \
fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \
_dynamic_func_call_no_desc ( fmt , btrfs_printk_rl_in_rcu , \
fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_rl(fs_info, fmt, args...) \
_dynamic_func_call_no_desc ( fmt , btrfs_printk_ratelimited , \
fs_info , KERN_DEBUG fmt , # # args )
# elif defined(DEBUG)
# define btrfs_debug(fs_info, fmt, args...) \
btrfs_printk ( fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_in_rcu(fs_info, fmt, args...) \
btrfs_printk_in_rcu ( fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \
btrfs_printk_rl_in_rcu ( fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_rl(fs_info, fmt, args...) \
btrfs_printk_ratelimited ( fs_info , KERN_DEBUG fmt , # # args )
# else
# define btrfs_debug(fs_info, fmt, args...) \
btrfs_no_printk ( fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_in_rcu(fs_info, fmt, args...) \
btrfs_no_printk_in_rcu ( fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \
btrfs_no_printk_in_rcu ( fs_info , KERN_DEBUG fmt , # # args )
# define btrfs_debug_rl(fs_info, fmt, args...) \
btrfs_no_printk ( fs_info , KERN_DEBUG fmt , # # args )
# endif
# define btrfs_printk_in_rcu(fs_info, fmt, args...) \
do { \
rcu_read_lock ( ) ; \
btrfs_printk ( fs_info , fmt , # # args ) ; \
rcu_read_unlock ( ) ; \
} while ( 0 )
# define btrfs_no_printk_in_rcu(fs_info, fmt, args...) \
do { \
rcu_read_lock ( ) ; \
btrfs_no_printk ( fs_info , fmt , # # args ) ; \
rcu_read_unlock ( ) ; \
} while ( 0 )
# define btrfs_printk_ratelimited(fs_info, fmt, args...) \
do { \
static DEFINE_RATELIMIT_STATE ( _rs , \
DEFAULT_RATELIMIT_INTERVAL , \
DEFAULT_RATELIMIT_BURST ) ; \
if ( __ratelimit ( & _rs ) ) \
btrfs_printk ( fs_info , fmt , # # args ) ; \
} while ( 0 )
# define btrfs_printk_rl_in_rcu(fs_info, fmt, args...) \
do { \
rcu_read_lock ( ) ; \
btrfs_printk_ratelimited ( fs_info , fmt , # # args ) ; \
rcu_read_unlock ( ) ; \
} while ( 0 )
# ifdef CONFIG_BTRFS_ASSERT
void __cold btrfs_assertfail ( const char * expr , const char * file , int line ) ;
# define ASSERT(expr) \
( likely ( expr ) ? ( void ) 0 : btrfs_assertfail ( # expr , __FILE__ , __LINE__ ) )
# else
# define ASSERT(expr) (void)(expr)
# endif
void __cold btrfs_print_v0_err ( struct btrfs_fs_info * fs_info ) ;
__printf ( 5 , 6 )
__cold
void __btrfs_handle_fs_error ( struct btrfs_fs_info * fs_info , const char * function ,
unsigned int line , int errno , const char * fmt , . . . ) ;
const char * __attribute_const__ btrfs_decode_error ( int errno ) ;
__cold
void __btrfs_abort_transaction ( struct btrfs_trans_handle * trans ,
const char * function ,
unsigned int line , int errno , bool first_hit ) ;
bool __cold abort_should_print_stack ( int errno ) ;
/*
* Call btrfs_abort_transaction as early as possible when an error condition is
* detected , that way the exact stack trace is reported for some errors .
*/
# define btrfs_abort_transaction(trans, errno) \
do { \
bool first = false ; \
/* Report first abort since mount */ \
if ( ! test_and_set_bit ( BTRFS_FS_STATE_TRANS_ABORTED , \
& ( ( trans ) - > fs_info - > fs_state ) ) ) { \
first = true ; \
if ( WARN ( abort_should_print_stack ( errno ) , \
2022-11-30 15:51:20 +00:00
KERN_ERR \
2022-10-19 10:50:49 -04:00
" BTRFS: Transaction aborted (error %d) \n " , \
( errno ) ) ) { \
/* Stack trace printed. */ \
} else { \
2022-11-30 15:51:20 +00:00
btrfs_err ( ( trans ) - > fs_info , \
" Transaction aborted (error %d) " , \
2022-10-19 10:50:49 -04:00
( errno ) ) ; \
} \
} \
__btrfs_abort_transaction ( ( trans ) , __func__ , \
__LINE__ , ( errno ) , first ) ; \
} while ( 0 )
# define btrfs_handle_fs_error(fs_info, errno, fmt, args...) \
__btrfs_handle_fs_error ( ( fs_info ) , __func__ , __LINE__ , \
( errno ) , fmt , # # args )
__printf ( 5 , 6 )
__cold
void __btrfs_panic ( struct btrfs_fs_info * fs_info , const char * function ,
unsigned int line , int errno , const char * fmt , . . . ) ;
/*
* If BTRFS_MOUNT_PANIC_ON_FATAL_ERROR is in mount_opt , __btrfs_panic
* will panic ( ) . Otherwise we BUG ( ) here .
*/
# define btrfs_panic(fs_info, errno, fmt, args...) \
do { \
__btrfs_panic ( fs_info , __func__ , __LINE__ , errno , fmt , # # args ) ; \
BUG ( ) ; \
} while ( 0 )
2022-10-26 15:08:31 -04:00
# if BITS_PER_LONG == 32
# define BTRFS_32BIT_MAX_FILE_SIZE (((u64)ULONG_MAX + 1) << PAGE_SHIFT)
/*
* The warning threshold is 5 / 8 th of the MAX_LFS_FILESIZE that limits the logical
* addresses of extents .
*
* For 4 K page size it ' s about 10 T , for 64 K it ' s 160 T .
*/
# define BTRFS_32BIT_EARLY_WARN_THRESHOLD (BTRFS_32BIT_MAX_FILE_SIZE * 5 / 8)
void btrfs_warn_32bit_limit ( struct btrfs_fs_info * fs_info ) ;
void btrfs_err_32bit_limit ( struct btrfs_fs_info * fs_info ) ;
# endif
2022-10-19 10:50:49 -04:00
# endif