jhluroom 弹jhluroom.blog.chinaunix.net
jhluroom
全部博文(137)
mm(2)
fs(17)
math(1)
boot(3)
init(0)
kernel(12)
blk_drv(4)
chr_drv(5)
源码疑问(1)
2011年(10)
2010年(23)
2009年(104)
高傲的活
小雅贝贝
along819
shiyigud
mcc543
yunpeng_
cynthia
pppstar
Bsolar
badb0y
dadada林
分类: LINUX
2009-08-15 12:52:46
/* * linux/fs/truncate.c * * (C) 1991 Linus Torvalds */#include <linux/sched.h>#include <sys/stat.h>static void free_ind(int dev,int block)// 释放所有一次间接块,dev设备号,block逻辑块号,一般取(free_ind(inode->i_dev,inode->i_zone[7])),inode->i_zone[7]所指向的块中存放着所有的一级间接块号{ struct buffer_head * bh; unsigned short * p; int i; if (!block)// 如果逻辑块号为0,则返回 return; if (bh=bread(dev,block)) {//( 一般从inode->i_zone[7]中读取)读取一次间接块,并释放其上表明使用的所有逻辑块,然后释放该一次间接块的缓冲区,(从指定设备上读取指定的数据块,dev 为设备号,读后放在高速缓冲区中) p = (unsigned short *) bh->b_data;//大小为1024字节,里边放的是一级间节块号,都 为整型类型的块号 for (i=0;i<512;i++,p++)//大小为1024字节,每个整型为2个字节,所以最多可以有512个整型,也就是说最多可以放512个一级间节块号 if (*p) free_block(dev,*p);// 释放设备dev 上数据区中的逻辑块block brelse(bh);// 本任务释放指定的高速缓冲块区 } free_block(dev,block);// 释放设备dev 上数据区中的逻辑块block,(一般block=inode->i_zone[7])}static void free_dind(int dev,int block)// 释放所有二次间接块,dev设备号,block逻辑块号,一般取(free_ind(inode->i_dev,inode->i_zone[8])),inode->i_zone[8]所指向的块中存放着所有的二级间接块的一级间接块号,中间调用 free_ind函数{ struct buffer_head * bh; unsigned short * p; int i; if (!block) return; if (bh=bread(dev,block)) {//( 一般从inode->i_zone[8]中读取)读取二次间接块, 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);// 释放设备dev 上数据区中的逻辑块block,(一般block=inode->i_zone[8])}void truncate(struct m_inode * inode)//截断文件数据函数,将节点对应的文件长度截为0,并释放占用的设备空间{ int i; if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))// 如果不是常规文件或者是目录文件,则返回 return; for (i=0;i<7;i++)// 释放i 节点的7 个直接逻辑块,并将这7 个逻辑块项全置零 if (inode->i_zone[i]) { free_block(inode->i_dev,inode->i_zone[i]);// 释放设备dev 上数据区中的逻辑块block inode->i_zone[i]=0;// 释放i 节点的7 个直接逻辑块,并将这7 个逻辑块项全置零 } 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;//逻辑块项7、8置0 inode->i_size = 0;// 文件大小置零 inode->i_dirt = 1;// 置节点已修改标志 inode->i_mtime = inode->i_ctime = CURRENT_TIME;// 重置文件和节点修改时间为当前时间}
上一篇:bitmap.c
下一篇:inode.c
登录 注册