2017-03-16 22:18:50 -08:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _BCACHEFS_INODE_H
# define _BCACHEFS_INODE_H
2022-10-21 19:15:07 -04:00
# include "bkey.h"
2023-11-02 15:28:15 -04:00
# include "bkey_methods.h"
2017-03-16 22:18:50 -08:00
# include "opts.h"
2023-07-06 21:16:10 -04:00
enum bkey_invalid_flags ;
2018-12-17 05:31:09 -05:00
extern const char * const bch2_inode_opts [ ] ;
2023-10-24 20:44:36 -04:00
int bch2_inode_invalid ( struct bch_fs * , struct bkey_s_c ,
2023-07-06 21:16:10 -04:00
enum bkey_invalid_flags , struct printbuf * ) ;
2023-10-24 20:44:36 -04:00
int bch2_inode_v2_invalid ( struct bch_fs * , struct bkey_s_c ,
2023-07-06 21:16:10 -04:00
enum bkey_invalid_flags , struct printbuf * ) ;
2023-10-24 20:44:36 -04:00
int bch2_inode_v3_invalid ( struct bch_fs * , struct bkey_s_c ,
2023-07-06 21:16:10 -04:00
enum bkey_invalid_flags , struct printbuf * ) ;
2018-11-09 01:24:07 -05:00
void bch2_inode_to_text ( struct printbuf * , struct bch_fs * , struct bkey_s_c ) ;
2017-03-16 22:18:50 -08:00
2023-12-28 00:05:54 -05:00
int bch2_trigger_inode ( struct btree_trans * , enum btree_id , unsigned ,
2023-12-27 23:19:09 -05:00
struct bkey_s_c , struct bkey_s , unsigned ) ;
2023-07-17 00:41:48 -04:00
2022-10-22 15:59:53 -04:00
# define bch2_bkey_ops_inode ((struct bkey_ops) { \
2017-03-16 22:18:50 -08:00
. key_invalid = bch2_inode_invalid , \
. val_to_text = bch2_inode_to_text , \
2023-12-31 21:01:06 -05:00
. trigger = bch2_trigger_inode , \
2023-04-29 13:24:18 -04:00
. min_val_size = 16 , \
2022-10-22 15:59:53 -04:00
} )
2017-03-16 22:18:50 -08:00
2022-10-22 15:59:53 -04:00
# define bch2_bkey_ops_inode_v2 ((struct bkey_ops) { \
2021-10-29 21:14:23 -04:00
. key_invalid = bch2_inode_v2_invalid , \
. val_to_text = bch2_inode_to_text , \
2023-12-31 21:01:06 -05:00
. trigger = bch2_trigger_inode , \
2023-04-29 13:24:18 -04:00
. min_val_size = 32 , \
2022-10-22 15:59:53 -04:00
} )
2021-10-29 21:14:23 -04:00
2022-10-21 13:21:03 -04:00
# define bch2_bkey_ops_inode_v3 ((struct bkey_ops) { \
. key_invalid = bch2_inode_v3_invalid , \
. val_to_text = bch2_inode_to_text , \
2023-12-31 21:01:06 -05:00
. trigger = bch2_trigger_inode , \
2023-04-29 13:24:18 -04:00
. min_val_size = 48 , \
2022-10-21 13:21:03 -04:00
} )
2021-10-29 21:14:23 -04:00
static inline bool bkey_is_inode ( const struct bkey * k )
{
return k - > type = = KEY_TYPE_inode | |
2022-10-21 13:21:03 -04:00
k - > type = = KEY_TYPE_inode_v2 | |
k - > type = = KEY_TYPE_inode_v3 ;
2021-10-29 21:14:23 -04:00
}
2023-10-24 20:44:36 -04:00
int bch2_inode_generation_invalid ( struct bch_fs * , struct bkey_s_c ,
2023-07-06 21:16:10 -04:00
enum bkey_invalid_flags , struct printbuf * ) ;
2022-04-03 17:50:01 -04:00
void bch2_inode_generation_to_text ( struct printbuf * , struct bch_fs * , struct bkey_s_c ) ;
2018-11-01 15:10:01 -04:00
2022-10-22 15:59:53 -04:00
# define bch2_bkey_ops_inode_generation ((struct bkey_ops) { \
2018-11-01 15:10:01 -04:00
. key_invalid = bch2_inode_generation_invalid , \
. val_to_text = bch2_inode_generation_to_text , \
2023-04-29 13:24:18 -04:00
. min_val_size = 8 , \
2022-10-22 15:59:53 -04:00
} )
2018-11-01 15:10:01 -04:00
2020-11-05 23:39:33 -05:00
#if 0
typedef struct {
u64 lo ;
u32 hi ;
} __packed __aligned ( 4 ) u96 ;
# endif
typedef u64 u96 ;
2017-03-16 22:18:50 -08:00
struct bch_inode_unpacked {
u64 bi_inum ;
2021-10-29 21:14:23 -04:00
u64 bi_journal_seq ;
2017-03-16 22:18:50 -08:00
__le64 bi_hash_seed ;
2022-10-21 13:21:03 -04:00
u64 bi_size ;
u64 bi_sectors ;
u64 bi_version ;
2017-03-16 22:18:50 -08:00
u32 bi_flags ;
u16 bi_mode ;
2018-12-13 06:01:30 -05:00
# define x(_name, _bits) u##_bits _name;
2022-10-21 13:21:03 -04:00
BCH_INODE_FIELDS_v3 ( )
2018-12-13 06:01:30 -05:00
# undef x
2017-03-16 22:18:50 -08:00
} ;
struct bkey_inode_buf {
2022-10-21 13:21:03 -04:00
struct bkey_i_inode_v3 inode ;
2017-03-16 22:18:50 -08:00
2018-12-13 06:01:30 -05:00
# define x(_name, _bits) + 8 + _bits / 8
2022-10-21 13:21:03 -04:00
u8 _pad [ 0 + BCH_INODE_FIELDS_v3 ( ) ] ;
2018-12-13 06:01:30 -05:00
# undef x
2022-10-22 15:00:16 -04:00
} __packed __aligned ( 8 ) ;
2017-03-16 22:18:50 -08:00
2022-10-21 13:21:03 -04:00
void bch2_inode_pack ( struct bkey_inode_buf * , const struct bch_inode_unpacked * ) ;
2021-10-29 21:14:23 -04:00
int bch2_inode_unpack ( struct bkey_s_c , struct bch_inode_unpacked * ) ;
2022-10-21 13:21:03 -04:00
struct bkey_i * bch2_inode_to_v3 ( struct btree_trans * , struct bkey_i * ) ;
2017-03-16 22:18:50 -08:00
2021-07-30 17:59:37 -04:00
void bch2_inode_unpacked_to_text ( struct printbuf * , struct bch_inode_unpacked * ) ;
2024-02-05 22:20:12 -05:00
int bch2_inode_peek_nowarn ( struct btree_trans * , struct btree_iter * ,
struct bch_inode_unpacked * , subvol_inum , unsigned ) ;
2021-08-30 15:18:31 -04:00
int bch2_inode_peek ( struct btree_trans * , struct btree_iter * ,
2021-03-16 00:28:17 -04:00
struct bch_inode_unpacked * , subvol_inum , unsigned ) ;
2023-11-02 15:28:15 -04:00
int bch2_inode_write_flags ( struct btree_trans * , struct btree_iter * ,
struct bch_inode_unpacked * , enum btree_update_flags ) ;
static inline int bch2_inode_write ( struct btree_trans * trans ,
struct btree_iter * iter ,
struct bch_inode_unpacked * inode )
{
return bch2_inode_write_flags ( trans , iter , inode , 0 ) ;
}
2019-10-01 16:51:57 -04:00
2024-02-01 07:35:28 -05:00
int __bch2_fsck_write_inode ( struct btree_trans * , struct bch_inode_unpacked * , u32 ) ;
int bch2_fsck_write_inode ( struct btree_trans * , struct bch_inode_unpacked * , u32 ) ;
2019-10-02 18:35:36 -04:00
void bch2_inode_init_early ( struct bch_fs * ,
struct bch_inode_unpacked * ) ;
void bch2_inode_init_late ( struct bch_inode_unpacked * , u64 ,
uid_t , gid_t , umode_t , dev_t ,
struct bch_inode_unpacked * ) ;
2017-03-16 22:18:50 -08:00
void bch2_inode_init ( struct bch_fs * , struct bch_inode_unpacked * ,
uid_t , gid_t , umode_t , dev_t ,
struct bch_inode_unpacked * ) ;
2021-08-30 15:18:31 -04:00
int bch2_inode_create ( struct btree_trans * , struct btree_iter * ,
struct bch_inode_unpacked * , u32 , u64 ) ;
2017-03-16 22:18:50 -08:00
2022-01-12 02:13:21 -05:00
int bch2_inode_rm ( struct bch_fs * , subvol_inum ) ;
2017-03-16 22:18:50 -08:00
2023-09-10 22:05:50 -04:00
int bch2_inode_find_by_inum_nowarn_trans ( struct btree_trans * ,
subvol_inum ,
struct bch_inode_unpacked * ) ;
2021-11-06 00:03:40 -04:00
int bch2_inode_find_by_inum_trans ( struct btree_trans * , subvol_inum ,
struct bch_inode_unpacked * ) ;
2021-03-16 00:28:17 -04:00
int bch2_inode_find_by_inum ( struct bch_fs * , subvol_inum ,
struct bch_inode_unpacked * ) ;
2017-03-16 22:18:50 -08:00
2022-11-23 20:14:55 -05:00
# define inode_opt_get(_c, _inode, _name) \
( ( _inode ) - > bi_ # # _name ? ( _inode ) - > bi_ # # _name - 1 : ( _c ) - > opts . _name )
2017-03-16 22:18:50 -08:00
2018-12-17 05:31:09 -05:00
static inline void bch2_inode_opt_set ( struct bch_inode_unpacked * inode ,
enum inode_opt_id id , u64 v )
2017-03-16 22:18:50 -08:00
{
switch ( id ) {
2018-12-17 05:31:09 -05:00
# define x(_name, ...) \
case Inode_opt_ # # _name : \
2017-03-16 22:18:50 -08:00
inode - > bi_ # # _name = v ; \
break ;
BCH_INODE_OPTS ( )
2018-12-13 06:01:30 -05:00
# undef x
2017-03-16 22:18:50 -08:00
default :
BUG ( ) ;
}
}
2018-12-17 05:31:09 -05:00
static inline u64 bch2_inode_opt_get ( struct bch_inode_unpacked * inode ,
enum inode_opt_id id )
2017-03-16 22:18:50 -08:00
{
2018-12-17 05:31:09 -05:00
switch ( id ) {
# define x(_name, ...) \
case Inode_opt_ # # _name : \
return inode - > bi_ # # _name ;
BCH_INODE_OPTS ( )
# undef x
default :
BUG ( ) ;
}
2017-03-16 22:18:50 -08:00
}
2019-10-02 18:35:36 -04:00
static inline u8 mode_to_type ( umode_t mode )
{
return ( mode > > 12 ) & 15 ;
}
2021-10-28 16:16:55 -04:00
static inline u8 inode_d_type ( struct bch_inode_unpacked * inode )
{
return inode - > bi_subvol ? DT_SUBVOL : mode_to_type ( inode - > bi_mode ) ;
}
2024-02-08 22:52:40 -05:00
static inline u32 bch2_inode_flags ( struct bkey_s_c k )
{
switch ( k . k - > type ) {
case KEY_TYPE_inode :
return le32_to_cpu ( bkey_s_c_to_inode ( k ) . v - > bi_flags ) ;
case KEY_TYPE_inode_v2 :
return le64_to_cpu ( bkey_s_c_to_inode_v2 ( k ) . v - > bi_flags ) ;
case KEY_TYPE_inode_v3 :
return le64_to_cpu ( bkey_s_c_to_inode_v3 ( k ) . v - > bi_flags ) ;
default :
return 0 ;
}
}
2019-09-25 16:19:52 -04:00
/* i_nlink: */
static inline unsigned nlink_bias ( umode_t mode )
{
return S_ISDIR ( mode ) ? 2 : 1 ;
}
static inline unsigned bch2_inode_nlink_get ( struct bch_inode_unpacked * bi )
{
2023-11-02 11:42:48 -04:00
return bi - > bi_flags & BCH_INODE_unlinked
2019-09-25 16:19:52 -04:00
? 0
: bi - > bi_nlink + nlink_bias ( bi - > bi_mode ) ;
}
static inline void bch2_inode_nlink_set ( struct bch_inode_unpacked * bi ,
unsigned nlink )
{
if ( nlink ) {
bi - > bi_nlink = nlink - nlink_bias ( bi - > bi_mode ) ;
2023-11-02 11:42:48 -04:00
bi - > bi_flags & = ~ BCH_INODE_unlinked ;
2019-09-25 16:19:52 -04:00
} else {
bi - > bi_nlink = 0 ;
2023-11-02 11:42:48 -04:00
bi - > bi_flags | = BCH_INODE_unlinked ;
2019-09-25 16:19:52 -04:00
}
}
2022-06-23 18:26:01 -04:00
int bch2_inode_nlink_inc ( struct bch_inode_unpacked * ) ;
void bch2_inode_nlink_dec ( struct btree_trans * , struct bch_inode_unpacked * ) ;
2022-11-23 20:28:15 -05:00
struct bch_opts bch2_inode_opts_to_opts ( struct bch_inode_unpacked * ) ;
2022-11-23 20:14:55 -05:00
void bch2_inode_opts_get ( struct bch_io_opts * , struct bch_fs * ,
struct bch_inode_unpacked * ) ;
2023-10-20 14:05:31 -04:00
int bch2_inum_opts_get ( struct btree_trans * , subvol_inum , struct bch_io_opts * ) ;
2022-11-23 20:28:15 -05:00
2023-07-21 03:20:08 -04:00
int bch2_inode_rm_snapshot ( struct btree_trans * , u64 , u32 ) ;
2023-07-17 00:56:29 -04:00
int bch2_delete_dead_inodes ( struct bch_fs * ) ;
2023-07-21 03:20:08 -04:00
2017-03-16 22:18:50 -08:00
# endif /* _BCACHEFS_INODE_H */