Commit 186e7d71 authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim
Browse files

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: eb8fbaa5 ("f2fs: compress: fix to check unreleased compressed cluster")
Signed-off-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 4ed886b1
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -3666,7 +3666,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++) {
@@ -3686,20 +3687,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;

@@ -3710,7 +3717,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;
	}