if (inode->i_flags & EXT4_INLINE_DATA_FL) {
int flags;
size_t size;
+ errcode_t err;
+ size = 0;
flags = ctx->fs->flags;
ctx->fs->flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS;
- if (ext2fs_inline_data_size(ctx->fs, pctx->ino, &size))
- bad_size = 5;
+ err = ext2fs_inline_data_size(ctx->fs, pctx->ino,
+ &size);
ctx->fs->flags = (flags &
EXT2_FLAG_IGNORE_CSUM_ERRORS) |
(ctx->fs->flags &
~EXT2_FLAG_IGNORE_CSUM_ERRORS);
- if (size != inode->i_size)
- bad_size = 5;
+ if (err || size != inode->i_size) {
+ bad_size = 7;
+ pctx->num = size;
+ }
} else if (inode->i_size & (fs->blocksize - 1))
bad_size = 5;
else if (nblock > (pb.last_block + 1))
}
/* i_size for symlinks is checked elsewhere */
if (bad_size && !LINUX_S_ISLNK(inode->i_mode)) {
- pctx->num = (pb.last_block+1) * fs->blocksize;
+ /* Did inline_data set pctx->num earlier? */
+ if (bad_size != 7)
+ pctx->num = (pb.last_block + 1) * fs->blocksize;
pctx->group = bad_size;
if (fix_problem(ctx, PR_1_BAD_I_SIZE, pctx)) {
if (LINUX_S_ISDIR(inode->i_mode))
pctx->num &= 0xFFFFFFFFULL;
ext2fs_inode_size_set(fs, inode, pctx->num);
+ if (EXT2_I_SIZE(inode) == 0 &&
+ (inode->i_flags & EXT4_INLINE_DATA_FL)) {
+ memset(inode->i_block, 0,
+ sizeof(inode->i_block));
+ inode->i_flags &= ~EXT4_INLINE_DATA_FL;
+ }
dirty_inode++;
}
pctx->num = 0;