昨天水了一篇,今天还有脸继续水吗?
有!
不过今天时间充裕,会相对不那么水。
一般目录的inode建立
- 为什么关注目录的inode?
因为要在目录下建立或找到文件,需要通过目录的inode->i_op->lookup
函数指针来创建或找到目录下的文件。 - 一般目录或文件的inode怎么建立的?
通过上层目录的inode->i_op->lookup
建立的。 - 上层目录的inode怎么建立的?
通过上层目录的inode->i_op->lookup
建立的,一直向上就会到达根目录,因为前几篇说根目录的inode是在挂载阶段建立的,所以就可以从根目录一层一层向下层目录lookup
。
lookup如何建立inode
vfat_lookup
[kernel/fs/fat/namei_vfat.c]
==>
fat_build_inode
[kernel/fs/fat/inode.c]
fat_build_inode
简化如下,其中有对inode->i_ino
赋值,即分配了一个inode号。
struct inode *fat_build_inode(struct super_block *sb,
struct msdos_dir_entry *de, loff_t i_pos)
{
struct inode *inode;
//...
inode = new_inode(sb);
//...
inode->i_ino = iunique(sb, MSDOS_ROOT_INO);
//...
err = fat_fill_inode(inode, de);
//...
return inode;
}
深入看一下fat_fill_inode
[kennel/fs/fat/inode.c],可以看到对于directory有inode->i_op = sbi->dir_ops;
的赋值,前面的文章说过sbi->dir_ops
就是vfat_dir_inode_operation
。
int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
{
struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
//...
if ((de->attr & ATTR_DIR) && !IS_FREE(de->name)) {
//...
inode->i_op = sbi->dir_ops;
//...
} else { /* not a directory */
//...
}
//...
return 0;
}
总结
根目录的inode在挂载时被建立,使之可以接到vfat_dir_inode_operation.lookup
,目录的inode->i_op->lookup
可以对目录下的目录或文件建立或找到inode,新创建的目录的inode也可以接到vfat_dir_inode_operation.lookup
,所以凡是有inode的目录就可以通过lookup创建或找到它下面对的文件的inode。
绕来绕去的inode,和打开文件到底有毛关系?