struct dentry *d_find_alias(struct inode *inode)函数通过一个拥有别名的inode结构体来获取具有给inode机构体的
目录结构体。
其源码分析如下:
struct dentry *d_find_alias(struct inode *inode)
{
struct dentry *de = NULL;
#可以看到这里首先判断dentry指针不能为null
if (!hlist_empty(&inode->i_dentry)) {
spin_lock(&inode->i_lock);
#遍历inode 需要用锁保护
de = __d_find_alias(inode);
spin_unlock(&inode->i_lock);
}
return de;
}
static struct dentry *__d_find_alias(struct inode *inode)
{
struct dentry *alias, *discon_alias;
again:
discon_alias = NULL;
#遍历inode->i_dentry 找到有别名的dentry
hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
spin_lock(&alias->d_lock);
#是目录或者没有hash
if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
#如果是root且这个别名包含DCACHE_DISCONNECTED 标志
if (IS_ROOT(alias) &&
(alias->d_flags & DCACHE_DISCONNECTED)) {
discon_alias = alias;
} else {
__dget_dlock(alias);
spin_unlock(&alias->d_lock);
#返回这个别名,也就是找到inode中包含别名的dentry
return alias;
}
}
spin_unlock(&alias->d_lock);
}
#如果是root且这个别名包含DCACHE_DISCONNECTED 标志
if (discon_alias) {
alias = discon_alias;
spin_lock(&alias->d_lock);
#再次判断是目录或者没有hash
if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
__dget_dlock(alias);
spin_unlock(&alias->d_lock);
#符合是目录或者没有没有hash 就返回
return alias;
}
spin_unlock(&alias->d_lock);
#如果不是目录或者已经被hash则重新查找别名
goto again;
}
return NULL;
}
内核文件系统API之d_find_alias
最新推荐文章于 2024-09-12 15:10:12 发布