Linux 内核文件系统与设备操作流程分析(2) // 工作,后面会随着疑问详细分析这个函数。这里只需要知 // 道它返回了一个 nameidata 结构。 // error = open_namei(dfd, filename, namei_flags, mode, &nd); if (!error) // // 这里返回的 struct file 结构已经创建并填充完毕了。 // 直接返回给调用者。 // return nameidata_to_filp(&nd, flags); return ERR_PTR(error);}这个函数根据 struct nameidata 结构返回一个 struct file。可以看到struct file 是在使用了 __dentry_open() 函数后被填充的,且使用的第一个参数是 nameidata->dentry,这也是为什么我们要获得 struct nameidata的一个主要原因,其目的就是为了得到 struct dentry 结构。struct file *nameidata_to_filp(struct nameidata *nd, int flags){ struct file *filp; /* Pick up the filp from the open intent */ filp = nd->intent.open.file; /* Has the filesystem initialised the file for us? */ if (filp->f_dentry == NULL) // // 这个函数主要就是填充一个 struct file 结构,通过这段 // 代码也可以看到,一个 struct file 是动态分配的。