16866d7b3SHarshad Shirwadkar /* SPDX-License-Identifier: GPL-2.0 */
26866d7b3SHarshad Shirwadkar
36866d7b3SHarshad Shirwadkar #ifndef __FAST_COMMIT_H__
46866d7b3SHarshad Shirwadkar #define __FAST_COMMIT_H__
56866d7b3SHarshad Shirwadkar
6941ba122SHarshad Shirwadkar /*
7941ba122SHarshad Shirwadkar * Note this file is present in e2fsprogs/lib/ext2fs/fast_commit.h and
8941ba122SHarshad Shirwadkar * linux/fs/ext4/fast_commit.h. These file should always be byte identical.
9941ba122SHarshad Shirwadkar */
10941ba122SHarshad Shirwadkar
11aa75f4d3SHarshad Shirwadkar /* Fast commit tags */
12aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_ADD_RANGE 0x0001
13aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_DEL_RANGE 0x0002
14aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_CREAT 0x0003
15aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_LINK 0x0004
16aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_UNLINK 0x0005
17aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_INODE 0x0006
18aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_PAD 0x0007
19aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_TAIL 0x0008
20aa75f4d3SHarshad Shirwadkar #define EXT4_FC_TAG_HEAD 0x0009
21aa75f4d3SHarshad Shirwadkar
22aa75f4d3SHarshad Shirwadkar #define EXT4_FC_SUPPORTED_FEATURES 0x0
23aa75f4d3SHarshad Shirwadkar
24aa75f4d3SHarshad Shirwadkar /* On disk fast commit tlv value structures */
25aa75f4d3SHarshad Shirwadkar
26aa75f4d3SHarshad Shirwadkar /* Fast commit on disk tag length structure */
27aa75f4d3SHarshad Shirwadkar struct ext4_fc_tl {
28aa75f4d3SHarshad Shirwadkar __le16 fc_tag;
29aa75f4d3SHarshad Shirwadkar __le16 fc_len;
30aa75f4d3SHarshad Shirwadkar };
31aa75f4d3SHarshad Shirwadkar
32aa75f4d3SHarshad Shirwadkar /* Value structure for tag EXT4_FC_TAG_HEAD. */
33aa75f4d3SHarshad Shirwadkar struct ext4_fc_head {
34aa75f4d3SHarshad Shirwadkar __le32 fc_features;
35aa75f4d3SHarshad Shirwadkar __le32 fc_tid;
36aa75f4d3SHarshad Shirwadkar };
37aa75f4d3SHarshad Shirwadkar
38aa75f4d3SHarshad Shirwadkar /* Value structure for EXT4_FC_TAG_ADD_RANGE. */
39aa75f4d3SHarshad Shirwadkar struct ext4_fc_add_range {
40aa75f4d3SHarshad Shirwadkar __le32 fc_ino;
41aa75f4d3SHarshad Shirwadkar __u8 fc_ex[12];
42aa75f4d3SHarshad Shirwadkar };
43aa75f4d3SHarshad Shirwadkar
44aa75f4d3SHarshad Shirwadkar /* Value structure for tag EXT4_FC_TAG_DEL_RANGE. */
45aa75f4d3SHarshad Shirwadkar struct ext4_fc_del_range {
46aa75f4d3SHarshad Shirwadkar __le32 fc_ino;
47aa75f4d3SHarshad Shirwadkar __le32 fc_lblk;
48aa75f4d3SHarshad Shirwadkar __le32 fc_len;
49aa75f4d3SHarshad Shirwadkar };
50aa75f4d3SHarshad Shirwadkar
51aa75f4d3SHarshad Shirwadkar /*
52aa75f4d3SHarshad Shirwadkar * This is the value structure for tags EXT4_FC_TAG_CREAT, EXT4_FC_TAG_LINK
53aa75f4d3SHarshad Shirwadkar * and EXT4_FC_TAG_UNLINK.
54aa75f4d3SHarshad Shirwadkar */
55aa75f4d3SHarshad Shirwadkar struct ext4_fc_dentry_info {
56aa75f4d3SHarshad Shirwadkar __le32 fc_parent_ino;
57aa75f4d3SHarshad Shirwadkar __le32 fc_ino;
585224f790SGustavo A. R. Silva __u8 fc_dname[];
59aa75f4d3SHarshad Shirwadkar };
60aa75f4d3SHarshad Shirwadkar
61*64b4a25cSEric Biggers /* Value structure for EXT4_FC_TAG_INODE. */
62aa75f4d3SHarshad Shirwadkar struct ext4_fc_inode {
63aa75f4d3SHarshad Shirwadkar __le32 fc_ino;
645224f790SGustavo A. R. Silva __u8 fc_raw_inode[];
65aa75f4d3SHarshad Shirwadkar };
66aa75f4d3SHarshad Shirwadkar
67aa75f4d3SHarshad Shirwadkar /* Value structure for tag EXT4_FC_TAG_TAIL. */
68aa75f4d3SHarshad Shirwadkar struct ext4_fc_tail {
69aa75f4d3SHarshad Shirwadkar __le32 fc_tid;
70aa75f4d3SHarshad Shirwadkar __le32 fc_crc;
71aa75f4d3SHarshad Shirwadkar };
72aa75f4d3SHarshad Shirwadkar
73fdc2a3c7SYe Bin /* Tag base length */
74fdc2a3c7SYe Bin #define EXT4_FC_TAG_BASE_LEN (sizeof(struct ext4_fc_tl))
75fdc2a3c7SYe Bin
76aa75f4d3SHarshad Shirwadkar /*
770915e464SHarshad Shirwadkar * Fast commit status codes
78aa75f4d3SHarshad Shirwadkar */
79aa75f4d3SHarshad Shirwadkar enum {
800915e464SHarshad Shirwadkar EXT4_FC_STATUS_OK = 0,
810915e464SHarshad Shirwadkar EXT4_FC_STATUS_INELIGIBLE,
820915e464SHarshad Shirwadkar EXT4_FC_STATUS_SKIPPED,
830915e464SHarshad Shirwadkar EXT4_FC_STATUS_FAILED,
840915e464SHarshad Shirwadkar };
85aa75f4d3SHarshad Shirwadkar
86aa75f4d3SHarshad Shirwadkar /*
87aa75f4d3SHarshad Shirwadkar * Fast commit ineligiblity reasons:
88aa75f4d3SHarshad Shirwadkar */
890915e464SHarshad Shirwadkar enum {
90aa75f4d3SHarshad Shirwadkar EXT4_FC_REASON_XATTR = 0,
91aa75f4d3SHarshad Shirwadkar EXT4_FC_REASON_CROSS_RENAME,
92aa75f4d3SHarshad Shirwadkar EXT4_FC_REASON_JOURNAL_FLAG_CHANGE,
93b21ebf14SHarshad Shirwadkar EXT4_FC_REASON_NOMEM,
94aa75f4d3SHarshad Shirwadkar EXT4_FC_REASON_SWAP_BOOT,
95aa75f4d3SHarshad Shirwadkar EXT4_FC_REASON_RESIZE,
96aa75f4d3SHarshad Shirwadkar EXT4_FC_REASON_RENAME_DIR,
97aa75f4d3SHarshad Shirwadkar EXT4_FC_REASON_FALLOC_RANGE,
98556e0319SHarshad Shirwadkar EXT4_FC_REASON_INODE_JOURNAL_DATA,
990fbcb525SEric Biggers EXT4_FC_REASON_ENCRYPTED_FILENAME,
100aa75f4d3SHarshad Shirwadkar EXT4_FC_REASON_MAX
101aa75f4d3SHarshad Shirwadkar };
102aa75f4d3SHarshad Shirwadkar
103941ba122SHarshad Shirwadkar #ifdef __KERNEL__
104941ba122SHarshad Shirwadkar /*
105941ba122SHarshad Shirwadkar * In memory list of dentry updates that are performed on the file
106941ba122SHarshad Shirwadkar * system used by fast commit code.
107941ba122SHarshad Shirwadkar */
108941ba122SHarshad Shirwadkar struct ext4_fc_dentry_update {
109941ba122SHarshad Shirwadkar int fcd_op; /* Type of update create / unlink / link */
110941ba122SHarshad Shirwadkar int fcd_parent; /* Parent inode number */
111941ba122SHarshad Shirwadkar int fcd_ino; /* Inode number */
112941ba122SHarshad Shirwadkar struct qstr fcd_name; /* Dirent name */
113941ba122SHarshad Shirwadkar unsigned char fcd_iname[DNAME_INLINE_LEN]; /* Dirent name string */
114941ba122SHarshad Shirwadkar struct list_head fcd_list;
115b3998b3bSRitesh Harjani struct list_head fcd_dilist;
116941ba122SHarshad Shirwadkar };
117941ba122SHarshad Shirwadkar
118aa75f4d3SHarshad Shirwadkar struct ext4_fc_stats {
119aa75f4d3SHarshad Shirwadkar unsigned int fc_ineligible_reason_count[EXT4_FC_REASON_MAX];
120aa75f4d3SHarshad Shirwadkar unsigned long fc_num_commits;
121aa75f4d3SHarshad Shirwadkar unsigned long fc_ineligible_commits;
1220915e464SHarshad Shirwadkar unsigned long fc_failed_commits;
1230915e464SHarshad Shirwadkar unsigned long fc_skipped_commits;
124aa75f4d3SHarshad Shirwadkar unsigned long fc_numblks;
1250915e464SHarshad Shirwadkar u64 s_fc_avg_commit_time;
126aa75f4d3SHarshad Shirwadkar };
127aa75f4d3SHarshad Shirwadkar
1288016e29fSHarshad Shirwadkar #define EXT4_FC_REPLAY_REALLOC_INCREMENT 4
1298016e29fSHarshad Shirwadkar
1308016e29fSHarshad Shirwadkar /*
1318016e29fSHarshad Shirwadkar * Physical block regions added to different inodes due to fast commit
1328016e29fSHarshad Shirwadkar * recovery. These are set during the SCAN phase. During the replay phase,
1338016e29fSHarshad Shirwadkar * our allocator excludes these from its allocation. This ensures that
1348016e29fSHarshad Shirwadkar * we don't accidentally allocating a block that is going to be used by
1358016e29fSHarshad Shirwadkar * another inode.
1368016e29fSHarshad Shirwadkar */
1378016e29fSHarshad Shirwadkar struct ext4_fc_alloc_region {
1388016e29fSHarshad Shirwadkar ext4_lblk_t lblk;
1398016e29fSHarshad Shirwadkar ext4_fsblk_t pblk;
1408016e29fSHarshad Shirwadkar int ino, len;
1418016e29fSHarshad Shirwadkar };
1428016e29fSHarshad Shirwadkar
1438016e29fSHarshad Shirwadkar /*
1448016e29fSHarshad Shirwadkar * Fast commit replay state.
1458016e29fSHarshad Shirwadkar */
1468016e29fSHarshad Shirwadkar struct ext4_fc_replay_state {
1478016e29fSHarshad Shirwadkar int fc_replay_num_tags;
1488016e29fSHarshad Shirwadkar int fc_replay_expected_off;
1498016e29fSHarshad Shirwadkar int fc_current_pass;
1508016e29fSHarshad Shirwadkar int fc_cur_tag;
1518016e29fSHarshad Shirwadkar int fc_crc;
1528016e29fSHarshad Shirwadkar struct ext4_fc_alloc_region *fc_regions;
1538016e29fSHarshad Shirwadkar int fc_regions_size, fc_regions_used, fc_regions_valid;
1548016e29fSHarshad Shirwadkar int *fc_modified_inodes;
1558016e29fSHarshad Shirwadkar int fc_modified_inodes_used, fc_modified_inodes_size;
1568016e29fSHarshad Shirwadkar };
1578016e29fSHarshad Shirwadkar
1588016e29fSHarshad Shirwadkar #define region_last(__region) (((__region)->lblk) + ((__region)->len) - 1)
159941ba122SHarshad Shirwadkar #endif
1608016e29fSHarshad Shirwadkar
tag2str(__u16 tag)161941ba122SHarshad Shirwadkar static inline const char *tag2str(__u16 tag)
162941ba122SHarshad Shirwadkar {
163941ba122SHarshad Shirwadkar switch (tag) {
164941ba122SHarshad Shirwadkar case EXT4_FC_TAG_LINK:
165941ba122SHarshad Shirwadkar return "ADD_ENTRY";
166941ba122SHarshad Shirwadkar case EXT4_FC_TAG_UNLINK:
167941ba122SHarshad Shirwadkar return "DEL_ENTRY";
168941ba122SHarshad Shirwadkar case EXT4_FC_TAG_ADD_RANGE:
169941ba122SHarshad Shirwadkar return "ADD_RANGE";
170941ba122SHarshad Shirwadkar case EXT4_FC_TAG_CREAT:
171941ba122SHarshad Shirwadkar return "CREAT_DENTRY";
172941ba122SHarshad Shirwadkar case EXT4_FC_TAG_DEL_RANGE:
173941ba122SHarshad Shirwadkar return "DEL_RANGE";
174941ba122SHarshad Shirwadkar case EXT4_FC_TAG_INODE:
175941ba122SHarshad Shirwadkar return "INODE";
176941ba122SHarshad Shirwadkar case EXT4_FC_TAG_PAD:
177941ba122SHarshad Shirwadkar return "PAD";
178941ba122SHarshad Shirwadkar case EXT4_FC_TAG_TAIL:
179941ba122SHarshad Shirwadkar return "TAIL";
180941ba122SHarshad Shirwadkar case EXT4_FC_TAG_HEAD:
181941ba122SHarshad Shirwadkar return "HEAD";
182941ba122SHarshad Shirwadkar default:
183941ba122SHarshad Shirwadkar return "ERROR";
184941ba122SHarshad Shirwadkar }
185941ba122SHarshad Shirwadkar }
186941ba122SHarshad Shirwadkar
1876866d7b3SHarshad Shirwadkar #endif /* __FAST_COMMIT_H__ */
188