f2fs:依据inode的节点号,将inode对应的block读到页缓存
f2fs_iget依据索引节点号,查找对应的inode,若没有,则创建一个新的inode,读取磁盘上的inode所在的block,生成f2f2_inode对象去初始化这个新inode。
其中,当inode不存在时,需要创建新的inode,同时还要从磁盘上读取inode所在的block;
因此,这次主要针对f2fs读取磁盘block过程进行分析,do_read_inode是主要函数。
/*
依据节点号ino,获得对应的inode;
若没有,则创建一个新的inode,读取磁盘上的inode所在的block,生成f2f2_inode对象去初始化这个新inode
*/
struct inode *f2fs_iget(struct super_block *sb, unsigned long ino)
{
struct f2fs_sb_info *sbi = F2FS_SB(sb);
struct inode *inode;
int ret = 0;
//依据索引节点号ino,获得对应的inode;若没有,则创建一个新的inode
inode = iget_locked(sb, ino);
if (!inode)
return ERR_PTR(-ENOMEM);
/* 该inode不是新inode,直接返回该inode */
if (!(inode->i_state & I_NEW)) {
trace_f2fs_iget(inode);
return inode;
}
/* 如果索引节点号是NODE节点或者META节点,调到make_now */
if (ino == F2FS_NODE_INO(sbi) || ino == F2FS_META_INO(sbi))
goto make_now;
/* 索引节点是DATA节点:依据inode的节点号,将inode对应的block读到页缓存,此时磁盘上的f2fs_node节点就位于页缓存中。
使用f2fs_node 对inode初始化 */
ret = do_read_inode(inode);
if (ret)
goto bad_inode;
make_now:
/* 依据ino对应的节点类型或者文件类型,赋予inode不同的操作方法 */
if (ino == F2FS_NODE_INO(sbi)) { //ino是NODE节点
inode->i_mapping->a_ops = &f2fs_node_aops;
mapping_set_gfp_mask(inode->i_mapping, GFP_F2FS_ZERO);
} else if (ino == F2FS_META_INO(sbi)) { //ino是META节点
inode->i_mapping->a_ops = &f2fs_meta_aops;
mapping_set_gfp_mask(inode->i_mapping, GFP_F2FS_ZERO);
} else if (S_ISREG(inode->i_mode)) { //inode代表普通文件
inode->i_op = &f2fs_file_inode_operations;
inode->i_fop = &f2fs_file_operations;
ino