2018-06-06 05:42:14 +03:00
// SPDX-License-Identifier: GPL-2.0
2016-03-09 00:15:14 +03:00
/*
* Copyright ( c ) 2016 Oracle .
* All Rights Reserved .
*/
# ifndef __XFS_ONDISK_H
# define __XFS_ONDISK_H
# define XFS_CHECK_STRUCT_SIZE(structname, size) \
BUILD_BUG_ON_MSG ( sizeof ( structname ) ! = ( size ) , " XFS: sizeof( " \
# structname ") is wrong, expected " #size)
2016-06-21 04:53:28 +03:00
# define XFS_CHECK_OFFSET(structname, member, off) \
BUILD_BUG_ON_MSG ( offsetof ( structname , member ) ! = ( off ) , \
" XFS: offsetof( " # structname " , " # member " ) is wrong, " \
" expected " # off )
2016-03-09 00:15:14 +03:00
static inline void __init
xfs_check_ondisk_structs ( void )
{
/* ag/file structures */
XFS_CHECK_STRUCT_SIZE ( struct xfs_acl , 4 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_acl_entry , 12 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_agf , 224 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_agfl , 36 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_agi , 336 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_bmbt_key , 8 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_bmbt_rec , 16 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_bmdr_block , 4 ) ;
2016-07-20 03:43:11 +03:00
XFS_CHECK_STRUCT_SIZE ( struct xfs_btree_block_shdr , 48 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_btree_block_lhdr , 64 ) ;
2016-03-09 00:15:14 +03:00
XFS_CHECK_STRUCT_SIZE ( struct xfs_btree_block , 72 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dinode , 176 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_disk_dquot , 104 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dqblk , 136 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dsb , 264 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dsymlink_hdr , 56 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_inobt_key , 4 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_inobt_rec , 16 ) ;
2016-10-03 19:11:18 +03:00
XFS_CHECK_STRUCT_SIZE ( struct xfs_refcount_key , 4 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_refcount_rec , 12 ) ;
2016-08-03 04:36:07 +03:00
XFS_CHECK_STRUCT_SIZE ( struct xfs_rmap_key , 20 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_rmap_rec , 24 ) ;
2016-03-09 00:15:14 +03:00
XFS_CHECK_STRUCT_SIZE ( struct xfs_timestamp , 8 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_alloc_key_t , 8 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_alloc_ptr_t , 4 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_alloc_rec_t , 8 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_inobt_ptr_t , 4 ) ;
2016-10-03 19:11:18 +03:00
XFS_CHECK_STRUCT_SIZE ( xfs_refcount_ptr_t , 4 ) ;
2016-08-03 04:36:07 +03:00
XFS_CHECK_STRUCT_SIZE ( xfs_rmap_ptr_t , 4 ) ;
2016-03-09 00:15:14 +03:00
/* dir/attr trees */
XFS_CHECK_STRUCT_SIZE ( struct xfs_attr3_leaf_hdr , 80 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_attr3_leafblock , 88 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_attr3_rmt_hdr , 56 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_da3_blkinfo , 56 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_da3_intnode , 64 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_da3_node_hdr , 64 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dir3_blk_hdr , 48 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dir3_data_hdr , 64 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dir3_free , 64 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dir3_free_hdr , 64 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dir3_leaf , 64 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_dir3_leaf_hdr , 64 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_attr_leaf_entry_t , 8 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_attr_leaf_hdr_t , 32 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_attr_leaf_map_t , 4 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_attr_leaf_name_local_t , 4 ) ;
/*
* m68k has problems with xfs_attr_leaf_name_remote_t , but we pad it to
* 4 bytes anyway so it ' s not obviously a problem . Hence for the moment
* we don ' t check this structure . This can be re - instated when the attr
* definitions are updated to use c99 VLA definitions .
*
XFS_CHECK_STRUCT_SIZE ( xfs_attr_leaf_name_remote_t , 12 ) ;
*/
2016-06-21 04:53:28 +03:00
XFS_CHECK_OFFSET ( xfs_attr_leaf_name_local_t , valuelen , 0 ) ;
XFS_CHECK_OFFSET ( xfs_attr_leaf_name_local_t , namelen , 2 ) ;
XFS_CHECK_OFFSET ( xfs_attr_leaf_name_local_t , nameval , 3 ) ;
XFS_CHECK_OFFSET ( xfs_attr_leaf_name_remote_t , valueblk , 0 ) ;
XFS_CHECK_OFFSET ( xfs_attr_leaf_name_remote_t , valuelen , 4 ) ;
XFS_CHECK_OFFSET ( xfs_attr_leaf_name_remote_t , namelen , 8 ) ;
XFS_CHECK_OFFSET ( xfs_attr_leaf_name_remote_t , name , 9 ) ;
2016-03-09 00:15:14 +03:00
XFS_CHECK_STRUCT_SIZE ( xfs_attr_leafblock_t , 40 ) ;
2016-06-21 04:53:28 +03:00
XFS_CHECK_OFFSET ( xfs_attr_shortform_t , hdr . totsize , 0 ) ;
XFS_CHECK_OFFSET ( xfs_attr_shortform_t , hdr . count , 2 ) ;
XFS_CHECK_OFFSET ( xfs_attr_shortform_t , list [ 0 ] . namelen , 4 ) ;
XFS_CHECK_OFFSET ( xfs_attr_shortform_t , list [ 0 ] . valuelen , 5 ) ;
XFS_CHECK_OFFSET ( xfs_attr_shortform_t , list [ 0 ] . flags , 6 ) ;
XFS_CHECK_OFFSET ( xfs_attr_shortform_t , list [ 0 ] . nameval , 7 ) ;
2016-03-09 00:15:14 +03:00
XFS_CHECK_STRUCT_SIZE ( xfs_da_blkinfo_t , 12 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_da_intnode_t , 16 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_da_node_entry_t , 8 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_da_node_hdr_t , 16 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_data_free_t , 4 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_data_hdr_t , 16 ) ;
2016-06-21 04:53:28 +03:00
XFS_CHECK_OFFSET ( xfs_dir2_data_unused_t , freetag , 0 ) ;
XFS_CHECK_OFFSET ( xfs_dir2_data_unused_t , length , 2 ) ;
2016-03-09 00:15:14 +03:00
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_free_hdr_t , 16 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_free_t , 16 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_leaf_entry_t , 8 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_leaf_hdr_t , 16 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_leaf_t , 16 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_leaf_tail_t , 4 ) ;
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_sf_entry_t , 3 ) ;
2016-06-21 04:53:28 +03:00
XFS_CHECK_OFFSET ( xfs_dir2_sf_entry_t , namelen , 0 ) ;
XFS_CHECK_OFFSET ( xfs_dir2_sf_entry_t , offset , 1 ) ;
XFS_CHECK_OFFSET ( xfs_dir2_sf_entry_t , name , 3 ) ;
2016-03-09 00:15:14 +03:00
XFS_CHECK_STRUCT_SIZE ( xfs_dir2_sf_hdr_t , 10 ) ;
/* log structures */
XFS_CHECK_STRUCT_SIZE ( struct xfs_dq_logformat , 24 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_efd_log_format_32 , 28 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_efd_log_format_64 , 32 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_efi_log_format_32 , 28 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_efi_log_format_64 , 32 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_extent_32 , 12 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_extent_64 , 16 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_log_dinode , 176 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_icreate_log , 28 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_ictimestamp , 8 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_inode_log_format_32 , 52 ) ;
2017-10-09 21:37:22 +03:00
XFS_CHECK_STRUCT_SIZE ( struct xfs_inode_log_format , 56 ) ;
2016-03-09 00:15:14 +03:00
XFS_CHECK_STRUCT_SIZE ( struct xfs_qoff_logformat , 20 ) ;
XFS_CHECK_STRUCT_SIZE ( struct xfs_trans_header , 16 ) ;
2019-02-08 20:02:29 +03:00
/*
* The v5 superblock format extended several v4 header structures with
* additional data . While new fields are only accessible on v5
* superblocks , it ' s important that the v5 structures place original v4
* fields / headers in the correct location on - disk . For example , we must
* be able to find magic values at the same location in certain blocks
* regardless of superblock version .
*
* The following checks ensure that various v5 data structures place the
* subset of v4 metadata associated with the same type of block at the
* start of the on - disk block . If there is no data structure definition
* for certain types of v4 blocks , traverse down to the first field of
* common metadata ( e . g . , magic value ) and make sure it is at offset
* zero .
*/
XFS_CHECK_OFFSET ( struct xfs_dir3_leaf , hdr . info . hdr , 0 ) ;
XFS_CHECK_OFFSET ( struct xfs_da3_intnode , hdr . info . hdr , 0 ) ;
XFS_CHECK_OFFSET ( struct xfs_dir3_data_hdr , hdr . magic , 0 ) ;
XFS_CHECK_OFFSET ( struct xfs_dir3_free , hdr . hdr . magic , 0 ) ;
XFS_CHECK_OFFSET ( struct xfs_attr3_leafblock , hdr . info . hdr , 0 ) ;
2016-03-09 00:15:14 +03:00
}
# endif /* __XFS_ONDISK_H */