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:
parent
de373c691b
commit
ee2e0e624b
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user