Linux VFS II

PathWalk,顾名思义,就是根据路径找到目标的文件或目录,作为每次open()或opendir()都要执行的过程,其重要性不言而喻。

PathWalk中的很重要的一个概念就是nameidata,这个对象可以看作是PathWalk过程的上下文的封装,记录当前查找所用的路径,如果查找结束,则记录最终的目标路径。作为”上下文”,其主要工作就是封装了在一个过程中各个子逻辑都需要的信息,并随着过程的进行贯穿于各个子过程供其在需要时使用。

在内核中,PathWalk的主要逻辑整理如下

path_init(name, nd)		//根据name初始化nd
lookup_last(nd, &path)	//此时path还是空的
	walk_component()
		handle_dots()
		lookup_fast(nd, path, &inode)
			__d_lookup_rcu()
			struct vfsmount *mnt = nd->path.mnt
			path->mnt = mnt
			path->dentry = dentry
			__follow_mount_rcu(nd, path, inode)
				mounted = __lookup_mnt()
				path->mnt = &mounted->mnt
				//用下溯文件系统的mounted来更新path
				path->dentry = mounted->mnt.mnt_root;
				return 0 ;	//不需look_up时
				return 1 ; 	//仍需look_up时
		lookup_slow()
			__lookup_hash()
				lookup_dcache()
					d_lookup()
					d_alloc()
				lookup_real()
			path->mnt = nd->path.mnt
			path->dentry = dentry
			follow_managed()
		path_to_nameidate(path,nd)	//根据新path设置nameidata
			nd->path.mnt = path->mnt
		nd->inode = inode

这段逻辑使用上下文nameidata对象作为PathWalk过程中局部的全局变量,实现递归的目录搜索。

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Discover more from sketch2sky

Subscribe now to keep reading and get access to the full archive.

Continue reading