2020-10-15 23:37:55 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef __FAST_COMMIT_H__
# define __FAST_COMMIT_H__
2020-11-20 23:22:31 +03:00
/*
* Note this file is present in e2fsprogs / lib / ext2fs / fast_commit . h and
* linux / fs / ext4 / fast_commit . h . These file should always be byte identical .
*/
2020-10-15 23:37:57 +03:00
/* Fast commit tags */
# define EXT4_FC_TAG_ADD_RANGE 0x0001
# define EXT4_FC_TAG_DEL_RANGE 0x0002
# define EXT4_FC_TAG_CREAT 0x0003
# define EXT4_FC_TAG_LINK 0x0004
# define EXT4_FC_TAG_UNLINK 0x0005
# define EXT4_FC_TAG_INODE 0x0006
# define EXT4_FC_TAG_PAD 0x0007
# define EXT4_FC_TAG_TAIL 0x0008
# define EXT4_FC_TAG_HEAD 0x0009
# define EXT4_FC_SUPPORTED_FEATURES 0x0
/* On disk fast commit tlv value structures */
/* Fast commit on disk tag length structure */
struct ext4_fc_tl {
__le16 fc_tag ;
__le16 fc_len ;
} ;
/* Value structure for tag EXT4_FC_TAG_HEAD. */
struct ext4_fc_head {
__le32 fc_features ;
__le32 fc_tid ;
} ;
/* Value structure for EXT4_FC_TAG_ADD_RANGE. */
struct ext4_fc_add_range {
__le32 fc_ino ;
__u8 fc_ex [ 12 ] ;
} ;
/* Value structure for tag EXT4_FC_TAG_DEL_RANGE. */
struct ext4_fc_del_range {
__le32 fc_ino ;
__le32 fc_lblk ;
__le32 fc_len ;
} ;
/*
* This is the value structure for tags EXT4_FC_TAG_CREAT , EXT4_FC_TAG_LINK
* and EXT4_FC_TAG_UNLINK .
*/
struct ext4_fc_dentry_info {
__le32 fc_parent_ino ;
__le32 fc_ino ;
2022-02-15 04:11:44 +03:00
__u8 fc_dname [ ] ;
2020-10-15 23:37:57 +03:00
} ;
2022-11-07 01:48:38 +03:00
/* Value structure for EXT4_FC_TAG_INODE. */
2020-10-15 23:37:57 +03:00
struct ext4_fc_inode {
__le32 fc_ino ;
2022-02-15 04:11:44 +03:00
__u8 fc_raw_inode [ ] ;
2020-10-15 23:37:57 +03:00
} ;
/* Value structure for tag EXT4_FC_TAG_TAIL. */
struct ext4_fc_tail {
__le32 fc_tid ;
__le32 fc_crc ;
} ;
2022-09-24 10:52:31 +03:00
/* Tag base length */
# define EXT4_FC_TAG_BASE_LEN (sizeof(struct ext4_fc_tl))
2020-10-15 23:37:57 +03:00
/*
2021-12-23 23:21:39 +03:00
* Fast commit status codes
*/
enum {
EXT4_FC_STATUS_OK = 0 ,
EXT4_FC_STATUS_INELIGIBLE ,
EXT4_FC_STATUS_SKIPPED ,
EXT4_FC_STATUS_FAILED ,
} ;
/*
* Fast commit ineligiblity reasons :
2020-10-15 23:37:57 +03:00
*/
enum {
EXT4_FC_REASON_XATTR = 0 ,
EXT4_FC_REASON_CROSS_RENAME ,
EXT4_FC_REASON_JOURNAL_FLAG_CHANGE ,
2020-11-06 06:58:51 +03:00
EXT4_FC_REASON_NOMEM ,
2020-10-15 23:37:57 +03:00
EXT4_FC_REASON_SWAP_BOOT ,
EXT4_FC_REASON_RESIZE ,
EXT4_FC_REASON_RENAME_DIR ,
EXT4_FC_REASON_FALLOC_RANGE ,
2020-11-06 06:59:07 +03:00
EXT4_FC_REASON_INODE_JOURNAL_DATA ,
2022-11-07 01:48:35 +03:00
EXT4_FC_REASON_ENCRYPTED_FILENAME ,
2020-10-15 23:37:57 +03:00
EXT4_FC_REASON_MAX
} ;
2020-11-20 23:22:31 +03:00
# ifdef __KERNEL__
/*
* In memory list of dentry updates that are performed on the file
* system used by fast commit code .
*/
struct ext4_fc_dentry_update {
int fcd_op ; /* Type of update create / unlink / link */
int fcd_parent ; /* Parent inode number */
int fcd_ino ; /* Inode number */
struct qstr fcd_name ; /* Dirent name */
unsigned char fcd_iname [ DNAME_INLINE_LEN ] ; /* Dirent name string */
struct list_head fcd_list ;
2022-02-21 10:56:15 +03:00
struct list_head fcd_dilist ;
2020-11-20 23:22:31 +03:00
} ;
2020-10-15 23:37:57 +03:00
struct ext4_fc_stats {
unsigned int fc_ineligible_reason_count [ EXT4_FC_REASON_MAX ] ;
unsigned long fc_num_commits ;
unsigned long fc_ineligible_commits ;
2021-12-23 23:21:39 +03:00
unsigned long fc_failed_commits ;
unsigned long fc_skipped_commits ;
2020-10-15 23:37:57 +03:00
unsigned long fc_numblks ;
2021-12-23 23:21:39 +03:00
u64 s_fc_avg_commit_time ;
2020-10-15 23:37:57 +03:00
} ;
2020-10-15 23:37:59 +03:00
# define EXT4_FC_REPLAY_REALLOC_INCREMENT 4
/*
* Physical block regions added to different inodes due to fast commit
* recovery . These are set during the SCAN phase . During the replay phase ,
* our allocator excludes these from its allocation . This ensures that
* we don ' t accidentally allocating a block that is going to be used by
* another inode .
*/
struct ext4_fc_alloc_region {
ext4_lblk_t lblk ;
ext4_fsblk_t pblk ;
int ino , len ;
} ;
/*
* Fast commit replay state .
*/
struct ext4_fc_replay_state {
int fc_replay_num_tags ;
int fc_replay_expected_off ;
int fc_current_pass ;
int fc_cur_tag ;
int fc_crc ;
struct ext4_fc_alloc_region * fc_regions ;
int fc_regions_size , fc_regions_used , fc_regions_valid ;
int * fc_modified_inodes ;
int fc_modified_inodes_used , fc_modified_inodes_size ;
} ;
# define region_last(__region) (((__region)->lblk) + ((__region)->len) - 1)
2020-11-20 23:22:31 +03:00
# endif
2020-10-15 23:37:59 +03:00
2020-11-20 23:22:31 +03:00
static inline const char * tag2str ( __u16 tag )
{
switch ( tag ) {
case EXT4_FC_TAG_LINK :
return " ADD_ENTRY " ;
case EXT4_FC_TAG_UNLINK :
return " DEL_ENTRY " ;
case EXT4_FC_TAG_ADD_RANGE :
return " ADD_RANGE " ;
case EXT4_FC_TAG_CREAT :
return " CREAT_DENTRY " ;
case EXT4_FC_TAG_DEL_RANGE :
return " DEL_RANGE " ;
case EXT4_FC_TAG_INODE :
return " INODE " ;
case EXT4_FC_TAG_PAD :
return " PAD " ;
case EXT4_FC_TAG_TAIL :
return " TAIL " ;
case EXT4_FC_TAG_HEAD :
return " HEAD " ;
default :
return " ERROR " ;
}
}
2020-10-15 23:37:55 +03:00
# endif /* __FAST_COMMIT_H__ */