Linux 内核文件系统与设备操作流程分析(4) // 跳转到 cleanup_file 处退出 // if (f->f_mode & FMODE_WRITE) { error = get_write_Access(inode); if (error) goto cleanup_file; } // // 使用 vfsmount,dentry,inode 结构 // 填充 struct file 中相关域。 // f->f_mapping = inode->i_mapping; f->f_dentry = dentry; f->f_vfsmnt = mnt; f->f_pos = 0; // // 注意:这里使用的是 struct inode 中的 struct file_operations // 回调函数来填充的 struct file->f_op。也就是说 struct file 中的 // 函数其实是 inode->file_operations 的一份复制品。而这个 struct // file 很明显是动态创建的,也就是说 open 一个文件则会动态生成一个 // struct file 结构,并把 inode->i_fop 函数给它,struct file 并不是 // 全局唯一的,而是与进程相关的,在 task_struct 中的 files_struct // 结构则是 struct file 的一个集合。这也就是为什么在 struct file // 里做了手脚,影响的仅是当前进程,而不是全局的原因。;) // f->f_op = fops_get(inode->i_fop);