| 1 |
|
| 2 |
|
| 3 | #ifndef __FAST_COMMIT_H__
|
| 4 | #define __FAST_COMMIT_H__
|
| 5 |
|
| 6 | |
| 7 | * Note this file is present in e2fsprogs/lib/ext2fs/fast_commit.h and
|
| 8 | * linux/fs/ext4/fast_commit.h. These file should always be byte identical.
|
| 9 |
|
| 10 |
|
| 11 |
|
| 12 | #define EXT4_FC_TAG_ADD_RANGE 0x0001
|
| 13 | #define EXT4_FC_TAG_DEL_RANGE 0x0002
|
| 14 | #define EXT4_FC_TAG_CREAT 0x0003
|
| 15 | #define EXT4_FC_TAG_LINK 0x0004
|
| 16 | #define EXT4_FC_TAG_UNLINK 0x0005
|
| 17 | #define EXT4_FC_TAG_INODE 0x0006
|
| 18 | #define EXT4_FC_TAG_PAD 0x0007
|
| 19 | #define EXT4_FC_TAG_TAIL 0x0008
|
| 20 | #define EXT4_FC_TAG_HEAD 0x0009
|
| 21 |
|
| 22 | #define EXT4_FC_SUPPORTED_FEATURES 0x0
|
| 23 |
|
| 24 |
|
| 25 |
|
| 26 |
|
| 27 | struct ext4_fc_tl {
|
| 28 | __le16 fc_tag;
|
| 29 | __le16 fc_len;
|
| 30 | };
|
| 31 |
|
| 32 |
|
| 33 | struct ext4_fc_head {
|
| 34 | __le32 fc_features;
|
| 35 | __le32 fc_tid;
|
| 36 | };
|
| 37 |
|
| 38 |
|
| 39 | struct ext4_fc_add_range {
|
| 40 | __le32 fc_ino;
|
| 41 | __u8 fc_ex[12];
|
| 42 | };
|
| 43 |
|
| 44 |
|
| 45 | struct ext4_fc_del_range {
|
| 46 | __le32 fc_ino;
|
| 47 | __le32 fc_lblk;
|
| 48 | __le32 fc_len;
|
| 49 | };
|
| 50 |
|
| 51 | |
| 52 | * This is the value structure for tags EXT4_FC_TAG_CREAT, EXT4_FC_TAG_LINK
|
| 53 | * and EXT4_FC_TAG_UNLINK.
|
| 54 |
|
| 55 | struct ext4_fc_dentry_info {
|
| 56 | __le32 fc_parent_ino;
|
| 57 | __le32 fc_ino;
|
| 58 | __u8 fc_dname[];
|
| 59 | };
|
| 60 |
|
| 61 |
|
| 62 | struct ext4_fc_inode {
|
| 63 | __le32 fc_ino;
|
| 64 | __u8 fc_raw_inode[];
|
| 65 | };
|
| 66 |
|
| 67 |
|
| 68 | struct ext4_fc_tail {
|
| 69 | __le32 fc_tid;
|
| 70 | __le32 fc_crc;
|
| 71 | };
|
| 72 |
|
| 73 |
|
| 74 | #define EXT4_FC_TAG_BASE_LEN (sizeof(struct ext4_fc_tl))
|
| 75 |
|
| 76 | |
| 77 | * Fast commit status codes
|
| 78 |
|
| 79 | enum {
|
| 80 | EXT4_FC_STATUS_OK = 0,
|
| 81 | EXT4_FC_STATUS_INELIGIBLE,
|
| 82 | EXT4_FC_STATUS_SKIPPED,
|
| 83 | EXT4_FC_STATUS_FAILED,
|
| 84 | };
|
| 85 |
|
| 86 | |
| 87 | * Fast commit ineligiblity reasons:
|
| 88 |
|
| 89 | enum {
|
| 90 | EXT4_FC_REASON_XATTR = 0,
|
| 91 | EXT4_FC_REASON_CROSS_RENAME,
|
| 92 | EXT4_FC_REASON_JOURNAL_FLAG_CHANGE,
|
| 93 | EXT4_FC_REASON_NOMEM,
|
| 94 | EXT4_FC_REASON_SWAP_BOOT,
|
| 95 | EXT4_FC_REASON_RESIZE,
|
| 96 | EXT4_FC_REASON_RENAME_DIR,
|
| 97 | EXT4_FC_REASON_FALLOC_RANGE,
|
| 98 | EXT4_FC_REASON_INODE_JOURNAL_DATA,
|
| 99 | EXT4_FC_REASON_ENCRYPTED_FILENAME,
|
| 100 | EXT4_FC_REASON_MIGRATE,
|
| 101 | EXT4_FC_REASON_VERITY,
|
| 102 | EXT4_FC_REASON_MOVE_EXT,
|
| 103 | EXT4_FC_REASON_MAX
|
| 104 | };
|
| 105 |
|
| 106 | #ifdef __KERNEL__
|
| 107 | |
| 108 | * In memory list of dentry updates that are performed on the file
|
| 109 | * system used by fast commit code.
|
| 110 |
|
| 111 | struct ext4_fc_dentry_update {
|
| 112 | int fcd_op;
|
| 113 | int fcd_parent;
|
| 114 | int fcd_ino;
|
| 115 | struct name_snapshot fcd_name;
|
| 116 | struct list_head fcd_list;
|
| 117 | struct list_head fcd_dilist;
|
| 118 | };
|
| 119 |
|
| 120 | struct ext4_fc_stats {
|
| 121 | unsigned int fc_ineligible_reason_count[EXT4_FC_REASON_MAX];
|
| 122 | unsigned long fc_num_commits;
|
| 123 | unsigned long fc_ineligible_commits;
|
| 124 | unsigned long fc_failed_commits;
|
| 125 | unsigned long fc_skipped_commits;
|
| 126 | unsigned long fc_numblks;
|
| 127 | u64 s_fc_avg_commit_time;
|
| 128 | };
|
| 129 |
|
| 130 | #define EXT4_FC_REPLAY_REALLOC_INCREMENT 4
|
| 131 |
|
| 132 | |
| 133 | * Physical block regions added to different inodes due to fast commit
|
| 134 | * recovery. These are set during the SCAN phase. During the replay phase,
|
| 135 | * our allocator excludes these from its allocation. This ensures that
|
| 136 | * we don't accidentally allocating a block that is going to be used by
|
| 137 | * another inode.
|
| 138 |
|
| 139 | struct ext4_fc_alloc_region {
|
| 140 | ext4_lblk_t lblk;
|
| 141 | ext4_fsblk_t pblk;
|
| 142 | int ino, len;
|
| 143 | };
|
| 144 |
|
| 145 | |
| 146 | * Fast commit replay state.
|
| 147 |
|
| 148 | struct ext4_fc_replay_state {
|
| 149 | int fc_replay_num_tags;
|
| 150 | int fc_replay_expected_off;
|
| 151 | int fc_current_pass;
|
| 152 | int fc_cur_tag;
|
| 153 | int fc_crc;
|
| 154 | struct ext4_fc_alloc_region *fc_regions;
|
| 155 | int fc_regions_size, fc_regions_used, fc_regions_valid;
|
| 156 | int *fc_modified_inodes;
|
| 157 | int fc_modified_inodes_used, fc_modified_inodes_size;
|
| 158 | };
|
| 159 |
|
| 160 | #define region_last(__region) (((__region)->lblk) + ((__region)->len) - 1)
|
| 161 | #endif
|
| 162 |
|
| 163 | static inline const char *tag2str(__u16 tag)
|
| 164 | {
|
| 165 | switch (tag) {
|
| 166 | case EXT4_FC_TAG_LINK:
|
| 167 | return "ADD_ENTRY";
|
| 168 | case EXT4_FC_TAG_UNLINK:
|
| 169 | return "DEL_ENTRY";
|
| 170 | case EXT4_FC_TAG_ADD_RANGE:
|
| 171 | return "ADD_RANGE";
|
| 172 | case EXT4_FC_TAG_CREAT:
|
| 173 | return "CREAT_DENTRY";
|
| 174 | case EXT4_FC_TAG_DEL_RANGE:
|
| 175 | return "DEL_RANGE";
|
| 176 | case EXT4_FC_TAG_INODE:
|
| 177 | return "INODE";
|
| 178 | case EXT4_FC_TAG_PAD:
|
| 179 | return "PAD";
|
| 180 | case EXT4_FC_TAG_TAIL:
|
| 181 | return "TAIL";
|
| 182 | case EXT4_FC_TAG_HEAD:
|
| 183 | return "HEAD";
|
| 184 | default:
|
| 185 | return "ERROR";
|
| 186 | }
|
| 187 | }
|
| 188 |
|
| 189 | #endif
|