f2fs系列文章——cp pack的组成

本文详述了f2fs文件系统中cp pack的构成,包括f2fs_checkpoint、sit_version_bitmap等组件,并从mount和do_checkpoint两个角度讨论了其写入和读取过程,揭示了各部分起始地址和长度的计算方法。
摘要由CSDN通过智能技术生成

    f2fs将分区分为super block、cp pack、sit、nat、ssa、main area四个区域,除了cp pack外,其他的区域的组成都比较简单,基本只有一种数据结构,只有cp pack由于承载了check point的功能,所以其组成比较复杂,这篇文章就cp pack的组成来详细讲述。

    cp pack是由f2fs_checkpoint、sit_version_bitmap、nat_version_bitmap、orphan inode、data summary、node summary(可能没有)、f2fs_checkpoint来组成。下面将从mount和do_checkpoint两个方位来对cp pack的组成进行详细讲述。

    下面是在do_checkpoint的时候关于cp pack的写入过程

static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
{

	...

	start_blk = __start_cp_addr(sbi);

	...

	update_meta_page(sbi, ckpt, start_blk++);

	for (i = 1; i < 1 + cp_payload_blks; i++)
		update_meta_page(sbi, (char *)ckpt + i * F2FS_BLKSIZE, start_blk++);

	if (orphan_num) {
		write_orphan_inodes(sbi, start_blk);
		start_blk += orphan_blocks;
	}

	write_data_summaries(sbi, start_blk);
	start_blk += data_sum_blocks;

	...

	if (__remain_node_summaries(cpc->reason)) {
		write_node_summaries(sbi, start_blk);
		start_blk += NR_CURSEG_NODE_TYPE;
	}

	update_meta_page(sbi, ckpt, start_blk);

	...

}

        下面是关于mount时候的读入过程。

 

int get_valid_checkpoint(struct f2fs_sb_info *sbi)
{
	struct f2fs_checkpoint *cp_block;
	struct f2fs_super_block *fsb = sbi->raw_super;
	struct page *cp1, *cp2, *cur_page;
	unsigned long blk_size = sbi->blocksize;
	unsigned long long cp1_version = 0, cp2_version = 0;
	unsigned long long cp_start_blk_no;
	unsigned int cp_blks = 1 + __cp_payload(sbi);
	block_t cp_blk_no;
	int i;

	sbi->ckpt = kzalloc(cp_blks * blk_size, GFP_KERNEL);
	if (!sbi->ckpt)
		return -ENOMEM;

	cp_start_blk_no = le32_to_cpu(fsb->cp_blkaddr);
	cp1 = validate_checkpoint(sbi, cp_start_blk_no, &cp1_version);

	cp_start_blk_no += ((unsigned long long)1) << le32_to_cpu(fsb->log_blocks_per_seg);
	cp2 = validate_checkpoint(sbi, cp_start_blk_no, &cp2_version);

	if (cp1 && cp2) {
		if (ver_after(cp2_version, cp1_version))
			cur_page = cp2;
		else
			cur_page = cp1;
	} else if (cp1) {
		cur_page =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值