浅尝辄止67-FAT32-内核8

昨天水了一篇,今天还有脸继续水吗?
有!
不过今天时间充裕,会相对不那么水。

一般目录的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,和打开文件到底有毛关系?

你可能感兴趣的:(浅尝辄止67-FAT32-内核8)