展示Linux内核的lookup_one_len源代码,尽量详细介绍其源代码
时间: 2024-02-03 20:01:50 浏览: 108
Linux内核中的lookup_one_len函数位于文件系统层中,定义在文件./fs/namei.c中。它的作用是根据指定的名称和长度,计算出哈希值,并在哈希表中查找该哈希值对应的dentry节点,如果找到则返回该dentry节点的指针,否则返回NULL。
函数原型如下:
```
struct dentry *lookup_one_len(const char *name, struct dentry *base, int len);
```
其中,name参数是要查找的名称,base参数是查找的起始dentry节点,len参数是名称的长度。
该函数主要有以下几个步骤:
1. 计算哈希值
通过调用函数hashlen_string(name, len)计算出给定名称的哈希值。
2. 在哈希表中查找dentry节点
通过调用函数__lookup_hash()在哈希表中查找指定哈希值对应的dentry节点。如果找到,则返回该dentry节点的指针。
3. 如果在哈希表中未找到,则创建一个新的dentry节点
如果在哈希表中未找到指定哈希值对应的dentry节点,则调用函数d_alloc_name()创建一个新的dentry节点,并将其插入到哈希表中。
4. 返回dentry节点指针
如果在哈希表中找到了dentry节点,则直接返回该节点的指针;否则,返回新创建的dentry节点的指针。
完整的lookup_one_len()函数实现如下:
```
struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
{
unsigned int hashval;
struct qstr this;
struct dentry *dentry;
this.name = name;
this.len = len;
this.hash = 0;
hashval = hashlen_string(name, len);
spin_lock(&base->d_lock);
dentry = __lookup_hash(&this, hashval, base);
if (dentry)
goto out;
dentry = d_alloc_name(base, &this);
if (IS_ERR(dentry))
goto out;
__lookup_insert(dentry, hashval);
out:
spin_unlock(&base->d_lock);
return dentry;
}
```
其中,hashlen_string()函数是用来计算指定名称的哈希值的。__lookup_hash()函数是用来在哈希表中查找dentry节点的。d_alloc_name()函数是用来创建新的dentry节点的。__lookup_insert()函数是用来将新创建的dentry节点插入到哈希表中的。
阅读全文