Commit 1101cd4d authored by Jan Kara's avatar Jan Kara Committed by Theodore Ts'o

jbd2: unify revoke and tag block checksum handling

Revoke and tag descriptor blocks are just different kinds of descriptor
blocks and thus have checksum in the same place. Unify computation and
checking of checksums for these.
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 32ab6715
...@@ -317,22 +317,6 @@ static void write_tag_block(journal_t *j, journal_block_tag_t *tag, ...@@ -317,22 +317,6 @@ static void write_tag_block(journal_t *j, journal_block_tag_t *tag,
tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1); tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1);
} }
static void jbd2_descr_block_csum_set(journal_t *j,
struct buffer_head *bh)
{
struct jbd2_journal_block_tail *tail;
__u32 csum;
if (!jbd2_journal_has_csum_v2or3(j))
return;
tail = (struct jbd2_journal_block_tail *)(bh->b_data + j->j_blocksize -
sizeof(struct jbd2_journal_block_tail));
tail->t_checksum = 0;
csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
tail->t_checksum = cpu_to_be32(csum);
}
static void jbd2_block_tag_csum_set(journal_t *j, journal_block_tag_t *tag, static void jbd2_block_tag_csum_set(journal_t *j, journal_block_tag_t *tag,
struct buffer_head *bh, __u32 sequence) struct buffer_head *bh, __u32 sequence)
{ {
...@@ -714,7 +698,7 @@ void jbd2_journal_commit_transaction(journal_t *journal) ...@@ -714,7 +698,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG); tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG);
jbd2_descr_block_csum_set(journal, descriptor); jbd2_descriptor_block_csum_set(journal, descriptor);
start_journal_io: start_journal_io:
for (i = 0; i < bufs; i++) { for (i = 0; i < bufs; i++) {
struct buffer_head *bh = wbuf[i]; struct buffer_head *bh = wbuf[i];
......
...@@ -834,6 +834,21 @@ jbd2_journal_get_descriptor_buffer(transaction_t *transaction, int type) ...@@ -834,6 +834,21 @@ jbd2_journal_get_descriptor_buffer(transaction_t *transaction, int type)
return bh; return bh;
} }
void jbd2_descriptor_block_csum_set(journal_t *j, struct buffer_head *bh)
{
struct jbd2_journal_block_tail *tail;
__u32 csum;
if (!jbd2_journal_has_csum_v2or3(j))
return;
tail = (struct jbd2_journal_block_tail *)(bh->b_data + j->j_blocksize -
sizeof(struct jbd2_journal_block_tail));
tail->t_checksum = 0;
csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
tail->t_checksum = cpu_to_be32(csum);
}
/* /*
* Return tid of the oldest transaction in the journal and block in the journal * Return tid of the oldest transaction in the journal and block in the journal
* where the transaction starts. * where the transaction starts.
......
...@@ -174,8 +174,7 @@ static int jread(struct buffer_head **bhp, journal_t *journal, ...@@ -174,8 +174,7 @@ static int jread(struct buffer_head **bhp, journal_t *journal,
return 0; return 0;
} }
static int jbd2_descr_block_csum_verify(journal_t *j, static int jbd2_descriptor_block_csum_verify(journal_t *j, void *buf)
void *buf)
{ {
struct jbd2_journal_block_tail *tail; struct jbd2_journal_block_tail *tail;
__be32 provided; __be32 provided;
...@@ -522,7 +521,7 @@ static int do_one_pass(journal_t *journal, ...@@ -522,7 +521,7 @@ static int do_one_pass(journal_t *journal,
descr_csum_size = descr_csum_size =
sizeof(struct jbd2_journal_block_tail); sizeof(struct jbd2_journal_block_tail);
if (descr_csum_size > 0 && if (descr_csum_size > 0 &&
!jbd2_descr_block_csum_verify(journal, !jbd2_descriptor_block_csum_verify(journal,
bh->b_data)) { bh->b_data)) {
printk(KERN_ERR "JBD2: Invalid checksum " printk(KERN_ERR "JBD2: Invalid checksum "
"recovering block %lu in log\n", "recovering block %lu in log\n",
...@@ -811,26 +810,6 @@ static int do_one_pass(journal_t *journal, ...@@ -811,26 +810,6 @@ static int do_one_pass(journal_t *journal,
return err; return err;
} }
static int jbd2_revoke_block_csum_verify(journal_t *j,
void *buf)
{
struct jbd2_journal_revoke_tail *tail;
__be32 provided;
__u32 calculated;
if (!jbd2_journal_has_csum_v2or3(j))
return 1;
tail = (struct jbd2_journal_revoke_tail *)(buf + j->j_blocksize -
sizeof(struct jbd2_journal_revoke_tail));
provided = tail->r_checksum;
tail->r_checksum = 0;
calculated = jbd2_chksum(j, j->j_csum_seed, buf, j->j_blocksize);
tail->r_checksum = provided;
return provided == cpu_to_be32(calculated);
}
/* Scan a revoke record, marking all blocks mentioned as revoked. */ /* Scan a revoke record, marking all blocks mentioned as revoked. */
static int scan_revoke_records(journal_t *journal, struct buffer_head *bh, static int scan_revoke_records(journal_t *journal, struct buffer_head *bh,
...@@ -846,11 +825,11 @@ static int scan_revoke_records(journal_t *journal, struct buffer_head *bh, ...@@ -846,11 +825,11 @@ static int scan_revoke_records(journal_t *journal, struct buffer_head *bh,
offset = sizeof(jbd2_journal_revoke_header_t); offset = sizeof(jbd2_journal_revoke_header_t);
rcount = be32_to_cpu(header->r_count); rcount = be32_to_cpu(header->r_count);
if (!jbd2_revoke_block_csum_verify(journal, header)) if (!jbd2_descriptor_block_csum_verify(journal, header))
return -EFSBADCRC; return -EFSBADCRC;
if (jbd2_journal_has_csum_v2or3(journal)) if (jbd2_journal_has_csum_v2or3(journal))
csum_size = sizeof(struct jbd2_journal_revoke_tail); csum_size = sizeof(struct jbd2_journal_block_tail);
if (rcount > journal->j_blocksize - csum_size) if (rcount > journal->j_blocksize - csum_size)
return -EINVAL; return -EINVAL;
max = rcount; max = rcount;
......
...@@ -583,7 +583,7 @@ static void write_one_revoke_record(transaction_t *transaction, ...@@ -583,7 +583,7 @@ static void write_one_revoke_record(transaction_t *transaction,
/* Do we need to leave space at the end for a checksum? */ /* Do we need to leave space at the end for a checksum? */
if (jbd2_journal_has_csum_v2or3(journal)) if (jbd2_journal_has_csum_v2or3(journal))
csum_size = sizeof(struct jbd2_journal_revoke_tail); csum_size = sizeof(struct jbd2_journal_block_tail);
if (jbd2_has_feature_64bit(journal)) if (jbd2_has_feature_64bit(journal))
sz = 8; sz = 8;
...@@ -623,21 +623,6 @@ static void write_one_revoke_record(transaction_t *transaction, ...@@ -623,21 +623,6 @@ static void write_one_revoke_record(transaction_t *transaction,
*offsetp = offset; *offsetp = offset;
} }
static void jbd2_revoke_csum_set(journal_t *j, struct buffer_head *bh)
{
struct jbd2_journal_revoke_tail *tail;
__u32 csum;
if (!jbd2_journal_has_csum_v2or3(j))
return;
tail = (struct jbd2_journal_revoke_tail *)(bh->b_data + j->j_blocksize -
sizeof(struct jbd2_journal_revoke_tail));
tail->r_checksum = 0;
csum = jbd2_chksum(j, j->j_csum_seed, bh->b_data, j->j_blocksize);
tail->r_checksum = cpu_to_be32(csum);
}
/* /*
* Flush a revoke descriptor out to the journal. If we are aborting, * Flush a revoke descriptor out to the journal. If we are aborting,
* this is a noop; otherwise we are generating a buffer which needs to * this is a noop; otherwise we are generating a buffer which needs to
...@@ -658,7 +643,7 @@ static void flush_descriptor(journal_t *journal, ...@@ -658,7 +643,7 @@ static void flush_descriptor(journal_t *journal,
header = (jbd2_journal_revoke_header_t *)descriptor->b_data; header = (jbd2_journal_revoke_header_t *)descriptor->b_data;
header->r_count = cpu_to_be32(offset); header->r_count = cpu_to_be32(offset);
jbd2_revoke_csum_set(journal, descriptor); jbd2_descriptor_block_csum_set(journal, descriptor);
set_buffer_jwrite(descriptor); set_buffer_jwrite(descriptor);
BUFFER_TRACE(descriptor, "write"); BUFFER_TRACE(descriptor, "write");
......
...@@ -200,7 +200,7 @@ typedef struct journal_block_tag_s ...@@ -200,7 +200,7 @@ typedef struct journal_block_tag_s
__be32 t_blocknr_high; /* most-significant high 32bits. */ __be32 t_blocknr_high; /* most-significant high 32bits. */
} journal_block_tag_t; } journal_block_tag_t;
/* Tail of descriptor block, for checksumming */ /* Tail of descriptor or revoke block, for checksumming */
struct jbd2_journal_block_tail { struct jbd2_journal_block_tail {
__be32 t_checksum; /* crc32c(uuid+descr_block) */ __be32 t_checksum; /* crc32c(uuid+descr_block) */
}; };
...@@ -215,11 +215,6 @@ typedef struct jbd2_journal_revoke_header_s ...@@ -215,11 +215,6 @@ 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 */
#define JBD2_FLAG_SAME_UUID 2 /* block has same uuid as previous */ #define JBD2_FLAG_SAME_UUID 2 /* block has same uuid as previous */
...@@ -1138,6 +1133,7 @@ static inline void jbd2_unfile_log_bh(struct buffer_head *bh) ...@@ -1138,6 +1133,7 @@ static inline void jbd2_unfile_log_bh(struct buffer_head *bh)
/* Log buffer allocation */ /* Log buffer allocation */
struct buffer_head *jbd2_journal_get_descriptor_buffer(transaction_t *, int); struct buffer_head *jbd2_journal_get_descriptor_buffer(transaction_t *, int);
void jbd2_descriptor_block_csum_set(journal_t *, struct buffer_head *);
int jbd2_journal_next_log_block(journal_t *, unsigned long long *); int jbd2_journal_next_log_block(journal_t *, unsigned long long *);
int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid, int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid,
unsigned long *block); unsigned long *block);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment