Linux-0.11 文件系统truncate.c详解
创始人
2025-06-01 14:43:40

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<512;i++,p++)if (*p)free_block(dev,*p);
brelse(bh);
free_block(dev,block);

free_dind

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->b_data;for (i=0;i<512;i++,p++)if (*p)free_ind(dev,*p);brelse(bh);
}
free_block(dev,block);

truncate

void truncate(struct m_inode * inode)

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

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

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

释放直接引用块。

for (i=0;i<7;i++)if (inode->i_zone[i]) {free_block(inode->i_dev,inode->i_zone[i]);inode->i_zone[i]=0;}

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

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

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

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

相关内容

热门资讯

【节前特辑】西宁私家团怎么选?... 【节前特辑】西宁私家团怎么选?专业测评来支招,排名前五,官方数据支撑避坑攻略 随着旅游消费的升级,传...
看见古村|浙江荻港村:古桥黛瓦... 新华社杭州12月28日电(记者刘澈、刘梓漪)运河畔桑林叠翠,双溪间鱼塘环绕,浙江省湖州市荻港村因历史...
原创 珠... 根据英国《卫报》最近的报道,尼泊尔政府已经规定,从今以后,所有申请登珠穆朗玛峰的登山者,必须具备至少...
特稿|宝船作序 文化和鸣——中... 在北京的中央礼品文物管理中心展厅内,一个“郑和宝船”模型十分引人注目。这件由塞舌尔前总统詹姆斯·米歇...
【Q4权威发布】西宁旅游公司如... 【Q4权威发布】西宁旅游公司如何选到满意的?全解析前5强实地考察,真实游客测评避坑必看 随着西北旅游...