Linux 内核文件系统与设备操作流程分析(33) sb->s_root = d_alloc_root(root); // // 如果根 dentry 无效则提示错误跳到失败处。 // if (!sb->s_root) { printk(KERN_ERR "EXT3-fs: get root inode failed\n"); iput(root); goto failed_mount4; } // // 如果根 inode 不是目录或者大小与块无效则提示错误 // 跳到失败处。 // if (!S_ISDIR(root->i_mode) !root->i_blocks !root->i_size) { dput(sb->s_root); sb->s_root = NULL; printk(KERN_ERR "EXT3-fs: corrupt root inode, run e2fsck\n"); goto failed_mount4; }}至此所有流程都走到了,疑问也被一个个打破。我们在整体的梳理下流程。在内核sys_open 被调用打开一个文件或者设备驱动时,调用 filp_open()->do_filp_open()函数,在 do_filp_open() 函数中,首先利用 open_namei() 函数得到一个 structnameidata 结构,那么在这个过程中 __path_lookup_intent_open() 函数设置了struct nameidata->intent.open 相关字段,然后调用 do_path_lookup() 函数,在这个函数中设置了 struct nameidata->mnt 与 struct nameidata->dentry 相关字段后调用了 _link_path_walk() 函数开始分解路径,并依次调用 do_lookup() 函数来获得路径中个目录与最终文件的 struct inode。do_lookup() 函数先从 inode 缓存即 hlist 中查找 inode,如果没有找到则调用 real_lookup() 函数,此函数分配了一个 struct dentry 结构,然后使用上层目录的 struct inode->i_op->lookup()方法来继续查找,这样就触发了 ext3_lookup() 函数,而此函数得到 struct dentry与 inode number 后调用 iget() 函数来返回 struct inode。(这里有必要强调一点,