mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
f2fs: compress: fix to update i_compr_blocks correctly
[ Upstream commit 186e7d71534df4589405925caca5597af7626c12 ]
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: eb8fbaa53374 ("f2fs: compress: fix to check unreleased compressed cluster")
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d939659ef9
commit
ea394c8698
@@ -3588,7 +3588,8 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,
|
||||
|
||||
while (count) {
|
||||
int compr_blocks = 0;
|
||||
blkcnt_t reserved;
|
||||
blkcnt_t reserved = 0;
|
||||
blkcnt_t to_reserved;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < cluster_size; i++) {
|
||||
@@ -3608,20 +3609,26 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,
|
||||
* fails in release_compress_blocks(), so NEW_ADDR
|
||||
* is a possible case.
|
||||
*/
|
||||
if (blkaddr == NEW_ADDR ||
|
||||
__is_valid_data_blkaddr(blkaddr)) {
|
||||
if (blkaddr == NEW_ADDR) {
|
||||
reserved++;
|
||||
continue;
|
||||
}
|
||||
if (__is_valid_data_blkaddr(blkaddr)) {
|
||||
compr_blocks++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
reserved = cluster_size - compr_blocks;
|
||||
to_reserved = cluster_size - compr_blocks - 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;
|
||||
}
|
||||
|
||||
ret = inc_valid_block_count(sbi, dn->inode, &reserved, false);
|
||||
ret = inc_valid_block_count(sbi, dn->inode,
|
||||
&to_reserved, false);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
|
||||
@@ -3632,7 +3639,7 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,
|
||||
|
||||
f2fs_i_compr_blocks_update(dn->inode, compr_blocks, true);
|
||||
|
||||
*reserved_blocks += reserved;
|
||||
*reserved_blocks += to_reserved;
|
||||
next:
|
||||
count -= cluster_size;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user