linux 0.11 内核学习 -- truncate.c

本文详细解析了Linux内核中的truncate函数,该函数用于将文件长度截为0并释放所占设备空间。文章介绍了如何释放直接块、一次间接块及二次间接块,以及更新文件元数据的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*

* 该文件主要实现的是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内核完全注释》和网上相关资料

root@ubuntu:/share/valgrind-3.15/valgrind-3.15.0# ./configure --host=arm-unknown-linux-gnueabihf --prefix=/share/valgrind-3.15/valgrind-3.15.0/_install/ checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for arm-unknown-linux-gnueabihf-strip... arm-unknown-linux-gnueabihf-strip checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether make supports nested variables... yes checking whether to enable maintainer-specific portions of Makefiles... no checking whether ln -s works... yes checking for arm-unknown-linux-gnueabihf-gcc... arm-unknown-linux-gnueabihf-gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... yes checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether arm-unknown-linux-gnueabihf-gcc accepts -g... yes checking for arm-unknown-linux-gnueabihf-gcc option to accept ISO C89... none needed checking whether arm-unknown-linux-gnueabihf-gcc understands -c and -o together... yes checking for style of include used by make... GNU checking dependency style of arm-unknown-linux-gnueabihf-gcc... gcc3 checking how to run the C preprocessor... arm-unknown-linux-gnueabihf-gcc -E checking for arm-unknown-linux-gnueabihf-g++... arm-unknown-linux-gnueabihf-g++ checking whether we are using the GNU C++ compiler... yes checking whether arm-unknown-linux-gnueabihf-g++ accepts -g... yes checking dependency style of arm-unknown-linux-gnueabihf-g++... gcc3 checking for arm-unknown-linux-gnueabihf-ranlib... arm-unknown-linux-gnueabihf-ranlib checking for gcc-ranlib... /usr/bin/gcc-ranlib checking for a sed that does not truncate output... /bin/sed checking for ar... /usr/bin/ar checking for gcc-ar... /usr/bin/gcc-ar checking for perl... /usr/bin/perl checking for gdb... /usr/bin/gdb checking dependency style of arm-unknown-linux-gnueabihf-gcc... gcc3 checking for diff -u... yes checking for arm-unknown-linux-gnueabihf-gcc option to accept ISO C99... none needed checking for a supported version of gcc... ok (12.3.0) checking build system type... x86_64-unknown-linux-gnu checking host system type... arm-unknown-linux-gnueabihf checking for a supported CPU... no (arm) configure: error: Unsupported host architecture. Sorry
最新发布
04-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值