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

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

free_ind

static void free_ind(int dev,int block)

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

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

struct buffer_head * bh; unsigned short * p; int i;  if (!block)     return; if ((bh=bread(dev,block))) {

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

for (i=0;i<h4>free_dind</h4><pre class="brush:plain;">static void free_dind(int dev,int block)

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

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

struct buffer_head * bh; unsigned short * p; int i;  if (!block)     return;

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

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

if ((bh=bread(dev,block))) {     p = (unsigned short *) bh-&gt;b_data;     for (i=0;i<h4>truncate</h4><pre class="brush:plain;">void truncate(struct m_inode * inode)

该函数的作用是释放该inode所占据的磁盘空间。当文件链接数为0时,iput函数(inode.c)会调用该函数。

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

int i;  if (!(S_ISREG(inode-&gt;i_mode) || S_ISDIR(inode-&gt;i_mode)))     return;

释放直接引用块。

for (i=0;ii_zone[i]) {         free_block(inode-&gt;i_dev,inode-&gt;i_zone[i]);         inode-&gt;i_zone[i]=0;     }

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

free_ind(inode-&gt;i_dev,inode-&gt;i_zone[7]); free_dind(inode-&gt;i_dev,inode-&gt;i_zone[8]);

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

inode-&gt;i_zone[7] = inode-&gt;i_zone[8] = 0; inode-&gt;i_size = 0; inode-&gt;i_dirt = 1; inode-&gt;i_mtime = inode-&gt;i_ctime = CURRENT_TIME;

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享