Linux内核源码分析--文件系统(五、Inode.c)

本文详细介绍了Linux内核源码中与文件系统相关的几个关键函数,包括_bmap()的逻辑块映射、iput()的i节点引用管理、iget()的i节点获取、read_inode()的i节点读取以及write_inode()的i节点写入。这些操作对于理解Linux文件系统的底层工作原理至关重要。
摘要由CSDN通过智能技术生成


_bmap()

        1、_bmap()函数用于把一个文件数据块映射到盘块的处理操作

        

        因为一个i节点对应一个文件,所以上面的i节点映射的逻辑块号就是文件数据存放的逻辑块号;i_zone[0]到i_zone[6]是直接逻辑块号,i_zone[7]是一次间接逻辑块号,i_zone[8]是二次间接逻辑块号;文件中的数据存放在哪个硬盘上的逻辑块上就是由这个数组来映射的,根据这个也可以知道一个文件的最大存储是多少?

//把文件上的数据块映射到磁盘上,inode 文件i节点;block 文件中数据块号,create是否创建标志
static int _bmap(struct m_inode * inode,int block,int create)
{
	struct buffer_head * bh;
	int i;

//判断文件数据块号block是否超出范围
	if (block<0)
		panic("_bmap: block<0");
	if (block >= 7+512+512*512)//文件逻辑块的范围
		panic("_bmap: block>big");

	//使用直接块
	if (block<7) {
		if (create && !inode->i_zone[block])//创建标志置位,i节点对应的逻辑块字段为0
			if (inode->i_zone[block]=new_block(inode->i_dev)) {//申请一个新磁盘逻辑块,返回逻辑号
				inode->i_ctime=CURRENT_TIME;
				inode->i_dirt=1;
			}
		return inode->i_zone[block];//返回设备上的逻辑块号
	}

	//使用一次间接块
	block -= 7;
	if (block<512) {
		if (create && !inode->i_zone[7])//表明文件是首次使用间接块,则申请一个磁盘块来存放间接块信息
			if (inode->i_zone[7]=new_block(inode->i_dev)) {
				inode->i_dirt=1;
				inode->i_ctime=CURRENT_TIME;
			}
		if (!inode->i_zone[7])//表示创建间接块磁盘失败,或者create未置1
			return 0;
		if (!(bh = bread(inode->i_dev,inode->i_zone[7])))//读取间接块的信息
			return 0;
		i = ((unsigned short *) (bh->b_data))[block];//得到间接块上block所处的位置,判断是否为0
		if (create && !i)//如果间接块号上的block位置为0,create置位
			if (i=new_block(inode->i_dev)) {//申请一个新的逻辑块给block
				((unsigned short *) (bh->b_data))[block]=i;
				bh->b_dirt=1;
			}
		brelse(bh);
		return i;
	}

	//使用二次间接块
	block -= 512;
	//为二次间接块申请逻辑块
	if (create && !inode->i_zone[8])
		if (inode->i_zone[8]=new_block(inode->i_dev)) {//映射到二级间接块中的一级逻辑块上
			inode->i_dirt=1;
			inode->i_ctime=CURRENT_TIME;
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值