昨天水了一篇,今天還有臉繼續(xù)水嗎荣挨?
有男韧!
不過今天時(shí)間充裕,會(huì)相對(duì)不那么水默垄。
一般目錄的inode建立
- 為什么關(guān)注目錄的inode此虑?
因?yàn)橐谀夸浵陆⒒蛘业轿募枰ㄟ^目錄的inode->i_op->lookup
函數(shù)指針來創(chuàng)建或找到目錄下的文件口锭。 - 一般目錄或文件的inode怎么建立的朦前?
通過上層目錄的inode->i_op->lookup
建立的。 - 上層目錄的inode怎么建立的鹃操?
通過上層目錄的inode->i_op->lookup
建立的韭寸,一直向上就會(huì)到達(dá)根目錄,因?yàn)榍皫灼f根目錄的inode是在掛載階段建立的荆隘,所以就可以從根目錄一層一層向下層目錄lookup
恩伺。
lookup如何建立inode
vfat_lookup
[kernel/fs/fat/namei_vfat.c]
==>
fat_build_inode
[kernel/fs/fat/inode.c]
fat_build_inode
簡(jiǎn)化如下,其中有對(duì)inode->i_ino
賦值椰拒,即分配了一個(gè)inode號(hào)莫其。
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],可以看到對(duì)于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;
}
總結(jié)
根目錄的inode在掛載時(shí)被建立,使之可以接到vfat_dir_inode_operation.lookup
仪壮,目錄的inode->i_op->lookup
可以對(duì)目錄下的目錄或文件建立或找到inode憨颠,新創(chuàng)建的目錄的inode也可以接到vfat_dir_inode_operation.lookup
,所以凡是有inode的目錄就可以通過lookup創(chuàng)建或找到它下面對(duì)的文件的inode积锅。
繞來繞去的inode爽彤,和打開文件到底有毛關(guān)系?