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;