xref: /openbmc/linux/fs/ext4/fast_commit.h (revision 64b4a25c)
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