继续前面的问题
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_op
与vfat_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
的地址给了sbi
的dir_ops
成员。
根目录是这样关联的,一般目录呢?