e2fsck: check inline directory data "block" first

Since the inline data flag will cause the extent/block map iteration
code to abort fsck early, move the test for the inode flag and the
actual block check call further forward in check_blocks.  This
eliminates an e2fsck abort on an inline data symlink when the file ACL
block is set.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
crypto
Darrick J. Wong 2014-08-10 18:39:47 -04:00 committed by Theodore Ts'o
parent 04af897878
commit 68073429d3
1 changed files with 3 additions and 5 deletions

View File

@ -2620,7 +2620,9 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
pb.num_blocks++;
}
if (ext2fs_inode_has_valid_blocks2(fs, inode)) {
if (inlinedata_fs && (inode->i_flags & EXT4_INLINE_DATA_FL))
check_blocks_inline_data(ctx, pctx, &pb);
else if (ext2fs_inode_has_valid_blocks2(fs, inode)) {
if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL))
check_blocks_extents(ctx, pctx, &pb);
else {
@ -2656,10 +2658,6 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
fs->flags = (flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) |
(fs->flags & ~EXT2_FLAG_IGNORE_CSUM_ERRORS);
}
} else {
/* check inline data */
if (inlinedata_fs && (inode->i_flags & EXT4_INLINE_DATA_FL))
check_blocks_inline_data(ctx, pctx, &pb);
}
end_problem_latch(ctx, PR_LATCH_BLOCK);
end_problem_latch(ctx, PR_LATCH_TOOBIG);