内核文件系统API之iget_locked

本文详细解析了Linux内核中iget_locked函数的工作原理。该函数通过超级块和inode编号来定位并获取inode节点,包括从哈希表中查找inode、处理并发创建inode的情况以及分配新的inode等过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct inode *iget_locked(struct super_block *sb, unsigned long ino)用于根据super_block和inode id 找到inode
其源码分析如下:
struct inode *iget_locked(struct super_block *sb, unsigned long ino)
{
	struct hlist_head *head = inode_hashtable + hash(sb, ino);
	struct inode *inode;
again:
	spin_lock(&inode_hash_lock);
	#根据sb和ino尝试找inode,所有的inode都是在一个名为inode的list上
	inode = find_inode_fast(sb, head, ino);
	spin_unlock(&inode_hash_lock);
	if (inode) {
	#inode 不为null,则说明找到了,然后通过wait_on_inode来等待置位__I_NEW这个标志
		wait_on_inode(inode);
		if (unlikely(inode_unhashed(inode))) {
			iput(inode);
			goto again;
		}
		#找到inode的话,这里就直接返回给用户了
		return inode;
	}
	#如果没有找到,则新申请一个inode
	inode = alloc_inode(sb);
	if (inode) {
		struct inode *old;

		spin_lock(&inode_hash_lock);
		/* We released the lock, so.. */
		#再次根据sb和ino 尝试第二次查找inode
		old = find_inode_fast(sb, head, ino);
		if (!old) {
		#如果还是找不到,则给新申请的inode 赋值后返回给用户
			inode->i_ino = ino;
			spin_lock(&inode->i_lock);
			inode->i_state = I_NEW;
			hlist_add_head(&inode->i_hash, head);
			spin_unlock(&inode->i_lock);
			inode_sb_list_add(inode);
			spin_unlock(&inode_hash_lock);

			/* Return the locked inode with I_NEW set, the
			 * caller is responsible for filling in the contents
			 */
			 #所以这里返回新申请的inode给用户
			return inode;
		}

		/*
		 * Uhhuh, somebody else created the same inode under
		 * us. Use the old inode instead of the one we just
		 * allocated.
		 */
		 #走到这里说明根据sb和ino再第二次查找inode的时候找到了,所以要将新申请的inode 释放掉
		spin_unlock(&inode_hash_lock);
		destroy_inode(inode);
		inode = old;
		wait_on_inode(inode);
		if (unlikely(inode_unhashed(inode))) {
			iput(inode);
			goto again;
		}
	}
	#这里就是第二次找到inode
	return inode;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值