Skip to content

Commit 186e7d7

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: compress: fix to update i_compr_blocks correctly
Previously, we account reserved blocks and compressed blocks into @compr_blocks, then, f2fs_i_compr_blocks_update(,compr_blocks) will update i_compr_blocks incorrectly, fix it. Meanwhile, for the case all blocks in cluster were reserved, fix to update dn->ofs_in_node correctly. Fixes: eb8fbaa ("f2fs: compress: fix to check unreleased compressed cluster") Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 4ed886b commit 186e7d7

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

fs/f2fs/file.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3666,7 +3666,8 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,
36663666

36673667
while (count) {
36683668
int compr_blocks = 0;
3669-
blkcnt_t reserved;
3669+
blkcnt_t reserved = 0;
3670+
blkcnt_t to_reserved;
36703671
int ret;
36713672

36723673
for (i = 0; i < cluster_size; i++) {
@@ -3686,20 +3687,26 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,
36863687
* fails in release_compress_blocks(), so NEW_ADDR
36873688
* is a possible case.
36883689
*/
3689-
if (blkaddr == NEW_ADDR ||
3690-
__is_valid_data_blkaddr(blkaddr)) {
3690+
if (blkaddr == NEW_ADDR) {
3691+
reserved++;
3692+
continue;
3693+
}
3694+
if (__is_valid_data_blkaddr(blkaddr)) {
36913695
compr_blocks++;
36923696
continue;
36933697
}
36943698
}
36953699

3696-
reserved = cluster_size - compr_blocks;
3700+
to_reserved = cluster_size - compr_blocks - reserved;
36973701

36983702
/* for the case all blocks in cluster were reserved */
3699-
if (reserved == 1)
3703+
if (to_reserved == 1) {
3704+
dn->ofs_in_node += cluster_size;
37003705
goto next;
3706+
}
37013707

3702-
ret = inc_valid_block_count(sbi, dn->inode, &reserved, false);
3708+
ret = inc_valid_block_count(sbi, dn->inode,
3709+
&to_reserved, false);
37033710
if (unlikely(ret))
37043711
return ret;
37053712

@@ -3710,7 +3717,7 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,
37103717

37113718
f2fs_i_compr_blocks_update(dn->inode, compr_blocks, true);
37123719

3713-
*reserved_blocks += reserved;
3720+
*reserved_blocks += to_reserved;
37143721
next:
37153722
count -= cluster_size;
37163723
}

0 commit comments

Comments
 (0)