2021-12-04 01:18:03 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef BTRFS_INODE_ITEM_H
# define BTRFS_INODE_ITEM_H
# include <linux/types.h>
struct btrfs_trans_handle ;
struct btrfs_root ;
struct btrfs_path ;
struct btrfs_key ;
struct btrfs_inode_extref ;
2021-12-04 01:18:04 +03:00
struct btrfs_inode ;
2021-12-04 01:18:03 +03:00
struct extent_buffer ;
2021-12-04 01:18:04 +03:00
/*
* Return this if we need to call truncate_block for the last bit of the
* truncate .
*/
# define BTRFS_NEED_TRUNCATE_BLOCK 1
2021-12-04 01:18:09 +03:00
struct btrfs_truncate_control {
2021-12-04 01:18:15 +03:00
/*
* IN : the inode we ' re operating on , this can be NULL if
* - > clear_extent_range is false .
*/
struct btrfs_inode * inode ;
2021-12-04 01:18:09 +03:00
/* IN: the size we're truncating to. */
u64 new_size ;
/* OUT: the number of extents truncated. */
u64 extents_found ;
2021-12-04 01:18:10 +03:00
/* OUT: the last size we truncated this inode to. */
u64 last_size ;
2021-12-04 01:18:11 +03:00
/* OUT: the number of bytes to sub from this inode. */
u64 sub_bytes ;
2021-12-04 01:18:14 +03:00
/* IN: the ino we are truncating. */
u64 ino ;
2021-12-04 01:18:09 +03:00
/*
* IN : minimum key type to remove . All key types with this type are
* removed only if their offset > = new_size .
*/
u32 min_type ;
2021-12-04 01:18:12 +03:00
/*
* IN : true if we don ' t want to do extent reference updates for any file
* extents we drop .
*/
bool skip_ref_updates ;
2021-12-04 01:18:13 +03:00
/*
* IN : true if we need to clear the file extent range for the inode as
* we drop the file extent items .
*/
bool clear_extent_range ;
2021-12-04 01:18:09 +03:00
} ;
2023-04-29 23:07:18 +03:00
/*
* btrfs_inode_item stores flags in a u64 , btrfs_inode stores them in two
* separate u32s . These two functions convert between the two representations .
*/
static inline u64 btrfs_inode_combine_flags ( u32 flags , u32 ro_flags )
{
return ( flags | ( ( u64 ) ro_flags < < 32 ) ) ;
}
static inline void btrfs_inode_split_flags ( u64 inode_item_flags ,
u32 * flags , u32 * ro_flags )
{
* flags = ( u32 ) inode_item_flags ;
* ro_flags = ( u32 ) ( inode_item_flags > > 32 ) ;
}
2021-12-04 01:18:04 +03:00
int btrfs_truncate_inode_items ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
2021-12-04 01:18:09 +03:00
struct btrfs_truncate_control * control ) ;
2021-12-04 01:18:03 +03:00
int btrfs_insert_inode_ref ( struct btrfs_trans_handle * trans ,
2022-10-20 19:58:27 +03:00
struct btrfs_root * root , const struct fscrypt_str * name ,
2021-12-04 01:18:03 +03:00
u64 inode_objectid , u64 ref_objectid , u64 index ) ;
int btrfs_del_inode_ref ( struct btrfs_trans_handle * trans ,
2022-10-20 19:58:27 +03:00
struct btrfs_root * root , const struct fscrypt_str * name ,
2022-10-20 19:58:25 +03:00
u64 inode_objectid , u64 ref_objectid , u64 * index ) ;
2021-12-04 01:18:03 +03:00
int btrfs_insert_empty_inode ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path , u64 objectid ) ;
2022-10-20 19:58:25 +03:00
int btrfs_lookup_inode ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root , struct btrfs_path * path ,
2021-12-04 01:18:03 +03:00
struct btrfs_key * location , int mod ) ;
struct btrfs_inode_extref * btrfs_lookup_inode_extref (
struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_path * path ,
2022-10-20 19:58:27 +03:00
const struct fscrypt_str * name ,
2021-12-04 01:18:03 +03:00
u64 inode_objectid , u64 ref_objectid , int ins_len ,
int cow ) ;
struct btrfs_inode_ref * btrfs_find_name_in_backref ( struct extent_buffer * leaf ,
2022-10-20 19:58:25 +03:00
int slot ,
2022-10-20 19:58:27 +03:00
const struct fscrypt_str * name ) ;
2021-12-04 01:18:03 +03:00
struct btrfs_inode_extref * btrfs_find_name_in_ext_backref (
struct extent_buffer * leaf , int slot , u64 ref_objectid ,
2022-10-20 19:58:27 +03:00
const struct fscrypt_str * name ) ;
2021-12-04 01:18:03 +03:00
# endif