Linux0.11内核源码解析-truncate.c

news2025/1/12 18:07:20

truncate文件只要实现释放指定i节点在设备上占用的所有逻辑块,包括直接块、一次间接块、二次间接块。从而将文件节点对应的文件长度截为0,并释放占用的设备空间。

索引节点的逻辑块连接方式

 

释放一次间接块

static void free_ind(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++) //每个逻辑块上有512块号
			if (*p)
				free_block(dev,*p); //释放指定逻辑块
		brelse(bh);
	}
	free_block(dev,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++) //每个逻辑块可连接512个二级块
			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个逻辑块项全置为0
	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]);
	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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机视觉|生成对抗】逐步增长的生成对抗网络(GAN)以提升质量、稳定性和变化

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Progressive Growing of GANs for Improved Quality, Stability, and Variation 链接&#xff1a;[1710.10196] Progressive Growing of GANs for Improved Quality, Stability, and Vari…

算法与数据结构(七)--堆

一.堆 1.堆的定义 堆是计算机科学中一类特殊的数据结构的通常&#xff0c;堆通常可以被看做是一颗完全二叉树的数组对象。 堆的特性 1.它是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其他的每一层从左到右都是满的&#xff0c;如果最后一层结点不…

Java-仓库管理系统

1. 引言 该文档旨在定义并描述一个仓库管理系统的功能和特性&#xff0c;系统使用MySQL数据库&#xff0c;并采用SpringBootVue的前后端分离开发模式。本文档将涵盖系统的主要功能、用户权限管理、数据结构和交互流程。 2. 功能需求 2.1. 用户管理 系统应该支持用户注册和登…

msvcp140.dll丢失怎样修复?msvcp140.dll重新安装的解决方法

msvcp140.dll是Windows操作系统中的一个重要的动态链接库文件&#xff0c;它包含了许多C标准库函数的实现。当系统中缺少或损坏了msvcp140.dll文件时&#xff0c;可能会导致一些应用程序无法正常运行。下面将介绍几种详细的解决方法&#xff0c;以帮助您解决msvcp140.dll丢失的…

Lnton羚通关于如何使用nanoPC-T4 安装OpenCV?

nanoPC-T4 安装 OpenCV Note: OpenCV has been pre-installed in FriendlyCore/FriendlyDesktop (Version after 201905) and does not require manual installation. Please download the latest FriendlyCore/FriendlyDesktop Image file from the following URL: http://do…

OpenMV与STM32串口通信 (OpenMV、K210、视觉模块 与 STM32单片机、51单片机串口通信,Python与C语言串口通信)

文章目录 Python端编码单片机端解码完整代码 2023/08/18 Python端编码 在Python端&#xff0c;我们想通过串口发送整型或浮点型数据时&#xff0c;可以借助struct.pack对需要发送的数据进行打包&#xff0c;简单来说&#xff0c;当调用这个函数时&#xff0c;设备会将需要发送…

java基础知识学习笔记

1、参考链接 Java 教程 | 菜鸟教程Java 教程 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。 本教程通过简单的实例将让大家更好的了解 Java 编程语言。 移动操…

微人事项目在线聊天(一)

项目首页增加聊天入口 添加一个消息按钮 Home.vue <el-header class"header"><h3 class"title">微人事</h3><div><el-button icon"el-icon-bell" type"text" style"margin-right: 8px;color: #0000…

centos如何查找某一命令对应的安装包

需求背景 有时候在容器里搭建了一个开发环境&#xff0c;需要有些命令能在容器里也能用&#xff0c;但是有时候只知道命令&#xff0c;但是不知道这个命令对应的是哪个安装包提供&#xff0c;比如最简单的命令 ip命令&#xff0c;"ip a"可以查看主机的所有ip信息&am…

Android应用架构-MVVM模式

前言 随着Android应用开发技术的不断发展和成熟&#xff0c;很开发者越来越关注着Android应用架构的设计。目前&#xff0c;Android的应用架构主要有MVC、MVP和MVVM模式&#xff0c;我们就来说一下MVVM模式。 MVP模式 MVVM模式可以说是MVP模式的进一步发展&#xff0c;所以先…

从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值

目录 1. 列表初始化initializer_list 2. 前面提到的一些知识点 2.1 小语法 2.2 STL中的一些变化 3. 右值和右值引用 3.1 右值和右值引用概念 3.2 右值引用类型的左值属性 3.3 左值引用与右值引用比较 3.4 右值引用的使用场景 3.4.1 左值引用的功能和短板 3.4.2 移动…

C语言 http协议

http协议是基于TCP协议之上的&#xff0c;所以首先得用TCP连接到指定服务器上&#xff0c;然后发送http请求。 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <stdio.h> #include…

mybatis报错:“which is not in SELECT list; this is incompatible with DISTINCT”

解决方案参考&#xff1a;https://blog.csdn.net/hyp187/article/details/102721830 总结就是版本问题导致&#xff1a; 使用参考链接中的方案一就解决了&#xff0c;主要是设置 session、global(当前有效&#xff0c;重启MySQL服务后失效&#xff0c;永久生效设置mysqld文件)…

记录一次arcgis engine开发版本引入问题

之前基于arcigs 10.1vs2013开发的程序&#xff0c;现在拿出来要改&#xff0c;但是目前版本是arcgis10.7vs2017/vs2019,打开后无论如何替换引用版本&#xff0c;都报错 &#xff08;具体版本对应可以看这&#xff1a;ArcGIS Engine 与 Visual Studio 版本对照表_vs2019对应啥版…

「UG/NX」Block UI 曲线收集器CurveCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

【Docker环境部署及基础命令操作】

CentOS7安装Docker&#xff08;使用yum安装&#xff09; 参考链接&#xff1a;https://developer.aliyun.com/mirror/docker-ce?spma2c6h.13651102.0.0.1ec41b11RJ4PKS #step 1:安装安装必要的一些系统工具 [rootnode1 ~]# yum install -y yum-utils device-mapper-persiste…

【仿写框架之仿写Tomact】一、Tomcat的工作流程

文章目录 1、启动阶段2、监听阶段&#xff1a;3、请求处理阶段&#xff1a;4、发送请求处理后的响应 当涉及到Java Web应用程序的部署和运行&#xff0c;Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器…

搭建UTMFW

UTMFW 是运行在 OpenBSD 上的 UTM 防火墙 github地址&#xff1a;https://github.com/sonertari/UTMFW 下载镜像&#xff1a; 按操作步骤搭建&#xff08;基本没有差别&#xff09;&#xff1a; Welcome to the OpenBSD/arm64 6.9 installation program. (I)nstall or (S)hell…

使用 PyTorch 进行高效图像分割:第 3 部分

一、说明 在这个由 4 部分组成的系列中&#xff0c;我们将使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。本部分将重点介绍如何使用深度可分离卷积来优化我们的 CNN 基线模型&#xff0c;以减少可训练参数的数量&#xff0c;使模型可部署在移动设备和其他边缘设备上…

阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)推送镜像全过程及总结

前提&#xff1a;安装配置好docker&#xff0c;可参考我这篇 基于CentOS7安装配置docker与docker-compose。 一、设置访问凭证 1.1 容器镜像服务ACR 登录进入阿里云首页&#xff0c;点击 产品-容器-容器镜像服务ACR 点击管理控制台 1.2 进入控制台-点击实例列表 个人容器…