Chinaunix首页 | 论坛 | 博客
  • 博客访问: 585558
  • 博文数量: 137
  • 博客积分: 4040
  • 博客等级: 上校
  • 技术积分: 1584
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-08 13:05
文章分类

全部博文(137)

文章存档

2011年(10)

2010年(23)

2009年(104)

分类: 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;// 重置文件和节点修改时间为当前时间

}

阅读(1007) | 评论(0) | 转发(0) |
0

上一篇:bitmap.c

下一篇:inode.c

给主人留下些什么吧!~~