Linux 内核文件系统与设备操作流程分析(20) nd->dentry->d_inode)) audit_inode(name, nd->dentry->d_inode); }out_fail: return retval;fput_fail: fput_light(file, fput_needed); goto out_fail;}在 link_path_walk() 函数中实际使用的函数为 __link_path_walk(),在这个函数中分解路径,并依次调用 do_lookup() 函数完成实际的转换工作,do_lookup()才有可能去调用实际文件系统的读磁盘 inode 操作。结合上下文,我们只关心读取流程,不对路径分解算法做分析,所以只提取相关代码。static fastcall int __link_path_walk(const char * name, struct nameidata *nd){ struct path next; struct inode *inode; int err; unsigned int lookup_flags = nd->flags; // // 篇幅所限,在这个函数中我们只列出相关代码。 // // // 这里是一个大循环,目的是用来分解路径并在 // 分解的中间过程使用 do_lookup() 得到相关的 // inode 一直到最后指定的文件或路径。也就是说对 // 于象 /dir/temp/readme.txt 这种路径会首先从 // 根一直分解并调用 do_lookup() 得到其 inode // 一直到得到最后的 readme.txt 为止。 // for(;;) { ....... // // 从缓存或调用实际文件系统函数获取 inode 信息