Linux中文件系统truncate.c详解

 更新时间:2023年03月24日 10:18:50   作者:程序员小x  
这篇文章主要介绍了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<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;

到此这篇关于Linux中文件系统truncate.c详解的文章就介绍到这了,更多相关文件系统truncate.c内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Centos7下用户登录失败N次后锁定用户禁止登陆的方法

    Centos7下用户登录失败N次后锁定用户禁止登陆的方法

    这篇文章主要给大家介绍了关于在Centos7系统下用户登录失败N次后锁定用户禁止登陆的相关资料,文中先对PAM的配置文件进行了简单的介绍,然后通过示例代码将实现的方法介绍的非常详细,对大家的学习或者工作具有一定的参考价值,需要的朋友们下面随着小编来一起看看吧。
    2018-01-01
  • tr命令在统计英文单词出现频率中的妙用

    tr命令在统计英文单词出现频率中的妙用

    今天小编就为大家分享一篇关于tr命令在统计英文单词出现频率中的妙用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Linux如何开启路由转发功能

    Linux如何开启路由转发功能

    这篇文章主要介绍了Linux如何开启路由转发功能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 在windows上如何将本地文件上传至Linux服务器

    在windows上如何将本地文件上传至Linux服务器

    这篇文章主要介绍了在windows上如何将本地文件上传至Linux服务器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 使用 Apache Dubbo 实现远程通信(微服务架构)

    使用 Apache Dubbo 实现远程通信(微服务架构)

    Apache Dubbo 是一个分布式服务框架,主要实现多个系统之间的高性能、透明化调用,本文给大家介绍使用 Apache Dubbo 实现远程通信的详细过程,感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • FOXHIS西软系统sybase提示通知空间不足处理方法

    FOXHIS西软系统sybase提示通知空间不足处理方法

    各位酒店的电脑房经理有没有经历过在如下图这样的错误?有时候酒店的维护费没有到位或者时间急迫的时候我们需要自己的操作,操作步骤如下文所述
    2017-01-01
  • Linux实现自动挂载autofs的方法详解

    Linux实现自动挂载autofs的方法详解

    这篇文章主要介绍了Linux实现自动挂载autofs的相关资料。autofs 服务将实现自动挂载外围设备,NFS共享目录等,并在空闲5分钟后后自动卸载,需要的可以参考一下
    2022-10-10
  • 分享三种Apache配置虚拟主机的方式

    分享三种Apache配置虚拟主机的方式

    这篇文章主要为大家分享了三种Apache配置虚拟主机的方式,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • ubuntu安装显卡驱动和cuda教程

    ubuntu安装显卡驱动和cuda教程

    这篇文章主要介绍了ubuntu安装显卡驱动和cuda教程,文中附有详细的图文安装步骤以及安装配置代码,跟着本文来进行操作,有需要的朋友可以参考下
    2021-09-09
  • Linux持续集成自动化安装Maven的方法

    Linux持续集成自动化安装Maven的方法

    今天小编就为大家分享一篇关于Linux持续集成自动化安装Maven的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03

最新评论