⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmap.c

📁 阿基米德操作系统的源代码
💻 C
字号:

///////////////////////////////////////////////////////////////////////////
#include "general.h"
#include "clear_block.h"
#include "set_clear_bit.h"
#include "find_first_zero.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_block(int dev, int block){	struct super_block * sb;	struct buffer_head * bh;	
	if (dev >= nr_super_blocks)
		return;
	sb = &the_super_block[dev];
	if ((block < sb->s_firstdatazone) || (block >= sb->s_nzones))
		return;	block -= sb->s_firstdatazone;
	if (!(bh = sb->s_zmap[block >> 13]))
		return;
	while (bh->b_lock);
	if (clear_bit(block & 8191,bh->b_data)) 
		return;
	bh->b_dirt = 1;
	return;}int new_block(int dev){	struct super_block * sb;
	struct buffer_head * bh, * bh0;	int    i,j,j0;
	if (dev >= nr_super_blocks)
		return 0;
	sb = &the_super_block[dev];

	j = 8192;	for (i = 0 ; i<8 ; i++)		if ((bh = sb->s_zmap[i]) != NULL){
			while (bh->b_lock);			if ((j = find_first_zero(bh->b_data)) < 8192)				break;
		}	if ((j >= 8192) || ((j0 = sb->s_firstdatazone + i * 8192 + j) >= sb->s_nzones))		return 0;
	if (!(bh0 = bread(dev,j0,0)))
		return 0;
	clear_block(bh0->b_data);
	bh0->b_dirt = 1;
	brelse(bh0);
	set_bit(j,bh->b_data);	bh->b_dirt = 1;	return j0;}void free_inode(struct m_inode * inode){	struct super_block * sb;	struct buffer_head * bh;	if (!inode || (inode->i_dev >= nr_super_blocks))
		return;
	sb = &the_super_block[inode->i_dev];
	if ((inode->i_num < 1) || (inode->i_num > sb->s_ninodes))
		return;	if (!(bh = sb->s_imap[inode->i_num >> 13]))
		return;
	while (bh->b_lock);	if (clear_bit(inode->i_num & 8191,bh->b_data))
		return;	bh->b_dirt = 1;	memset(inode,0,sizeof(*inode));
	return;}struct m_inode * new_inode(int dev){	struct super_block * sb;
	struct buffer_head * bh;
	struct m_inode     * inode;	int    i,j;

	if (dev >= nr_super_blocks)
		return NULL;
	sb = &the_super_block[dev];
	if (!(inode = get_empty_inode()))		return NULL;
	j = 8192;	for (i = 0 ; i < 8 ; i++)		if ((bh = sb->s_imap[i]) != NULL){
			while (bh->b_lock);			if ((j = find_first_zero(bh->b_data)) < 8192)				break;
		}	if ((j >= 8192) || (i * 8192 + j > sb->s_ninodes)) {		inode->i_count = 0;		return NULL;	}

	set_bit(j,bh->b_data);
	bh->b_dirt = 1;
	inode->i_nlinks = 1;
	inode->i_mtime  = file_datetime;		inode->i_dev    = dev;
	inode->i_num    = i * 8192 + j;
	inode->i_dirt   = 1;	return inode;}

⌨️ 快捷键说明

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