Soft Updates一项消除大多数同步写操作的技术(2)
http://tech.ddvip.com 2006年04月01日 社区交流
本文详细介绍Soft Updates一项消除大多数同步写操作的技术(2)
3.7 新目录项依赖关系追踪
图7表现了在目录中创建两个新项,foo和bar时的依赖关系结构。图中引入了两个新的依赖关系结构。独立的diradd结构追踪目录块中的每个项,而pagedep则管理目录块中的所有与diradd关联的依赖关系。每个新文件都会有一个inodedep结构,以及一个diradd结构。两个文件的i-节点对应的位映射表项目已经被写入磁盘,如图,它们的inodedeps中的DEPCOMPLETE标志已被置位。foo的i-节点已经通过VOP_UPDATE更新,但还没有被写盘,即inodedep中的COMPLETE还没置1,而它的diradd结构仍挂在"buf wait"表中。在i-节点被写磁,并增加了引用计数前,目录项不可以出现在盘上。如果目录页需要写盘,SoftUpdates代码将通过把i-节点数置零来回滚为foo新创建的目录项。写盘完成后,将把foo的i-节点数恢复成正确的值。
与此同时,bar的i-节点已被写盘,如图,它的inodedep和diradd结构的COMPLETE已置位。当i-节点写入完成之后, bar的diradd结构将从inodedep的"buf wait"表移动到"pending ops[待完成操作]"表中。此外,它也从pagedep"diradd"表移到"pending ops"表。由于i-节点已经被写入,写目录项将是安全的。inodedep和pagedep的"pending ops"表中的diradd项将保留到在新的目录项写到磁盘上为止。diradd结构最终在目录项写入之后释放。维护"pending ops"表的理由在于,当对一个文件作完"fsync"系统调用之后,内核能确认文件的内容和目录引用都被写盘了。此时,内核需要通过对"fsync"的i-节点的inodedep结构作查找来确认目录引用已经被写到磁盘上。如果发现了inodedep,则将检查是否有diradd依赖关系存在于"pending ops"甚至"buf wait"表中。如果找到了diradd结构,则将顺着指针找出相关的pagedep结构,并将关联的目录i-节点写盘。这一反向追踪将在目录inodedep中迭代进行。
责编:豆豆技术应用