内核文件系统API之d_find_alias

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值