int is_dir, is_leaf;
problem_t problem;
struct ext2_extent_info info;
- int failed_csum;
+ int failed_csum = 0;
+
+ if (pctx->errcode == EXT2_ET_EXTENT_CSUM_INVALID)
+ failed_csum = 1;
pctx->errcode = ext2fs_extent_get_info(ehandle, &info);
if (pctx->errcode)
while ((pctx->errcode == 0 ||
pctx->errcode == EXT2_ET_EXTENT_CSUM_INVALID) &&
info.num_entries-- > 0) {
- failed_csum = 0;
is_leaf = extent.e_flags & EXT2_EXTENT_FLAGS_LEAF;
is_dir = LINUX_S_ISDIR(pctx->inode->i_mode);
last_lblk = extent.e_lblk + extent.e_len - 1;
pctx->num = extent.e_len;
pctx->blkcount = extent.e_lblk + extent.e_len;
- /* Ask to clear a corrupt extent block */
- if (try_repairs &&
- pctx->errcode == EXT2_ET_EXTENT_CSUM_INVALID) {
- problem = PR_1_EXTENT_CSUM_INVALID;
- if (fix_problem(ctx, problem, pctx))
- goto fix_problem_now;
- failed_csum = 1;
- }
-
if (extent.e_pblk == 0 ||
extent.e_pblk < ctx->fs->super->s_first_data_block ||
extent.e_pblk >= ext2fs_blocks_count(ctx->fs->super))
failed_csum = 0;
}
- /* Failed csum but passes checks? Ask to fix checksum. */
- if (try_repairs && failed_csum && problem == 0 &&
- fix_problem(ctx, PR_1_EXTENT_ONLY_CSUM_INVALID, pctx)) {
- pb->inode_modified = 1;
- pctx->errcode = ext2fs_extent_replace(ehandle,
- 0, &extent);
- if (pctx->errcode)
- return;
- }
-
if (try_repairs && problem) {
report_problem:
if (fix_problem(ctx, problem, pctx)) {
pctx->errcode = 0;
break;
}
+ failed_csum = 0;
continue;
}
goto next;
}
pctx->errcode = ext2fs_extent_get(ehandle,
EXT2_EXTENT_DOWN, &extent);
- if (pctx->errcode) {
+ if (pctx->errcode &&
+ pctx->errcode != EXT2_ET_EXTENT_CSUM_INVALID) {
pctx->str = "EXT2_EXTENT_DOWN";
problem = PR_1_EXTENT_HEADER_INVALID;
if (!next_try_repairs)
return;
- if (pctx->errcode ==
- EXT2_ET_EXTENT_HEADER_BAD ||
- pctx->errcode ==
- EXT2_ET_EXTENT_CSUM_INVALID)
+ if (pctx->errcode == EXT2_ET_EXTENT_HEADER_BAD)
goto report_problem;
return;
}
if (pctx->errcode)
goto failed_add_dir_block;
last_lblk = extent.e_lblk + extent.e_len - 1;
+ failed_csum = 0;
}
}
alloc_later:
EXT2_EXTENT_NEXT_SIB,
&extent);
}
+
+ /* Failed csum but passes checks? Ask to fix checksum. */
+ if (failed_csum &&
+ fix_problem(ctx, PR_1_EXTENT_ONLY_CSUM_INVALID, pctx)) {
+ pb->inode_modified = 1;
+ pctx->errcode = ext2fs_extent_replace(ehandle, 0, &extent);
+ if (pctx->errcode)
+ return;
+ }
+
if (pctx->errcode == EXT2_ET_EXTENT_NO_NEXT)
pctx->errcode = 0;
}
N_("@i %i passes checks, but checksum does not match @i. "),
PROMPT_FIX, PR_PREEN_OK },
- /* Inode extent block checksum does not match extent */
- { PR_1_EXTENT_CSUM_INVALID,
- N_("@i %i extent block checksum does not match extent\n\t(logical @b "
- "%c, @n physical @b %b, len %N)\n"),
- PROMPT_CLEAR, 0 },
-
/*
* Inode extent block passes checks, but checksum does not match
* extent
blk64_t blk;
blk64_t end_blk;
int orig_op, op;
+ int failed_csum = 0;
EXT2_CHECK_MAGIC(handle, EXT2_ET_MAGIC_EXTENT_HANDLE);
if (!(handle->fs->flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) &&
!ext2fs_extent_block_csum_verify(handle->fs, handle->ino,
- eh)) {
- handle->level--;
- return EXT2_ET_EXTENT_CSUM_INVALID;
- }
+ eh))
+ failed_csum = 1;
newpath->left = newpath->entries =
ext2fs_le16_to_cpu(eh->eh_entries);
(path->left != 0)))
goto retry;
+ if (failed_csum)
+ return EXT2_ET_EXTENT_CSUM_INVALID;
+
return 0;
}