truncate.c

来自「阿基米德操作系统的源代码」· C语言 代码 · 共 85 行

C
85
字号

/////////////////////////////////////////////////
#include "general.h"
#include "s_isdirreg.h"

#include "hd_info_struct.h"
#include "dir_entry.h"
#include "msdos_dir_entry.h"
#include "d_inode.h"
#include "m_inode.h"
#include "buffer_head.h"
#include "fat_cache.h"
#include "file.h"
#include "hd_request_struct.h"
#include "super_block.h"

#include "common_head.h"
/////////////////////////////////////////////////

void free_ind(int dev,int block){	struct buffer_head * bh;	unsigned long      * p;	int i;	if (!block)		return;	if ((bh = bread(dev,block,0)) != NULL){		p = (unsigned long *) bh->b_data;		for (i = 0 ; i < 256 ; i++ , p++)			if (*p){				free_block(dev , *p);
				(*p) = 0;
			}
		bh->b_dirt = 1;		brelse(bh);	}	free_block(dev,block);
	return;}void free_dind(int dev,int block){	struct buffer_head * bh;	unsigned long      * p;	int i;	if (!block)		return;	if ((bh = bread(dev , block, 0)) != NULL){		p = (unsigned long *) bh->b_data;		for (i = 0 ; i < 256 ; i++ , p++)			if (*p){				free_ind(dev , *p);
				(*p) = 0;
			}
		bh->b_dirt = 1;		brelse(bh);	}	free_block(dev , block);
	return;}void truncate(struct m_inode * inode){	int i;	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))		return;	for (i = 0 ; i < 8 ; 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[8]);	free_dind(inode->i_dev,inode->i_zone[9]);	inode->i_zone[8] = 0;
	inode->i_zone[9] = 0;	inode->i_size    = 0;	inode->i_mtime   = file_datetime;
	inode->i_dirt    = 1;
	return;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?