服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Linux中文件系统truncate.c详解

Linux中文件系统truncate.c详解

2023-03-27 14:10程序员小x Linux

这篇文章主要介绍了Linux中文件系统truncate.c详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

free_ind

?
1
static void free_ind(int dev,int block)

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

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

?
1
2
3
4
5
6
7
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。最后将这个一次间接块也进行释放。

?
1
2
3
4
5
for (i=0;i<512;i++,p++)
    if (*p)
        free_block(dev,*p);
brelse(bh);
free_block(dev,block);

free_dind

?
1
static void free_dind(int dev,int block)

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

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

?
1
2
3
4
5
6
struct buffer_head * bh;
unsigned short * p;
int i;
 
if (!block)
    return;

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

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

?
1
2
3
4
5
6
7
8
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

?
1
void truncate(struct m_inode * inode)

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

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

?
1
2
3
4
int i;
 
if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
    return;

释放直接引用块。

?
1
2
3
4
5
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;
    }

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

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

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

?
1
2
3
4
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内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_31442743/article/details/129709267

延伸 · 阅读

精彩推荐
  • LinuxLinux多线程编程(一)

    Linux多线程编程(一)

    linux多线程设计是指基于Linux操作系统下的多线程设计,包括多任务程序的设计,并发程序设计,网络程序设计,数据共享等。Linux系统下的多线程遵循POSIX线...

    Linux教程网11452021-10-19
  • Linuxlinux中叹号命令(!)的使用小结

    linux中叹号命令(!)的使用小结

    这篇文章主要给大家介绍了关于linux中叹号命令(!)的使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价...

    H_Man4162022-08-01
  • LinuxLinux内核设备驱动之内核的时间管理笔记整理

    Linux内核设备驱动之内核的时间管理笔记整理

    今天小编就为大家分享一篇关于Linux内核设备驱动之内核的时间管理笔记整理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋...

    Engineer-Bruce_Yang10752022-08-09
  • LinuxLinux内核参数调整方法

    Linux内核参数调整方法

    由于Linux的内核参数信息都存在内存中,因此可以通过命令直接修改,并且修改后直接生效。但是,当系统重新启动后,原来设置的参数值就会丢失,而系...

    Lenix6962022-02-22
  • LinuxLinux下安装Keepalived及原理分析

    Linux下安装Keepalived及原理分析

    这篇文章主要介绍了在Linux环境下安装Keepalived及原理分析,有兴趣的朋友学习参考下吧。...

    Linux教程网4512022-02-24
  • LinuxLinux如何禁止特定ip地址访问来保证系统的安全

    Linux如何禁止特定ip地址访问来保证系统的安全

    如果你需要禁止特定ip地址访问来保证系统的安全,只需通过操作iptalbes来实现,下面为大家介绍下Linux如何禁止某个ip地址访问的方法,需要的朋友不要错...

    Linux系统之家5192019-09-29
  • LinuxLinux系统中基本的用户管理方法

    Linux系统中基本的用户管理方法

    这篇文章主要介绍了Linux系统中基本的用户管理方法,是Linux入门学习中的基础知识,需要的朋友可以参考下...

    大步's blog5172019-09-06
  • LinuxLinux使用sed命令替换字符串教程

    Linux使用sed命令替换字符串教程

    在本篇文章中小编给大家分享了关于Linux下如何使用sed命令替换字符串的相关知识点内容,有需要的朋友们学习下。...

    Linux教程网5482022-08-15