BACKPORT: 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.

Bug: 378001005
Fixes: eb8fbaa53374 ("f2fs: compress: fix to check unreleased compressed cluster")
Change-Id: Ie195fc57a1d55ff9f42fe4855edd21da1c88bb90
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
(cherry picked from commit 186e7d71534df4589405925caca5597af7626c12)
This commit is contained in:
Chao Yu 2024-05-06 18:41:36 +08:00 committed by Treehugger Robot
parent de373c691b
commit ee2e0e624b

View File

@ -3663,7 +3663,8 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count)
while (count) { while (count) {
int compr_blocks = 0; int compr_blocks = 0;
blkcnt_t reserved; blkcnt_t reserved = 0;
blkcnt_t to_reserved;
int ret; int ret;
for (i = 0; i < cluster_size; i++, dn->ofs_in_node++) { for (i = 0; i < cluster_size; i++, dn->ofs_in_node++) {
@ -3681,8 +3682,11 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count)
* fails in release_compress_blocks(), so NEW_ADDR * fails in release_compress_blocks(), so NEW_ADDR
* is a possible case. * is a possible case.
*/ */
if (blkaddr == NEW_ADDR || if (blkaddr == NEW_ADDR) {
__is_valid_data_blkaddr(blkaddr)) { reserved++;
continue;
}
if (__is_valid_data_blkaddr(blkaddr)) {
compr_blocks++; compr_blocks++;
continue; continue;
} }
@ -3691,13 +3695,15 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count)
f2fs_set_data_blkaddr(dn); f2fs_set_data_blkaddr(dn);
} }
reserved = cluster_size - compr_blocks; to_reserved = cluster_size - compr_blocks - reserved;
/* for the case all blocks in cluster were reserved */ /* for the case all blocks in cluster were reserved */
if (reserved == 1) if (to_reserved == 1) {
dn->ofs_in_node += cluster_size;
goto next; goto next;
}
ret = inc_valid_block_count(sbi, dn->inode, &reserved); ret = inc_valid_block_count(sbi, dn->inode, &to_reserved);
if (ret) if (ret)
return ret; return ret;
@ -3706,7 +3712,7 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count)
f2fs_i_compr_blocks_update(dn->inode, compr_blocks, true); f2fs_i_compr_blocks_update(dn->inode, compr_blocks, true);
reserved_blocks += reserved; reserved_blocks += to_reserved;
next: next:
count -= cluster_size; count -= cluster_size;
} }