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

发布时间 - 2023-05-21 00:00:00    点击率:

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所占据的磁盘空间。当文件链接数为0时,iput函数(inode.c)会调用该函数。

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

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;


# linux  # 遍历  # 后将  # 不为  # 就对  # 或者是  # 如果不是  # 设置为  # 将该  # 文件系统  # 跳过 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在万网主机上快速搭建网站?  SQL查询语句优化的实用方法总结  百度浏览器如何管理插件 百度浏览器插件管理方法  如何在Windows 2008云服务器安全搭建网站?  如何快速重置建站主机并恢复默认配置?  如何快速查询网站的真实建站时间?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Python文件异常处理策略_健壮性说明【指导】  利用 Google AI 进行 YouTube 视频 SEO 描述优化  潮流网站制作头像软件下载,适合母子的网名有哪些?  动图在线制作网站有哪些,滑动动图图集怎么做?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  JavaScript Ajax实现异步通信  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  魔方云NAT建站如何实现端口转发?  七夕网站制作视频,七夕大促活动怎么报名?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel怎么实现模型属性的自动加密  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel如何记录自定义日志?(Log频道配置)  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何快速完成中国万网建站详细流程?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  JavaScript如何实现路由_前端路由原理是什么  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  如何用狗爹虚拟主机快速搭建网站?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  大同网页,大同瑞慈医院官网?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  智能起名网站制作软件有哪些,制作logo的软件?  Bootstrap CSS布局之列表  太平洋网站制作公司,网络用语太平洋是什么意思?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  ,网页ppt怎么弄成自己的ppt?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel如何使用Livewire构建动态组件?(入门代码)  Laravel怎么在Controller之外的地方验证数据  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  BootStrap整体框架之基础布局组件  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Python并发异常传播_错误处理解析【教程】  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  如何自定义建站之星模板颜色并下载新样式?  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  深入理解Android中的xmlns:tools属性