Linux中文件系统truncate.c源码分析

服务器   发布日期:2024年04月17日   浏览次数:542

这篇文章主要讲解了“Linux中文件系统truncate.c源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中文件系统truncate.c源码分析”吧!

Linux-0.11 文件系统truncate.c详解

free_ind

  1. static void free_ind(int dev,int block)

该函数的作用是释放所有的一次间接块

该函数首先读取一次间接块到bh中, 该bh块中存储了512个盘块号。

  1. struct buffer_head * bh;
  2. unsigned short * p;
  3. int i;
  4. if (!block)
  5. return;
  6. if ((bh=bread(dev,block))) {

接下来就对这512个盘块号进行遍历,如果盘块号不为0, 就调用free_block(bitmap.c中)释放该盘块。遍历完毕之后,将一次间接块的bh块引用计数减1。最后将这个一次间接块也进行释放。

  1. for (i=0;i<512;i++,p++)
  2. if (*p)
  3. free_block(dev,*p);
  4. brelse(bh);
  5. free_block(dev,block);

free_dind

  1. static void free_dind(int dev,int block)

该函数的作用就是释放所有的二次间接块

该函数首先对盘块号的有效性进行校验。

  1. struct buffer_head * bh;
  2. unsigned short * p;
  3. int i;
  4. if (!block)
  5. return;

接着读取二次间接块到bh中, 该bh块中存储了512个一次间接块的盘块号。

接下来就对这512个一次间接块的盘块号进行遍历,如果盘块号不为0, 就调用free_ind释放该一次间接块所有的block。遍历完毕之后,将二次间接块的bh块引用计数减1。最后将这个二次间接块也进行释放。

  1. if ((bh=bread(dev,block))) {
  2. p = (unsigned short *) bh->b_data;
  3. for (i=0;i<512;i++,p++)
  4. if (*p)
  5. free_ind(dev,*p);
  6. brelse(bh);
  7. }
  8. free_block(dev,block);

truncate

  1. void truncate(struct m_inode * inode)

该函数的作用是释放该inode所占据的磁盘空间。 该函数在iput函数(inode.c)中如果文件的链接数为0的时候被调用。

代码最开始检查如果不是常规文件或者是目录文件,就跳过。

  1. int i;
  2. if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
  3. return;

释放直接引用块。

  1. for (i=0;i<7;i++)
  2. if (inode->i_zone[i]) {
  3. free_block(inode->i_dev,inode->i_zone[i]);
  4. inode->i_zone[i]=0;
  5. }

释放一次间接块和二次间接块。

  1. free_ind(inode->i_dev,inode->i_zone[7]);
  2. free_dind(inode->i_dev,inode->i_zone[8]);

将一次间接块和二次间接块的地址置为0。将inode的size置为0, 将该inode设置为含有脏数据, 最后将inode的修改时候和创建时间都修改为当前时间。

  1. inode->i_zone[7] = inode->i_zone[8] = 0;
  2. inode->i_size = 0;
  3. inode->i_dirt = 1;
  4. inode->i_mtime = inode->i_ctime = CURRENT_TIME;

以上就是Linux中文件系统truncate.c源码分析的详细内容,更多关于Linux中文件系统truncate.c源码分析的资料请关注九品源码其它相关文章!