2011-07-13 15:43:48 +04:00
/*
* Copyright ( c ) 2000 - 2001 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it would be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# ifndef __XFS_DIR2_PRIV_H__
# define __XFS_DIR2_PRIV_H__
2013-08-12 14:50:09 +04:00
struct dir_context ;
2014-06-06 09:04:05 +04:00
/*
* Directory offset / block conversion functions .
*
* DB blocks here are logical directory block numbers , not filesystem blocks .
*/
/*
* Convert dataptr to byte in file space
*/
static inline xfs_dir2_off_t
xfs_dir2_dataptr_to_byte ( xfs_dir2_dataptr_t dp )
{
return ( xfs_dir2_off_t ) dp < < XFS_DIR2_DATA_ALIGN_LOG ;
}
/*
* Convert byte in file space to dataptr . It had better be aligned .
*/
static inline xfs_dir2_dataptr_t
xfs_dir2_byte_to_dataptr ( xfs_dir2_off_t by )
{
return ( xfs_dir2_dataptr_t ) ( by > > XFS_DIR2_DATA_ALIGN_LOG ) ;
}
/*
* Convert byte in space to ( DB ) block
*/
static inline xfs_dir2_db_t
2014-06-06 09:08:18 +04:00
xfs_dir2_byte_to_db ( struct xfs_da_geometry * geo , xfs_dir2_off_t by )
2014-06-06 09:04:05 +04:00
{
2014-06-06 09:08:18 +04:00
return ( xfs_dir2_db_t ) ( by > > geo - > blklog ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert dataptr to a block number
*/
static inline xfs_dir2_db_t
2014-06-06 09:08:18 +04:00
xfs_dir2_dataptr_to_db ( struct xfs_da_geometry * geo , xfs_dir2_dataptr_t dp )
2014-06-06 09:04:05 +04:00
{
2014-06-06 09:08:18 +04:00
return xfs_dir2_byte_to_db ( geo , xfs_dir2_dataptr_to_byte ( dp ) ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert byte in space to offset in a block
*/
static inline xfs_dir2_data_aoff_t
2014-06-06 09:06:53 +04:00
xfs_dir2_byte_to_off ( struct xfs_da_geometry * geo , xfs_dir2_off_t by )
2014-06-06 09:04:05 +04:00
{
2014-06-06 09:06:53 +04:00
return ( xfs_dir2_data_aoff_t ) ( by & ( geo - > blksize - 1 ) ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert dataptr to a byte offset in a block
*/
static inline xfs_dir2_data_aoff_t
2014-06-06 09:08:18 +04:00
xfs_dir2_dataptr_to_off ( struct xfs_da_geometry * geo , xfs_dir2_dataptr_t dp )
2014-06-06 09:04:05 +04:00
{
2014-06-06 09:08:18 +04:00
return xfs_dir2_byte_to_off ( geo , xfs_dir2_dataptr_to_byte ( dp ) ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert block and offset to byte in space
*/
static inline xfs_dir2_off_t
2014-06-06 09:06:53 +04:00
xfs_dir2_db_off_to_byte ( struct xfs_da_geometry * geo , xfs_dir2_db_t db ,
2014-06-06 09:04:05 +04:00
xfs_dir2_data_aoff_t o )
{
2014-06-06 09:06:53 +04:00
return ( ( xfs_dir2_off_t ) db < < geo - > blklog ) + o ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert block ( DB ) to block ( dablk )
*/
static inline xfs_dablk_t
2014-06-06 09:07:53 +04:00
xfs_dir2_db_to_da ( struct xfs_da_geometry * geo , xfs_dir2_db_t db )
2014-06-06 09:04:05 +04:00
{
2014-06-06 09:07:53 +04:00
return ( xfs_dablk_t ) ( db < < ( geo - > blklog - geo - > fsblog ) ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert byte in space to ( DA ) block
*/
static inline xfs_dablk_t
2014-06-06 09:08:18 +04:00
xfs_dir2_byte_to_da ( struct xfs_da_geometry * geo , xfs_dir2_off_t by )
2014-06-06 09:04:05 +04:00
{
2014-06-06 09:08:18 +04:00
return xfs_dir2_db_to_da ( geo , xfs_dir2_byte_to_db ( geo , by ) ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert block and offset to dataptr
*/
static inline xfs_dir2_dataptr_t
2014-06-06 09:08:18 +04:00
xfs_dir2_db_off_to_dataptr ( struct xfs_da_geometry * geo , xfs_dir2_db_t db ,
2014-06-06 09:04:05 +04:00
xfs_dir2_data_aoff_t o )
{
2014-06-06 09:08:18 +04:00
return xfs_dir2_byte_to_dataptr ( xfs_dir2_db_off_to_byte ( geo , db , o ) ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert block ( dablk ) to block ( DB )
*/
static inline xfs_dir2_db_t
2014-06-06 09:07:53 +04:00
xfs_dir2_da_to_db ( struct xfs_da_geometry * geo , xfs_dablk_t da )
2014-06-06 09:04:05 +04:00
{
2014-06-06 09:07:53 +04:00
return ( xfs_dir2_db_t ) ( da > > ( geo - > blklog - geo - > fsblog ) ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Convert block ( dablk ) to byte offset in space
*/
static inline xfs_dir2_off_t
2014-06-06 09:07:53 +04:00
xfs_dir2_da_to_byte ( struct xfs_da_geometry * geo , xfs_dablk_t da )
2014-06-06 09:04:05 +04:00
{
2014-06-06 09:07:53 +04:00
return xfs_dir2_db_off_to_byte ( geo , xfs_dir2_da_to_db ( geo , da ) , 0 ) ;
2014-06-06 09:04:05 +04:00
}
/*
* Directory tail pointer accessor functions . Based on block geometry .
*/
static inline struct xfs_dir2_block_tail *
2014-06-06 09:15:59 +04:00
xfs_dir2_block_tail_p ( struct xfs_da_geometry * geo , struct xfs_dir2_data_hdr * hdr )
2014-06-06 09:04:05 +04:00
{
return ( ( struct xfs_dir2_block_tail * )
2014-06-06 09:15:59 +04:00
( ( char * ) hdr + geo - > blksize ) ) - 1 ;
2014-06-06 09:04:05 +04:00
}
static inline struct xfs_dir2_leaf_tail *
2014-06-06 09:15:59 +04:00
xfs_dir2_leaf_tail_p ( struct xfs_da_geometry * geo , struct xfs_dir2_leaf * lp )
2014-06-06 09:04:05 +04:00
{
return ( struct xfs_dir2_leaf_tail * )
2014-06-06 09:15:59 +04:00
( ( char * ) lp + geo - > blksize -
2014-06-06 09:04:05 +04:00
sizeof ( struct xfs_dir2_leaf_tail ) ) ;
}
2011-07-13 15:43:48 +04:00
/* xfs_dir2.c */
extern int xfs_dir_ino_validate ( struct xfs_mount * mp , xfs_ino_t ino ) ;
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
# define S_SHIFT 12
extern const unsigned char xfs_mode_to_ftype [ ] ;
extern unsigned char xfs_dir3_get_dtype ( struct xfs_mount * mp ,
__uint8_t filetype ) ;
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 */
# ifdef DEBUG
2013-04-03 09:11:22 +04:00
# define xfs_dir3_data_check(dp,bp) __xfs_dir3_data_check(dp, 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
2013-04-03 09:11:22 +04:00
extern int __xfs_dir3_data_check ( struct xfs_inode * dp , struct xfs_buf * bp ) ;
extern int xfs_dir3_data_read ( struct xfs_trans * tp , struct xfs_inode * dp ,
2012-11-12 15:54:14 +04:00
xfs_dablk_t bno , xfs_daddr_t mapped_bno , struct xfs_buf * * bpp ) ;
2014-04-14 13:01:59 +04:00
extern int xfs_dir3_data_readahead ( struct xfs_inode * dp , xfs_dablk_t bno ,
xfs_daddr_t mapped_bno ) ;
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 */
2013-04-12 01:30:21 +04:00
extern int xfs_dir3_leafn_read ( struct xfs_trans * tp , struct xfs_inode * dp ,
2012-11-12 15:54:15 +04:00
xfs_dablk_t fbno , xfs_daddr_t mappedbno , 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 ,
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 ,
2013-10-29 15:11:50 +04:00
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 ) ;
2013-10-29 15:11:50 +04:00
extern bool xfs_dir3_leaf_check_int ( struct xfs_mount * mp , struct xfs_inode * dp ,
2013-04-12 01:30:21 +04:00
struct xfs_dir3_icleaf_hdr * hdr , struct xfs_dir2_leaf * leaf ) ;
2011-07-13 15:43:48 +04:00
/* xfs_dir2_node.c */
extern int xfs_dir2_leaf_to_node ( struct xfs_da_args * args ,
2012-06-22 12:50:14 +04:00
struct xfs_buf * lbp ) ;
2013-10-29 15:11:50 +04:00
extern xfs_dahash_t xfs_dir2_leafn_lasthash ( struct xfs_inode * dp ,
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 */
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 ) ;
2013-08-12 14:49:45 +04:00
/* xfs_dir2_readdir.c */
extern int xfs_readdir ( struct xfs_inode * dp , struct dir_context * ctx ,
size_t bufsize ) ;
2011-07-13 15:43:48 +04:00
# endif /* __XFS_DIR2_PRIV_H__ */