2017-03-16 22:18:50 -08:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _BCACHEFS_SUPER_IO_H
# define _BCACHEFS_SUPER_IO_H
# include "extents.h"
# include "eytzinger.h"
# include "super_types.h"
# include "super.h"
2023-09-24 23:55:37 -04:00
# include "sb-members.h"
2017-03-16 22:18:50 -08:00
# include <asm/byteorder.h>
2023-06-28 20:27:07 -04:00
static inline bool bch2_version_compatible ( u16 version )
{
2023-06-27 22:09:35 -04:00
return BCH_VERSION_MAJOR ( version ) < = BCH_VERSION_MAJOR ( bcachefs_metadata_version_current ) & &
2023-06-28 20:27:07 -04:00
version > = bcachefs_metadata_version_min ;
}
2023-06-28 19:53:05 -04:00
void bch2_version_to_text ( struct printbuf * , unsigned ) ;
2023-06-27 22:09:35 -04:00
unsigned bch2_latest_compatible_version ( unsigned ) ;
2023-06-28 19:53:05 -04:00
2023-10-25 15:51:16 -04:00
static inline size_t bch2_sb_field_bytes ( struct bch_sb_field * f )
{
return le32_to_cpu ( f - > u64s ) * sizeof ( u64 ) ;
}
2017-03-16 22:18:50 -08:00
# define field_to_type(_f, _name) \
container_of_or_null ( _f , struct bch_sb_field_ # # _name , field )
2023-09-26 17:49:34 -04:00
struct bch_sb_field * bch2_sb_field_get_id ( struct bch_sb * , enum bch_sb_field_type ) ;
# define bch2_sb_field_get(_sb, _name) \
field_to_type ( bch2_sb_field_get_id ( _sb , BCH_SB_FIELD_ # # _name ) , _name )
2017-03-16 22:18:50 -08:00
2023-09-26 17:49:34 -04:00
struct bch_sb_field * bch2_sb_field_resize_id ( struct bch_sb_handle * ,
enum bch_sb_field_type , unsigned ) ;
# define bch2_sb_field_resize(_sb, _name, _u64s) \
field_to_type ( bch2_sb_field_resize_id ( _sb , BCH_SB_FIELD_ # # _name , _u64s ) , _name )
2023-12-29 15:15:14 -05:00
struct bch_sb_field * bch2_sb_field_get_minsize_id ( struct bch_sb_handle * ,
enum bch_sb_field_type , unsigned ) ;
# define bch2_sb_field_get_minsize(_sb, _name, _u64s) \
field_to_type ( bch2_sb_field_get_minsize_id ( _sb , BCH_SB_FIELD_ # # _name , _u64s ) , _name )
# define bch2_sb_field_nr_entries(_f) \
( _f ? ( ( bch2_sb_field_bytes ( & _f - > field ) - sizeof ( * _f ) ) / \
sizeof ( _f - > entries [ 0 ] ) ) \
: 0 )
2023-09-26 17:49:34 -04:00
void bch2_sb_field_delete ( struct bch_sb_handle * , enum bch_sb_field_type ) ;
2017-03-16 22:18:50 -08:00
extern const char * const bch2_sb_fields [ ] ;
struct bch_sb_field_ops {
2024-05-08 18:49:14 -04:00
int ( * validate ) ( struct bch_sb * , struct bch_sb_field * ,
enum bch_validate_flags , struct printbuf * ) ;
2022-01-03 23:38:50 -05:00
void ( * to_text ) ( struct printbuf * , struct bch_sb * , struct bch_sb_field * ) ;
2017-03-16 22:18:50 -08:00
} ;
static inline __le64 bch2_sb_magic ( struct bch_fs * c )
{
__le64 ret ;
2023-08-07 12:04:05 -04:00
2017-03-16 22:18:50 -08:00
memcpy ( & ret , & c - > sb . uuid , sizeof ( ret ) ) ;
return ret ;
}
static inline __u64 jset_magic ( struct bch_fs * c )
{
return __le64_to_cpu ( bch2_sb_magic ( c ) ^ JSET_MAGIC ) ;
}
static inline __u64 bset_magic ( struct bch_fs * c )
{
return __le64_to_cpu ( bch2_sb_magic ( c ) ^ BSET_MAGIC ) ;
}
int bch2_sb_to_fs ( struct bch_fs * , struct bch_sb * ) ;
int bch2_sb_from_fs ( struct bch_fs * , struct bch_dev * ) ;
void bch2_free_super ( struct bch_sb_handle * ) ;
int bch2_sb_realloc ( struct bch_sb_handle * , unsigned ) ;
int bch2_read_super ( const char * , struct bch_opts * , struct bch_sb_handle * ) ;
2023-11-20 09:53:36 +13:00
int bch2_read_super_silent ( const char * , struct bch_opts * , struct bch_sb_handle * ) ;
2019-03-21 23:13:46 -04:00
int bch2_write_super ( struct bch_fs * ) ;
2019-11-29 13:47:42 -05:00
void __bch2_check_set_feature ( struct bch_fs * , unsigned ) ;
static inline void bch2_check_set_feature ( struct bch_fs * c , unsigned feat )
{
if ( ! ( c - > sb . features & ( 1ULL < < feat ) ) )
__bch2_check_set_feature ( c , feat ) ;
}
2017-03-16 22:18:50 -08:00
2023-12-29 15:25:07 -05:00
bool bch2_check_version_downgrade ( struct bch_fs * ) ;
2023-07-10 12:23:01 -04:00
void bch2_sb_upgrade ( struct bch_fs * , unsigned ) ;
2024-01-05 12:37:47 -05:00
void __bch2_sb_field_to_text ( struct printbuf * , struct bch_sb * ,
struct bch_sb_field * ) ;
2018-11-09 01:24:07 -05:00
void bch2_sb_field_to_text ( struct printbuf * , struct bch_sb * ,
struct bch_sb_field * ) ;
2022-02-20 05:00:45 -05:00
void bch2_sb_layout_to_text ( struct printbuf * , struct bch_sb_layout * ) ;
void bch2_sb_to_text ( struct printbuf * , struct bch_sb * , bool , unsigned ) ;
2017-03-16 22:18:50 -08:00
# endif /* _BCACHEFS_SUPER_IO_H */