diff options
Diffstat (limited to 'fs/nilfs2/recovery.c')
| -rw-r--r-- | fs/nilfs2/recovery.c | 41 |
1 files changed, 11 insertions, 30 deletions
diff --git a/fs/nilfs2/recovery.c b/fs/nilfs2/recovery.c index c9c96c7825dc..017bedc761a0 100644 --- a/fs/nilfs2/recovery.c +++ b/fs/nilfs2/recovery.c | |||
| @@ -39,7 +39,6 @@ enum { | |||
| 39 | NILFS_SEG_FAIL_IO, | 39 | NILFS_SEG_FAIL_IO, |
| 40 | NILFS_SEG_FAIL_MAGIC, | 40 | NILFS_SEG_FAIL_MAGIC, |
| 41 | NILFS_SEG_FAIL_SEQ, | 41 | NILFS_SEG_FAIL_SEQ, |
| 42 | NILFS_SEG_FAIL_CHECKSUM_SEGSUM, | ||
| 43 | NILFS_SEG_FAIL_CHECKSUM_SUPER_ROOT, | 42 | NILFS_SEG_FAIL_CHECKSUM_SUPER_ROOT, |
| 44 | NILFS_SEG_FAIL_CHECKSUM_FULL, | 43 | NILFS_SEG_FAIL_CHECKSUM_FULL, |
| 45 | NILFS_SEG_FAIL_CONSISTENCY, | 44 | NILFS_SEG_FAIL_CONSISTENCY, |
| @@ -71,10 +70,6 @@ static int nilfs_warn_segment_error(int err) | |||
| 71 | printk(KERN_WARNING | 70 | printk(KERN_WARNING |
| 72 | "NILFS warning: Sequence number mismatch\n"); | 71 | "NILFS warning: Sequence number mismatch\n"); |
| 73 | break; | 72 | break; |
| 74 | case NILFS_SEG_FAIL_CHECKSUM_SEGSUM: | ||
| 75 | printk(KERN_WARNING | ||
| 76 | "NILFS warning: Checksum error in segment summary\n"); | ||
| 77 | break; | ||
| 78 | case NILFS_SEG_FAIL_CHECKSUM_SUPER_ROOT: | 73 | case NILFS_SEG_FAIL_CHECKSUM_SUPER_ROOT: |
| 79 | printk(KERN_WARNING | 74 | printk(KERN_WARNING |
| 80 | "NILFS warning: Checksum error in super root\n"); | 75 | "NILFS warning: Checksum error in super root\n"); |
| @@ -206,19 +201,15 @@ int nilfs_read_super_root_block(struct super_block *sb, sector_t sr_block, | |||
| 206 | * @pseg_start: start disk block number of partial segment | 201 | * @pseg_start: start disk block number of partial segment |
| 207 | * @seg_seq: sequence number requested | 202 | * @seg_seq: sequence number requested |
| 208 | * @ssi: pointer to nilfs_segsum_info struct to store information | 203 | * @ssi: pointer to nilfs_segsum_info struct to store information |
| 209 | * @full_check: full check flag | ||
| 210 | * (0: only checks segment summary CRC, 1: data CRC) | ||
| 211 | */ | 204 | */ |
| 212 | static int | 205 | static int |
| 213 | load_segment_summary(struct nilfs_sb_info *sbi, sector_t pseg_start, | 206 | load_segment_summary(struct nilfs_sb_info *sbi, sector_t pseg_start, |
| 214 | u64 seg_seq, struct nilfs_segsum_info *ssi, | 207 | u64 seg_seq, struct nilfs_segsum_info *ssi) |
| 215 | int full_check) | ||
| 216 | { | 208 | { |
| 217 | struct buffer_head *bh_sum; | 209 | struct buffer_head *bh_sum; |
| 218 | struct nilfs_segment_summary *sum; | 210 | struct nilfs_segment_summary *sum; |
| 219 | unsigned long offset, nblock; | 211 | unsigned long nblock; |
| 220 | u64 check_bytes; | 212 | u32 crc; |
| 221 | u32 crc, crc_sum; | ||
| 222 | int ret = NILFS_SEG_FAIL_IO; | 213 | int ret = NILFS_SEG_FAIL_IO; |
| 223 | 214 | ||
| 224 | bh_sum = sb_bread(sbi->s_super, pseg_start); | 215 | bh_sum = sb_bread(sbi->s_super, pseg_start); |
| @@ -237,34 +228,24 @@ load_segment_summary(struct nilfs_sb_info *sbi, sector_t pseg_start, | |||
| 237 | ret = NILFS_SEG_FAIL_SEQ; | 228 | ret = NILFS_SEG_FAIL_SEQ; |
| 238 | goto failed; | 229 | goto failed; |
| 239 | } | 230 | } |
| 240 | if (full_check) { | ||
| 241 | offset = sizeof(sum->ss_datasum); | ||
| 242 | check_bytes = | ||
| 243 | ((u64)ssi->nblocks << sbi->s_super->s_blocksize_bits); | ||
| 244 | nblock = ssi->nblocks; | ||
| 245 | crc_sum = le32_to_cpu(sum->ss_datasum); | ||
| 246 | ret = NILFS_SEG_FAIL_CHECKSUM_FULL; | ||
| 247 | } else { /* only checks segment summary */ | ||
| 248 | offset = sizeof(sum->ss_datasum) + sizeof(sum->ss_sumsum); | ||
| 249 | check_bytes = ssi->sumbytes; | ||
| 250 | nblock = ssi->nsumblk; | ||
| 251 | crc_sum = le32_to_cpu(sum->ss_sumsum); | ||
| 252 | ret = NILFS_SEG_FAIL_CHECKSUM_SEGSUM; | ||
| 253 | } | ||
| 254 | 231 | ||
| 232 | nblock = ssi->nblocks; | ||
| 255 | if (unlikely(nblock == 0 || | 233 | if (unlikely(nblock == 0 || |
| 256 | nblock > sbi->s_nilfs->ns_blocks_per_segment)) { | 234 | nblock > sbi->s_nilfs->ns_blocks_per_segment)) { |
| 257 | /* This limits the number of blocks read in the CRC check */ | 235 | /* This limits the number of blocks read in the CRC check */ |
| 258 | ret = NILFS_SEG_FAIL_CONSISTENCY; | 236 | ret = NILFS_SEG_FAIL_CONSISTENCY; |
| 259 | goto failed; | 237 | goto failed; |
| 260 | } | 238 | } |
| 261 | if (calc_crc_cont(sbi, bh_sum, &crc, offset, check_bytes, | 239 | if (calc_crc_cont(sbi, bh_sum, &crc, sizeof(sum->ss_datasum), |
| 240 | ((u64)nblock << sbi->s_super->s_blocksize_bits), | ||
| 262 | pseg_start, nblock)) { | 241 | pseg_start, nblock)) { |
| 263 | ret = NILFS_SEG_FAIL_IO; | 242 | ret = NILFS_SEG_FAIL_IO; |
| 264 | goto failed; | 243 | goto failed; |
| 265 | } | 244 | } |
| 266 | if (crc == crc_sum) | 245 | if (crc == le32_to_cpu(sum->ss_datasum)) |
| 267 | ret = 0; | 246 | ret = 0; |
| 247 | else | ||
| 248 | ret = NILFS_SEG_FAIL_CHECKSUM_FULL; | ||
| 268 | failed: | 249 | failed: |
| 269 | brelse(bh_sum); | 250 | brelse(bh_sum); |
| 270 | out: | 251 | out: |
| @@ -598,7 +579,7 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs, | |||
| 598 | 579 | ||
| 599 | while (segnum != ri->ri_segnum || pseg_start <= ri->ri_pseg_start) { | 580 | while (segnum != ri->ri_segnum || pseg_start <= ri->ri_pseg_start) { |
| 600 | 581 | ||
| 601 | ret = load_segment_summary(sbi, pseg_start, seg_seq, &ssi, 1); | 582 | ret = load_segment_summary(sbi, pseg_start, seg_seq, &ssi); |
| 602 | if (ret) { | 583 | if (ret) { |
| 603 | if (ret == NILFS_SEG_FAIL_IO) { | 584 | if (ret == NILFS_SEG_FAIL_IO) { |
| 604 | err = -EIO; | 585 | err = -EIO; |
| @@ -821,7 +802,7 @@ int nilfs_search_super_root(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi, | |||
| 821 | 802 | ||
| 822 | for (;;) { | 803 | for (;;) { |
| 823 | /* Load segment summary */ | 804 | /* Load segment summary */ |
| 824 | ret = load_segment_summary(sbi, pseg_start, seg_seq, &ssi, 1); | 805 | ret = load_segment_summary(sbi, pseg_start, seg_seq, &ssi); |
| 825 | if (ret) { | 806 | if (ret) { |
| 826 | if (ret == NILFS_SEG_FAIL_IO) | 807 | if (ret == NILFS_SEG_FAIL_IO) |
| 827 | goto failed; | 808 | goto failed; |
