linux-011文件系统节点操作函数解析

本文详细解析了Linux内核中关于文件系统节点的操作,包括读取、写入、等待、锁定和解锁inode,以及sync_inodes函数实现。还介绍了bmap函数用于获取或创建数据块的逻辑块号,涉及直接映射和间接映射。最后,讲解了iput函数释放节点、get_empty_inode获取空inode、get_pipe_inode创建管道节点以及iget读取指定inode等核心操作。
摘要由CSDN通过智能技术生成
struct m_inode inode_table[NR_INODE]={
  {0,},};

static void read_inode(struct m_inode * inode);
static void write_inode(struct m_inode * inode);

/*参考sleep_on函数,另一篇文中有说*/
static inline void wait_on_inode(struct m_inode * inode)
{
	cli();
	while (inode->i_lock)
		sleep_on(&inode->i_wait);
	sti();
}

static inline void lock_inode(struct m_inode * inode)
{
	cli();
	while (inode->i_lock)
		sleep_on(&inode->i_wait);
	inode->i_lock=1;
	sti();
}

static inline void unlock_inode(struct m_inode * inode)
{
	inode->i_lock=0;
	wake_up(&inode->i_wait);
}

/*把所有的inode写入到磁盘中。读取的inode记录在全局数组inode_table中*/
void sync_inodes(void)
{
	int i;
	struct m_inode * inode;

	inode = 0+inode_table;
	for(i=0 ; i<NR_INODE ; i++,inode++) {
		wait_on_inode(inode);
		if (inode->i_dirt && !inode->i_pipe)
			write_inode(inode);
	}
}
/*
*直接映射时,i_zone[0-6]分别记录一个块,也就是记录7个块
*一级间接映射:i_zone[7]指向一个块,块中的所有数据都用来记录下一级的块号。可记录512块
*二级间接映射i_zone[8]指向一个块a,块a用来记录512个块,这512个块又分别记录512个块号
*/
/*create=0时获取数据块再设备上的逻辑块号,create=1时创建数据块对应的逻辑块*/
/*0-6直接块 7一级间接映射块,8二级间接映射块*/
static int _bmap(struct m_inode * inode,int block,int create)
{
	struct buffer_head * bh;
	int i;

	if (block<0)
		panic("_bmap: block<0");
	if (block >= 7+512+512*512)
		panic("_bmap: block>big");
/*当block小于7时,且逻辑块映射成员i_zone[block]为空,就创建一个新块并赋值给i_zone[block];并返回逻辑块号*/
	if (block<7) {
		if (create && !inode->i_zone[block])
			if (inode->i_zone[block]=new_block(inode->i_dev)) {
				inode->i_ctime=CURRENT_TIME;
				inode->i_dirt=1;
			}
		return inode->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值