Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ced2c7ea authored by Kinglong Mee's avatar Kinglong Mee Committed by Jaegeuk Kim
Browse files

f2fs: new helper cur_cp_crc() getting crc in f2fs_checkpoint



There are four places that getting the crc value in f2fs_checkpoint,
just add a new helper cur_cp_crc for them.

Signed-off-by: default avatarKinglong Mee <kinglongmee@gmail.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 727ebb09
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -683,8 +683,7 @@ static int get_checkpoint_version(struct f2fs_sb_info *sbi, block_t cp_addr,
		return -EINVAL;
	}

	crc = le32_to_cpu(*((__le32 *)((unsigned char *)*cp_block
							+ crc_offset)));
	crc = cur_cp_crc(*cp_block);
	if (!f2fs_crc_valid(sbi, crc, *cp_block, crc_offset)) {
		f2fs_msg(sbi->sb, KERN_WARNING, "invalid crc value");
		return -EINVAL;
+6 −0
Original line number Diff line number Diff line
@@ -1126,6 +1126,12 @@ static inline unsigned long long cur_cp_version(struct f2fs_checkpoint *cp)
	return le64_to_cpu(cp->checkpoint_ver);
}

static inline __u64 cur_cp_crc(struct f2fs_checkpoint *cp)
{
	size_t crc_offset = le32_to_cpu(cp->checksum_offset);
	return le32_to_cpu(*((__le32 *)((unsigned char *)cp + crc_offset)));
}

static inline bool __is_set_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f)
{
	unsigned int ckpt_flags = le32_to_cpu(cp->ckpt_flags);
+1 −4
Original line number Diff line number Diff line
@@ -2462,9 +2462,6 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
	unsigned int nat_bits_bytes = nm_i->nat_blocks / BITS_PER_BYTE;
	unsigned int i;
	__u64 cp_ver = cur_cp_version(ckpt);
	size_t crc_offset = le32_to_cpu(ckpt->checksum_offset);
	__u64 crc = le32_to_cpu(*((__le32 *)
				((unsigned char *)ckpt + crc_offset)));
	block_t nat_bits_addr;

	if (!enabled_nat_bits(sbi, NULL))
@@ -2487,7 +2484,7 @@ static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
		f2fs_put_page(page, 1);
	}

	cp_ver |= (crc << 32);
	cp_ver |= (cur_cp_crc(ckpt) << 32);
	if (cpu_to_le64(cp_ver) != *(__le64 *)nm_i->nat_bits) {
		disable_nat_bits(sbi, true);
		return 0;
+7 −13
Original line number Diff line number Diff line
@@ -300,14 +300,11 @@ static inline void fill_node_footer_blkaddr(struct page *page, block_t blkaddr)
{
	struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page));
	struct f2fs_node *rn = F2FS_NODE(page);
	size_t crc_offset = le32_to_cpu(ckpt->checksum_offset);
	__u64 cp_ver = le64_to_cpu(ckpt->checkpoint_ver);
	__u64 cp_ver = cur_cp_version(ckpt);

	if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG))
		cp_ver |= (cur_cp_crc(ckpt) << 32);

	if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG)) {
		__u64 crc = le32_to_cpu(*((__le32 *)
				((unsigned char *)ckpt + crc_offset)));
		cp_ver |= (crc << 32);
	}
	rn->footer.cp_ver = cpu_to_le64(cp_ver);
	rn->footer.next_blkaddr = cpu_to_le32(blkaddr);
}
@@ -315,14 +312,11 @@ static inline void fill_node_footer_blkaddr(struct page *page, block_t blkaddr)
static inline bool is_recoverable_dnode(struct page *page)
{
	struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page));
	size_t crc_offset = le32_to_cpu(ckpt->checksum_offset);
	__u64 cp_ver = cur_cp_version(ckpt);

	if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG)) {
		__u64 crc = le32_to_cpu(*((__le32 *)
				((unsigned char *)ckpt + crc_offset)));
		cp_ver |= (crc << 32);
	}
	if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG))
		cp_ver |= (cur_cp_crc(ckpt) << 32);

	return cp_ver == cpver_of_node(page);
}