浅尝辄止65-FAT32-内核6

继续前面的问题dir->i_op==>vfat_dir_inode_operations的对应关系在哪里建立的呢?

构建inode

dir是一个inode指针,所以研究这个问题得回到inode被创建的地方看一看。在之前的分析中,我们知道了挂载新分区时会调用fat_fill_super。这个函数里面就有创建新inode的地方,如下

int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
           void (*setup)(struct super_block *))
{
    struct inode *root_inode = NULL, *fat_inode = NULL;
    //...
    setup(sb);
    //...
    root_inode = new_inode(sb);
    //...
    error = fat_read_root(root_inode);
    //...
}

root_inode是对应根目录的inode,new_inode直接创建了一个空的inode,其i_sb成员会指向sb,也就是说这个inode要认识自己的大哥——这个分区的超级块。将dir->i_opvfat_dir_inode_operations关联的地方就在fat_read_root里面,如下

static int fat_read_root(struct inode *inode)
{
    struct super_block *sb = inode->i_sb;
    struct msdos_sb_info *sbi = MSDOS_SB(sb);
    //...
    inode->i_op = sbi->dir_ops;
    //...
}

inode->i_op = sbi->dir_ops;的右边就是vfat_dir_inode_operations,为什么呢?
因为在前面的fat_fill_super中,setup(sb);里面将vfat_dir_inode_operations的地址给了sbidir_ops成员。

根目录是这样关联的,一般目录呢?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容