f2fs系列文章fill_super(二)

本文详细介绍了f2fs文件系统在fill_super函数中的操作,包括设置块大小、读取和检查super block、验证超级块的合理性、获取有效检查点的过程。通过对set_blocksize、read_raw_super_block、sanity_check_raw_super、get_valid_checkpoint和validate_checkpoint等步骤的解析,揭示了f2fs初始化的重要细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    sb_set_blocksize通过函数set_blocksize对size进行检查并设置块设备的块大小。然后将super block的s_blocksize,s_blocksize_bits设置F2FS_BLKSIZE和F2FS_BLKSIZE相应的bit位数。

int sb_set_blocksize(struct super_block *sb, int size)
{
	if (set_blocksize(sb->s_bdev, size))
		return 0;
	sb->s_blocksize = size;
	sb->s_blocksize_bits = blksize_bits(size);
	return sb->s_blocksize;
}

    set_blocksize对size进行检查,[512,page_size]是文件系统的size范围,并且必须是2的幂,并且不能比设备的块大小小。并把super block的设备的块大小s_bdev设置成F2FS_BLKSIZE。

int set_blocksize(struct block_device *bdev, int size)
{
	if (size > PAGE_SIZE || size < 512 || !is_power_of_2(size))
		return -EINVAL;

	if (size < bdev_logical_block_size(bdev))
		return -EINVAL;

	if (bdev->bd_block_size != size) {
		sync_blockdev(bdev);
		bdev->bd_block_size = size;
		bdev->bd_inode->i_blkbits = blksize_bits(size);
		kill_bdev(bdev);
	}
	return 0;
}

    read_raw_super_block:首先分配一个f2fs_super_block的空间。f2fs文件系统有着两个f2fs_super_block,调用sb_bread对其进行依次读取,直到读取到的f2fs_super_block是没有问题的。读取之后调用sanity_check_raw_super对f2fs_super_block进行一些基本的检查。如果没有问题并且raw_super是NULL(第一次肯定是NULL的,第二次读取如果第一次读取或者检查失败就会是NULL的),那么就将读取的f2fs_super_block赋值给raw_super,并且用valid_super_block记录下有效的block号(假如没有一个是有效的,那么这个是NULL,如果只有一个是有效的,那么记录的就是有效的那个,如果两个都是有效的那么记录的就是第一个)。如果读取或者检查失败过那么用recovery来标记需要对f2fs_super_block进行修复。如果两个都失败了,那么就将分配的f2fs_super_block的空间释放掉。

static int read_raw_super_block(struct f2fs_sb_info *sbi, struct f2fs_super_block **raw_super,
			int *valid_super_block, int *recovery)
{
	struct super_block *sb = sbi->sb;
	int block;
	struct buffer_head *bh;
	struct f2fs_super_block *super;
	int err = 0;

	super = kzalloc(sizeof(struct f2fs_super_block), GFP_KERNEL);
	if (!super)
		return -ENOMEM;

	for (block = 0; block < 2; block++) {
		bh = sb_bread(sb, block);
		if (!bh) {
			f2fs_msg(sb, KERN_ERR, "Unable to read %dth superblock", block + 1);
			err = -EIO;
			continue;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值