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>
This commit is contained in:
Darrick J. Wong 2012-05-22 22:43:41 -04:00 committed by Theodore Ts'o
parent f32aaf2d2b
commit 8f888ef846
3 changed files with 33 additions and 7 deletions

View File

@ -627,7 +627,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
tag = (journal_block_tag_t *) tagp; tag = (journal_block_tag_t *) tagp;
write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr); write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
tag->t_flags = cpu_to_be32(tag_flag); tag->t_flags = cpu_to_be16(tag_flag);
tagp += tag_bytes; tagp += tag_bytes;
space_left -= tag_bytes; space_left -= tag_bytes;
@ -651,7 +651,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
submitting the IOs. "tag" still points to submitting the IOs. "tag" still points to
the last tag we set up. */ the last tag we set up. */
tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG); tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG);
start_journal_io: start_journal_io:
for (i = 0; i < bufs; i++) { for (i = 0; i < bufs; i++) {

View File

@ -193,10 +193,10 @@ static int count_tags(journal_t *journal, struct buffer_head *bh)
nr++; nr++;
tagp += tag_bytes; tagp += tag_bytes;
if (!(tag->t_flags & cpu_to_be32(JBD2_FLAG_SAME_UUID))) if (!(tag->t_flags & cpu_to_be16(JBD2_FLAG_SAME_UUID)))
tagp += 16; tagp += 16;
if (tag->t_flags & cpu_to_be32(JBD2_FLAG_LAST_TAG)) if (tag->t_flags & cpu_to_be16(JBD2_FLAG_LAST_TAG))
break; break;
} }
@ -485,7 +485,7 @@ static int do_one_pass(journal_t *journal,
unsigned long io_block; unsigned long io_block;
tag = (journal_block_tag_t *) tagp; tag = (journal_block_tag_t *) tagp;
flags = be32_to_cpu(tag->t_flags); flags = be16_to_cpu(tag->t_flags);
io_block = next_log_block++; io_block = next_log_block++;
wrap(journal, next_log_block); wrap(journal, next_log_block);

View File

@ -147,12 +147,24 @@ typedef struct journal_header_s
#define JBD2_CRC32_CHKSUM 1 #define JBD2_CRC32_CHKSUM 1
#define JBD2_MD5_CHKSUM 2 #define JBD2_MD5_CHKSUM 2
#define JBD2_SHA1_CHKSUM 3 #define JBD2_SHA1_CHKSUM 3
#define JBD2_CRC32C_CHKSUM 4
#define JBD2_CRC32_CHKSUM_SIZE 4 #define JBD2_CRC32_CHKSUM_SIZE 4
#define JBD2_CHECKSUM_BYTES (32 / sizeof(u32)) #define JBD2_CHECKSUM_BYTES (32 / sizeof(u32))
/* /*
* Commit block header for storing transactional checksums: * Commit block header for storing transactional checksums:
*
* NOTE: If FEATURE_COMPAT_CHECKSUM (checksum v1) is set, the h_chksum*
* fields are used to store a checksum of the descriptor and data blocks.
*
* If FEATURE_INCOMPAT_CSUM_V2 (checksum v2) is set, then the h_chksum
* field is used to store crc32c(uuid+commit_block). Each journal metadata
* block gets its own checksum, and data block checksums are stored in
* journal_block_tag (in the descriptor). The other h_chksum* fields are
* not used.
*
* Checksum v1 and v2 are mutually exclusive features.
*/ */
struct commit_header { struct commit_header {
__be32 h_magic; __be32 h_magic;
@ -175,13 +187,19 @@ struct commit_header {
typedef struct journal_block_tag_s typedef struct journal_block_tag_s
{ {
__be32 t_blocknr; /* The on-disk block number */ __be32 t_blocknr; /* The on-disk block number */
__be32 t_flags; /* See below */ __be16 t_checksum; /* truncated crc32c(uuid+seq+block) */
__be16 t_flags; /* See below */
__be32 t_blocknr_high; /* most-significant high 32bits. */ __be32 t_blocknr_high; /* most-significant high 32bits. */
} journal_block_tag_t; } journal_block_tag_t;
#define JBD2_TAG_SIZE32 (offsetof(journal_block_tag_t, t_blocknr_high)) #define JBD2_TAG_SIZE32 (offsetof(journal_block_tag_t, t_blocknr_high))
#define JBD2_TAG_SIZE64 (sizeof(journal_block_tag_t)) #define JBD2_TAG_SIZE64 (sizeof(journal_block_tag_t))
/* Tail of descriptor block, for checksumming */
struct jbd2_journal_block_tail {
__be32 t_checksum; /* crc32c(uuid+descr_block) */
};
/* /*
* The revoke descriptor: used on disk to describe a series of blocks to * The revoke descriptor: used on disk to describe a series of blocks to
* be revoked from the log * be revoked from the log
@ -192,6 +210,10 @@ typedef struct jbd2_journal_revoke_header_s
__be32 r_count; /* Count of bytes used in the block */ __be32 r_count; /* Count of bytes used in the block */
} jbd2_journal_revoke_header_t; } jbd2_journal_revoke_header_t;
/* Tail of revoke block, for checksumming */
struct jbd2_journal_revoke_tail {
__be32 r_checksum; /* crc32c(uuid+revoke_block) */
};
/* Definitions for the journal tag flags word: */ /* Definitions for the journal tag flags word: */
#define JBD2_FLAG_ESCAPE 1 /* on-disk block is escaped */ #define JBD2_FLAG_ESCAPE 1 /* on-disk block is escaped */
@ -241,7 +263,10 @@ typedef struct journal_superblock_s
__be32 s_max_trans_data; /* Limit of data blocks per trans. */ __be32 s_max_trans_data; /* Limit of data blocks per trans. */
/* 0x0050 */ /* 0x0050 */
__u32 s_padding[44]; __u8 s_checksum_type; /* checksum type */
__u8 s_padding2[3];
__u32 s_padding[42];
__be32 s_checksum; /* crc32c(superblock) */
/* 0x0100 */ /* 0x0100 */
__u8 s_users[16*48]; /* ids of all fs'es sharing the log */ __u8 s_users[16*48]; /* ids of all fs'es sharing the log */
@ -263,6 +288,7 @@ typedef struct journal_superblock_s
#define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001 #define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001
#define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002 #define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002
#define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004 #define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004
#define JBD2_FEATURE_INCOMPAT_CSUM_V2 0x00000008
/* Features known to this kernel version: */ /* Features known to this kernel version: */
#define JBD2_KNOWN_COMPAT_FEATURES JBD2_FEATURE_COMPAT_CHECKSUM #define JBD2_KNOWN_COMPAT_FEATURES JBD2_FEATURE_COMPAT_CHECKSUM