在vfs_caches_init中有三个重要的hashtable:mount_hashtabledentry_hashtable
inode_hashtable
Hashtable有什么作用?主要的查找的效率很高,vfs层用这三个就是为了提高查找效率。另外一个,inode和dentry是内存中的数据,而数据的来源是硬盘,如果我们获得了inode和dentry数据,加到hashtable中,方便下一次的快速获取,而不是再次访问硬盘。
Mount_hashtable:
在mnt_init中完成mount_hashtable的初始化。而在挂载文件系统的时候,一个重要函数graft_tree会将文件系统的vfsmount结构体内嵌的structlist_headmnt_hash加入到mount_hashtable中。这样在做文件系统挂载或者路径查找时,有需要做文件系统转换的时候,比如follow_mount和follow_down函数都会调用lookup_mnt__lookup_mnt可以快速的查找要转换的文件系统。
Dentry_hashtable:
在dcache_init中完成dentry_hashtable的初始化。在路径查找中就会用到这个hashtable。Link_path_walkdo_lookupd_lookup__d_lookup
structhlist_head *head = d_hash(parent,hash);
同样的利用hash快速找到dentry
Inode_hashtable:
在inode_init中完成inode_hashtable的初始化。比如sysfs_get_inodeiget_locked:
structhlist_head *head = inode_hashtable + hash(sb, ino); //利用inode_hashtable快速查找
而且iget_lockedget_new_inode_fast__inode_add_to_lists
hlist_add_head(&inode->i_hash,head);
利用inode内嵌的structhlist_node i_hash结构加入到inode_hashtable,方便以后的查找。