linux 0.11 内核学习 -- truncate.c
来源:互联网 发布:淘宝官方折扣店真假 编辑:程序博客网 时间:2024/05/13 13:54
/*
* 该文件主要实现的是truncate函数,该函数是释放指定i
* 节点在设备上占用的所有逻辑块,包括直接块、一次间
* 接块和二次间接块
*/
/*
* linux/fs/truncate.c
*
* (C) 1991 Linus Torvalds
*/
#include <linux/sched.h>
#include <sys/stat.h>
/* 释放一次间接块,参数int dev, int block指明一次间接块的设备号 */
static void free_ind(int dev,int block)
{
struct buffer_head * bh;
unsigned short * p;
int i;
// 如果逻辑块号为0,则返回
if (!block)
return;
// 读取一次间接块,并释放其上表明使用的所有逻辑
// 块,然后释放该一次间接块的缓冲区
if (bh=bread(dev,block)) {
p = (unsigned short *) bh->b_data;
for (i=0;i<512;i++,p++)
if (*p)
free_block(dev,*p);
brelse(bh);
}
free_block(dev,block);
}
/* 释放二次间接块,int dev, int block指明二次间接块的逻辑号 */
static void free_dind(int dev,int block)
{
struct buffer_head * bh;
unsigned short * p;
int i;
if (!block)
return;
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);
}
/* 将节点对应的文件长度截为0,并释放占用的设备空间 */
void truncate(struct m_inode * inode)
{
int i;
// 如果不是常规文件或者是目录文件,则返回
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
return;
// 释放i 节点的7 个直接逻辑块,并将这7 个逻辑块项全置零
/*********************直接块************************/
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]);
// 逻辑块项7、8 置零
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;
}
参考《linux内核完全注释》和网上相关资料
- linux 0.11 内核学习 -- truncate.c
- linux命令--truncate 学习
- linux 0.11 内核学习 -- console.c,控制台
- linux 0.11 内核学习 -- namei.c。
- linux 0.11 内核学习 -- read_write.c
- linux 0.11 内核学习 -- char_dev.c
- linux 0.11 内核学习 -- buffer.c
- linux 0.11 内核学习 -- pipe.c
- linux 0.11 内核学习 -- file_dev.c
- linux 0.11 内核学习 -- exec.c
- linux 0.11 内核学习 -- bitmap.c
- linux 0.11 内核学习 -- block_dev.c
- linux 0.11 内核学习 -- fcntl.c
- linux 0.11 内核学习 -- inode.c
- linux 0.11 内核学习 -- ioctl.c
- linux内核学习:mktime.c
- linux 0.11 内核学习 -- main.c,调用函数而已。
- linux 0.11 内核学习 -- sched.c,调度进程。
- C#安装包(自动卸载低版本)
- struts-config.xml 配置描述
- 喝干红葡萄酒的十大好处
- MySQL的隐藏换行符的处理
- 每个方法抛出的异常都要有文档
- linux 0.11 内核学习 -- truncate.c
- ExtremeTable的安装及配置说明
- 15.2.6.4.外键约束
- ReentrantLock与synchronized的区别 ( by quqi99 )
- beginning python summary chapter 4 - 字典
- [转|会计学习]新会计准则对SAP系统的影响
- 全国路况查询
- linux 0.11 内核学习 -- read_write.c
- 移植程序到symbian平台