2020-05-13 02:54:17 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
2011-07-13 15:43:48 +04:00
/*
* Copyright ( c ) 2000 - 2001 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
*/
# ifndef __XFS_DIR2_PRIV_H__
# define __XFS_DIR2_PRIV_H__
2013-08-12 14:50:09 +04:00
struct dir_context ;
2019-11-09 01:52:06 +03:00
/*
* In - core version of the leaf and free block headers to abstract the
* differences in the v2 and v3 disk format of the headers .
*/
struct xfs_dir3_icleaf_hdr {
uint32_t forw ;
uint32_t back ;
uint16_t magic ;
uint16_t count ;
uint16_t stale ;
2019-11-09 01:57:50 +03:00
/*
* Pointer to the on - disk format entries , which are behind the
* variable size ( v4 vs v5 ) header in the on - disk block .
*/
struct xfs_dir2_leaf_entry * ents ;
2019-11-09 01:52:06 +03:00
} ;
struct xfs_dir3_icfree_hdr {
uint32_t magic ;
uint32_t firstdb ;
uint32_t nvalid ;
uint32_t nused ;
2019-11-09 01:58:05 +03:00
/*
* Pointer to the on - disk format entries , which are behind the
* variable size ( v4 vs v5 ) header in the on - disk block .
*/
__be16 * bests ;
2019-11-09 01:52:06 +03:00
} ;
2011-07-13 15:43:48 +04:00
/* xfs_dir2.c */
2022-03-09 21:16:09 +03:00
xfs_dahash_t xfs_ascii_ci_hashname ( const struct xfs_name * name ) ;
2019-11-11 23:59:26 +03:00
enum xfs_dacmp xfs_ascii_ci_compname ( struct xfs_da_args * args ,
const unsigned char * name , int len ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_grow_inode ( struct xfs_da_args * args , int space ,
xfs_dir2_db_t * dbp ) ;
extern int xfs_dir_cilookup_result ( struct xfs_da_args * args ,
const unsigned char * name , int len ) ;
2013-08-12 14:50:09 +04:00
2011-07-13 15:43:48 +04:00
/* xfs_dir2_block.c */
2013-08-12 14:49:36 +04:00
extern int xfs_dir3_block_read ( struct xfs_trans * tp , struct xfs_inode * dp ,
struct xfs_buf * * bpp ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_block_addname ( struct xfs_da_args * args ) ;
extern int xfs_dir2_block_lookup ( struct xfs_da_args * args ) ;
extern int xfs_dir2_block_removename ( struct xfs_da_args * args ) ;
extern int xfs_dir2_block_replace ( struct xfs_da_args * args ) ;
extern int xfs_dir2_leaf_to_block ( struct xfs_da_args * args ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * lbp , struct xfs_buf * dbp ) ;
2011-07-13 15:43:48 +04:00
/* xfs_dir2_data.c */
2019-11-09 02:05:39 +03:00
struct xfs_dir2_data_free * xfs_dir2_data_bestfree_p ( struct xfs_mount * mp ,
struct xfs_dir2_data_hdr * hdr ) ;
2019-11-09 02:05:37 +03:00
__be16 * xfs_dir2_data_entry_tag_p ( struct xfs_mount * mp ,
struct xfs_dir2_data_entry * dep ) ;
2019-11-09 02:05:48 +03:00
uint8_t xfs_dir2_data_get_ftype ( struct xfs_mount * mp ,
struct xfs_dir2_data_entry * dep ) ;
void xfs_dir2_data_put_ftype ( struct xfs_mount * mp ,
struct xfs_dir2_data_entry * dep , uint8_t ftype ) ;
2019-11-09 02:05:37 +03:00
2011-07-13 15:43:48 +04:00
# ifdef DEBUG
2018-01-08 21:51:03 +03:00
extern void xfs_dir3_data_check ( struct xfs_inode * dp , struct xfs_buf * bp ) ;
2011-07-13 15:43:48 +04:00
# else
2013-04-03 09:11:22 +04:00
# define xfs_dir3_data_check(dp,bp)
2011-07-13 15:43:48 +04:00
# endif
2012-11-14 10:54:40 +04:00
2018-01-08 21:51:03 +03:00
extern xfs_failaddr_t __xfs_dir3_data_check ( struct xfs_inode * dp ,
struct xfs_buf * bp ) ;
2019-11-20 20:46:04 +03:00
int xfs_dir3_data_read ( struct xfs_trans * tp , struct xfs_inode * dp ,
xfs_dablk_t bno , unsigned int flags , struct xfs_buf * * bpp ) ;
2019-11-20 20:46:02 +03:00
int xfs_dir3_data_readahead ( struct xfs_inode * dp , xfs_dablk_t bno ,
unsigned int flags ) ;
2012-11-12 15:54:12 +04:00
2011-07-13 15:43:48 +04:00
extern struct xfs_dir2_data_free *
xfs_dir2_data_freeinsert ( struct xfs_dir2_data_hdr * hdr ,
2013-10-29 15:11:49 +04:00
struct xfs_dir2_data_free * bf , struct xfs_dir2_data_unused * dup ,
int * loghead ) ;
2013-04-03 09:11:20 +04:00
extern int xfs_dir3_data_init ( struct xfs_da_args * args , xfs_dir2_db_t blkno ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * * bpp ) ;
2011-07-13 15:43:48 +04:00
/* xfs_dir2_leaf.c */
2019-11-09 01:57:49 +03:00
void xfs_dir2_leaf_hdr_from_disk ( struct xfs_mount * mp ,
struct xfs_dir3_icleaf_hdr * to , struct xfs_dir2_leaf * from ) ;
2019-11-09 01:57:50 +03:00
void xfs_dir2_leaf_hdr_to_disk ( struct xfs_mount * mp , struct xfs_dir2_leaf * to ,
struct xfs_dir3_icleaf_hdr * from ) ;
2019-11-20 20:46:03 +03:00
int xfs_dir3_leaf_read ( struct xfs_trans * tp , struct xfs_inode * dp ,
xfs_dablk_t fbno , struct xfs_buf * * bpp ) ;
2019-11-20 20:46:03 +03:00
int xfs_dir3_leafn_read ( struct xfs_trans * tp , struct xfs_inode * dp ,
xfs_dablk_t fbno , struct xfs_buf * * bpp ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_block_to_leaf ( struct xfs_da_args * args ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * dbp ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_leaf_addname ( struct xfs_da_args * args ) ;
2013-04-12 01:30:21 +04:00
extern void xfs_dir3_leaf_compact ( struct xfs_da_args * args ,
struct xfs_dir3_icleaf_hdr * leafhdr , struct xfs_buf * bp ) ;
extern void xfs_dir3_leaf_compact_x1 ( struct xfs_dir3_icleaf_hdr * leafhdr ,
struct xfs_dir2_leaf_entry * ents , int * indexp ,
2011-07-13 15:43:48 +04:00
int * lowstalep , int * highstalep , int * lowlogp , int * highlogp ) ;
2013-04-12 01:30:21 +04:00
extern int xfs_dir3_leaf_get_buf ( struct xfs_da_args * args , xfs_dir2_db_t bno ,
2017-06-16 21:00:05 +03:00
struct xfs_buf * * bpp , uint16_t magic ) ;
2014-06-06 09:20:54 +04:00
extern void xfs_dir3_leaf_log_ents ( struct xfs_da_args * args ,
2019-11-09 01:57:50 +03:00
struct xfs_dir3_icleaf_hdr * hdr , struct xfs_buf * bp , int first ,
int last ) ;
2014-06-06 09:20:54 +04:00
extern void xfs_dir3_leaf_log_header ( struct xfs_da_args * args ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * bp ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_leaf_lookup ( struct xfs_da_args * args ) ;
extern int xfs_dir2_leaf_removename ( struct xfs_da_args * args ) ;
extern int xfs_dir2_leaf_replace ( struct xfs_da_args * args ) ;
extern int xfs_dir2_leaf_search_hash ( struct xfs_da_args * args ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * lbp ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_leaf_trim_data ( struct xfs_da_args * args ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * lbp , xfs_dir2_db_t db ) ;
2011-07-13 15:43:48 +04:00
extern struct xfs_dir2_leaf_entry *
2013-04-12 01:30:21 +04:00
xfs_dir3_leaf_find_entry ( struct xfs_dir3_icleaf_hdr * leafhdr ,
struct xfs_dir2_leaf_entry * ents , int index , int compact ,
int lowstale , int highstale , int * lfloglow , int * lfloghigh ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_node_to_leaf ( struct xfs_da_state * state ) ;
2018-01-08 21:51:03 +03:00
extern xfs_failaddr_t xfs_dir3_leaf_check_int ( struct xfs_mount * mp ,
2021-03-22 19:52:05 +03:00
struct xfs_dir3_icleaf_hdr * hdr , struct xfs_dir2_leaf * leaf ,
bool expensive_checks ) ;
2013-04-12 01:30:21 +04:00
2011-07-13 15:43:48 +04:00
/* xfs_dir2_node.c */
2019-11-09 01:57:52 +03:00
void xfs_dir2_free_hdr_from_disk ( struct xfs_mount * mp ,
struct xfs_dir3_icfree_hdr * to , struct xfs_dir2_free * from ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_leaf_to_node ( struct xfs_da_args * args ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * lbp ) ;
2017-06-16 21:00:13 +03:00
extern xfs_dahash_t xfs_dir2_leaf_lasthash ( struct xfs_inode * dp ,
2013-10-29 15:11:50 +04:00
struct xfs_buf * bp , int * count ) ;
2012-06-22 12:50:14 +04:00
extern int xfs_dir2_leafn_lookup_int ( struct xfs_buf * bp ,
2011-07-13 15:43:48 +04:00
struct xfs_da_args * args , int * indexp ,
struct xfs_da_state * state ) ;
2013-10-29 15:11:50 +04:00
extern int xfs_dir2_leafn_order ( struct xfs_inode * dp , struct xfs_buf * leaf1_bp ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * leaf2_bp ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_leafn_split ( struct xfs_da_state * state ,
struct xfs_da_state_blk * oldblk , struct xfs_da_state_blk * newblk ) ;
extern int xfs_dir2_leafn_toosmall ( struct xfs_da_state * state , int * action ) ;
extern void xfs_dir2_leafn_unbalance ( struct xfs_da_state * state ,
struct xfs_da_state_blk * drop_blk ,
struct xfs_da_state_blk * save_blk ) ;
extern int xfs_dir2_node_addname ( struct xfs_da_args * args ) ;
extern int xfs_dir2_node_lookup ( struct xfs_da_args * args ) ;
extern int xfs_dir2_node_removename ( struct xfs_da_args * args ) ;
extern int xfs_dir2_node_replace ( struct xfs_da_args * args ) ;
extern int xfs_dir2_node_trim_free ( struct xfs_da_args * args , xfs_fileoff_t fo ,
int * rvalp ) ;
2012-11-12 15:54:13 +04:00
extern int xfs_dir2_free_read ( struct xfs_trans * tp , struct xfs_inode * dp ,
xfs_dablk_t fbno , struct xfs_buf * * bpp ) ;
2011-07-13 15:43:48 +04:00
/* xfs_dir2_sf.c */
2019-11-09 02:02:59 +03:00
xfs_ino_t xfs_dir2_sf_get_ino ( struct xfs_mount * mp , struct xfs_dir2_sf_hdr * hdr ,
struct xfs_dir2_sf_entry * sfep ) ;
2019-11-09 02:02:31 +03:00
xfs_ino_t xfs_dir2_sf_get_parent_ino ( struct xfs_dir2_sf_hdr * hdr ) ;
void xfs_dir2_sf_put_parent_ino ( struct xfs_dir2_sf_hdr * hdr , xfs_ino_t ino ) ;
2019-11-09 02:03:30 +03:00
uint8_t xfs_dir2_sf_get_ftype ( struct xfs_mount * mp ,
struct xfs_dir2_sf_entry * sfep ) ;
2019-11-09 02:02:38 +03:00
struct xfs_dir2_sf_entry * xfs_dir2_sf_nextentry ( struct xfs_mount * mp ,
struct xfs_dir2_sf_hdr * hdr , struct xfs_dir2_sf_entry * sfep ) ;
2011-07-13 15:43:48 +04:00
extern int xfs_dir2_block_sfsize ( struct xfs_inode * dp ,
struct xfs_dir2_data_hdr * block , struct xfs_dir2_sf_hdr * sfhp ) ;
2012-06-22 12:50:14 +04:00
extern int xfs_dir2_block_to_sf ( struct xfs_da_args * args , struct xfs_buf * bp ,
2011-07-13 15:43:48 +04:00
int size , xfs_dir2_sf_hdr_t * sfhp ) ;
extern int xfs_dir2_sf_addname ( struct xfs_da_args * args ) ;
extern int xfs_dir2_sf_create ( struct xfs_da_args * args , xfs_ino_t pino ) ;
extern int xfs_dir2_sf_lookup ( struct xfs_da_args * args ) ;
extern int xfs_dir2_sf_removename ( struct xfs_da_args * args ) ;
extern int xfs_dir2_sf_replace ( struct xfs_da_args * args ) ;
2018-01-08 21:51:06 +03:00
extern xfs_failaddr_t xfs_dir2_sf_verify ( struct xfs_inode * ip ) ;
2019-12-16 22:14:09 +03:00
int xfs_dir2_sf_entsize ( struct xfs_mount * mp ,
struct xfs_dir2_sf_hdr * hdr , int len ) ;
void xfs_dir2_sf_put_ino ( struct xfs_mount * mp , struct xfs_dir2_sf_hdr * hdr ,
struct xfs_dir2_sf_entry * sfep , xfs_ino_t ino ) ;
void xfs_dir2_sf_put_ftype ( struct xfs_mount * mp ,
struct xfs_dir2_sf_entry * sfep , uint8_t ftype ) ;
2011-07-13 15:43:48 +04:00
2013-08-12 14:49:45 +04:00
/* xfs_dir2_readdir.c */
2017-06-16 21:00:14 +03:00
extern int xfs_readdir ( struct xfs_trans * tp , struct xfs_inode * dp ,
struct dir_context * ctx , size_t bufsize ) ;
2013-08-12 14:49:45 +04:00
2019-11-09 02:05:38 +03:00
static inline unsigned int
xfs_dir2_data_entsize (
struct xfs_mount * mp ,
unsigned int namelen )
{
unsigned int len ;
len = offsetof ( struct xfs_dir2_data_entry , name [ 0 ] ) + namelen +
sizeof ( xfs_dir2_data_off_t ) /* tag */ ;
2021-08-19 04:46:55 +03:00
if ( xfs_has_ftype ( mp ) )
2019-11-09 02:05:38 +03:00
len + = sizeof ( uint8_t ) ;
return round_up ( len , XFS_DIR2_DATA_ALIGN ) ;
}
2022-03-09 21:16:09 +03:00
xfs_dahash_t xfs_dir2_hashname ( struct xfs_mount * mp ,
const struct xfs_name * name ) ;
2019-12-16 22:14:09 +03:00
enum xfs_dacmp xfs_dir2_compname ( struct xfs_da_args * args ,
const unsigned char * name , int len ) ;
2019-11-11 23:59:26 +03:00
2011-07-13 15:43:48 +04:00
# endif /* __XFS_DIR2_PRIV_H__ */