aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jbd2/recovery.c
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@us.ibm.com>2012-05-27 08:12:12 -0400
committerTheodore Ts'o <tytso@mit.edu>2012-05-27 08:12:12 -0400
commitc390087591dcbecd244c31d979ccdad49ae83364 (patch)
treec3ccbd028cb7970070114a8b0f45adfbebb113cb /fs/jbd2/recovery.c
parent1f56c5890e3e815c6f4eabfc87a8a81f439b6f3d (diff)
jbd2: checksum data blocks that are stored in the journal
Calculate and verify checksums of each data block being stored in the journal. Signed-off-by: Darrick J. Wong <djwong@us.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/jbd2/recovery.c')
-rw-r--r--fs/jbd2/recovery.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c
index df4a20e7d854..0131e4362534 100644
--- a/fs/jbd2/recovery.c
+++ b/fs/jbd2/recovery.c
@@ -393,6 +393,23 @@ static int jbd2_commit_block_csum_verify(journal_t *j, void *buf)
393 return provided == calculated; 393 return provided == calculated;
394} 394}
395 395
396static int jbd2_block_tag_csum_verify(journal_t *j, journal_block_tag_t *tag,
397 void *buf, __u32 sequence)
398{
399 __u32 provided, calculated;
400
401 if (!JBD2_HAS_INCOMPAT_FEATURE(j, JBD2_FEATURE_INCOMPAT_CSUM_V2))
402 return 1;
403
404 sequence = cpu_to_be32(sequence);
405 calculated = jbd2_chksum(j, j->j_csum_seed, (__u8 *)&sequence,
406 sizeof(sequence));
407 calculated = jbd2_chksum(j, calculated, buf, j->j_blocksize);
408 provided = be32_to_cpu(tag->t_checksum);
409
410 return provided == cpu_to_be32(calculated);
411}
412
396static int do_one_pass(journal_t *journal, 413static int do_one_pass(journal_t *journal,
397 struct recovery_info *info, enum passtype pass) 414 struct recovery_info *info, enum passtype pass)
398{ 415{
@@ -569,6 +586,19 @@ static int do_one_pass(journal_t *journal,
569 goto skip_write; 586 goto skip_write;
570 } 587 }
571 588
589 /* Look for block corruption */
590 if (!jbd2_block_tag_csum_verify(
591 journal, tag, obh->b_data,
592 be32_to_cpu(tmp->h_sequence))) {
593 brelse(obh);
594 success = -EIO;
595 printk(KERN_ERR "JBD: Invalid "
596 "checksum recovering "
597 "block %llu in log\n",
598 blocknr);
599 continue;
600 }
601
572 /* Find a buffer for the new 602 /* Find a buffer for the new
573 * data being restored */ 603 * data being restored */
574 nbh = __getblk(journal->j_fs_dev, 604 nbh = __getblk(journal->j_fs_dev,