diff options
author | Darrick J. Wong <djwong@us.ibm.com> | 2012-05-22 22:43:41 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2012-05-22 22:43:41 -0400 |
commit | 8f888ef846d4481e24c74b4a91ece771d2bcbcb5 (patch) | |
tree | bd037514671c52cea95426ba417a6c1b4b59f96a /include/linux/jbd2.h | |
parent | f32aaf2d2b996b14e993da1c23f7ee22ea7333a3 (diff) |
jbd2: change disk layout for metadata checksumming
Define flags and allocate space in on-disk journal structures to support
checksumming of journal metadata.
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'include/linux/jbd2.h')
-rw-r--r-- | include/linux/jbd2.h | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 912c30a8ddb1..809c439066c5 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
@@ -147,12 +147,24 @@ typedef struct journal_header_s | |||
147 | #define JBD2_CRC32_CHKSUM 1 | 147 | #define JBD2_CRC32_CHKSUM 1 |
148 | #define JBD2_MD5_CHKSUM 2 | 148 | #define JBD2_MD5_CHKSUM 2 |
149 | #define JBD2_SHA1_CHKSUM 3 | 149 | #define JBD2_SHA1_CHKSUM 3 |
150 | #define JBD2_CRC32C_CHKSUM 4 | ||
150 | 151 | ||
151 | #define JBD2_CRC32_CHKSUM_SIZE 4 | 152 | #define JBD2_CRC32_CHKSUM_SIZE 4 |
152 | 153 | ||
153 | #define JBD2_CHECKSUM_BYTES (32 / sizeof(u32)) | 154 | #define JBD2_CHECKSUM_BYTES (32 / sizeof(u32)) |
154 | /* | 155 | /* |
155 | * Commit block header for storing transactional checksums: | 156 | * Commit block header for storing transactional checksums: |
157 | * | ||
158 | * NOTE: If FEATURE_COMPAT_CHECKSUM (checksum v1) is set, the h_chksum* | ||
159 | * fields are used to store a checksum of the descriptor and data blocks. | ||
160 | * | ||
161 | * If FEATURE_INCOMPAT_CSUM_V2 (checksum v2) is set, then the h_chksum | ||
162 | * field is used to store crc32c(uuid+commit_block). Each journal metadata | ||
163 | * block gets its own checksum, and data block checksums are stored in | ||
164 | * journal_block_tag (in the descriptor). The other h_chksum* fields are | ||
165 | * not used. | ||
166 | * | ||
167 | * Checksum v1 and v2 are mutually exclusive features. | ||
156 | */ | 168 | */ |
157 | struct commit_header { | 169 | struct commit_header { |
158 | __be32 h_magic; | 170 | __be32 h_magic; |
@@ -175,13 +187,19 @@ struct commit_header { | |||
175 | typedef struct journal_block_tag_s | 187 | typedef struct journal_block_tag_s |
176 | { | 188 | { |
177 | __be32 t_blocknr; /* The on-disk block number */ | 189 | __be32 t_blocknr; /* The on-disk block number */ |
178 | __be32 t_flags; /* See below */ | 190 | __be16 t_checksum; /* truncated crc32c(uuid+seq+block) */ |
191 | __be16 t_flags; /* See below */ | ||
179 | __be32 t_blocknr_high; /* most-significant high 32bits. */ | 192 | __be32 t_blocknr_high; /* most-significant high 32bits. */ |
180 | } journal_block_tag_t; | 193 | } journal_block_tag_t; |
181 | 194 | ||
182 | #define JBD2_TAG_SIZE32 (offsetof(journal_block_tag_t, t_blocknr_high)) | 195 | #define JBD2_TAG_SIZE32 (offsetof(journal_block_tag_t, t_blocknr_high)) |
183 | #define JBD2_TAG_SIZE64 (sizeof(journal_block_tag_t)) | 196 | #define JBD2_TAG_SIZE64 (sizeof(journal_block_tag_t)) |
184 | 197 | ||
198 | /* Tail of descriptor block, for checksumming */ | ||
199 | struct jbd2_journal_block_tail { | ||
200 | __be32 t_checksum; /* crc32c(uuid+descr_block) */ | ||
201 | }; | ||
202 | |||
185 | /* | 203 | /* |
186 | * The revoke descriptor: used on disk to describe a series of blocks to | 204 | * The revoke descriptor: used on disk to describe a series of blocks to |
187 | * be revoked from the log | 205 | * be revoked from the log |
@@ -192,6 +210,10 @@ typedef struct jbd2_journal_revoke_header_s | |||
192 | __be32 r_count; /* Count of bytes used in the block */ | 210 | __be32 r_count; /* Count of bytes used in the block */ |
193 | } jbd2_journal_revoke_header_t; | 211 | } jbd2_journal_revoke_header_t; |
194 | 212 | ||
213 | /* Tail of revoke block, for checksumming */ | ||
214 | struct jbd2_journal_revoke_tail { | ||
215 | __be32 r_checksum; /* crc32c(uuid+revoke_block) */ | ||
216 | }; | ||
195 | 217 | ||
196 | /* Definitions for the journal tag flags word: */ | 218 | /* Definitions for the journal tag flags word: */ |
197 | #define JBD2_FLAG_ESCAPE 1 /* on-disk block is escaped */ | 219 | #define JBD2_FLAG_ESCAPE 1 /* on-disk block is escaped */ |
@@ -241,7 +263,10 @@ typedef struct journal_superblock_s | |||
241 | __be32 s_max_trans_data; /* Limit of data blocks per trans. */ | 263 | __be32 s_max_trans_data; /* Limit of data blocks per trans. */ |
242 | 264 | ||
243 | /* 0x0050 */ | 265 | /* 0x0050 */ |
244 | __u32 s_padding[44]; | 266 | __u8 s_checksum_type; /* checksum type */ |
267 | __u8 s_padding2[3]; | ||
268 | __u32 s_padding[42]; | ||
269 | __be32 s_checksum; /* crc32c(superblock) */ | ||
245 | 270 | ||
246 | /* 0x0100 */ | 271 | /* 0x0100 */ |
247 | __u8 s_users[16*48]; /* ids of all fs'es sharing the log */ | 272 | __u8 s_users[16*48]; /* ids of all fs'es sharing the log */ |
@@ -263,6 +288,7 @@ typedef struct journal_superblock_s | |||
263 | #define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001 | 288 | #define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001 |
264 | #define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002 | 289 | #define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002 |
265 | #define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004 | 290 | #define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004 |
291 | #define JBD2_FEATURE_INCOMPAT_CSUM_V2 0x00000008 | ||
266 | 292 | ||
267 | /* Features known to this kernel version: */ | 293 | /* Features known to this kernel version: */ |
268 | #define JBD2_KNOWN_COMPAT_FEATURES JBD2_FEATURE_COMPAT_CHECKSUM | 294 | #define JBD2_KNOWN_COMPAT_FEATURES JBD2_FEATURE_COMPAT_CHECKSUM |