不知道理解是否正确,如欲转载请注明出处
感觉博客好像已经荒废了一段时间一样,最近学的都是断断续续的,所学的都是不成形的。都不没啥好写的说。想想刚开通博客的时候那是热情高涨啊,一直发表一直发表。现在好像变得有点懒了。
最近在看linux内核3.0.1版的源码VFS部分,终于觉得有些好写的了哈。下面记录一下一个函数源码注释,这个函数如果单独着看肯定看不懂干嘛这么做。废话不多说了,开始贴:
/*
*在同个父文件系统下的同个目录可以作为多个子文件系统的挂载点,所以如果真的挂载了多个子文件系统,
*那么这几个子文件系统通过散列函数肯定会被放在哈希表里的同一条链表上。(个人理解,完成不知道对不对,也只能暂时这样理解)
*
*@mnt:已安装的父文件系统vfsmount结构;
*@dentry:已安装的子文件系统所在挂载点的dentry(父文件系统下的角度看)。
*@dir:为1,返回第一个挂载在指定挂载点的子文件系统
* 为0,返回最后一个挂载在指定挂载点的子文件系统
*函数功能:通过已安装的父文件系统vfsmount和已安装子文件系统的所在挂载点dentry来找出该子文件系统的vfsmount。
*/
struct vfsmount *__lookup_mnt(struct vfsmount *mnt, struct dentry *dentry,
int dir)
{
struct list_head *head = mount_hashtable + hash(mnt, dentry);//这里由所在父文件系统vfsmount与子文件系统的挂载点dentry来计算出该子文件系统
//来计算出该子文件系统vfsmount所在的哈希表里的链表索引,并取出链表头指针
struct list_head *tmp = head;
struct vfsmount *p, *found = NULL;
for (;;) {//索引这条链表,根据dir的值来选择我们所要找的是最先挂载的还是最后挂载的同一个目录下的子文件系统。
tmp = dir ? tmp->next : tmp->prev;//如果是‘1’,从链表的开始处开始索引,因为新安装上的文件系统都是插入到链表尾部,所以需要是从链表头部开始索引。
//如果不是'1' ,从链表尾部开始索引
if (tmp == head)
break;
p = list_entry(tmp, struct vfsmount, mnt_hash);//这个取出包含指定mnt_hash成员的vfsmount指针
if (p->mnt_parent == mnt && p->mnt_mountpoint == dentry) {//一定要找到父文件系统和挂载点都匹配的才是要找的那个子文件系统
found = p;//取出该文件系统vfsmount
break;
}
}
return found;
}