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

📄 inode.c

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

///////////////////////////////////////////////////
#include "general.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 sync_inodes(void){	struct m_inode * inode;
	int i;	for (i = 0, inode = inode_table; i < NR_INODE ; i++ , inode++) 
	{
		if (inode->i_dirt)
		{
			if (inode->i_dev)				write_inode(inode);
			else
				msdos_write_inode(inode);
		}	}
	return;}int _bmap(struct m_inode * inode,int block,int create){	struct buffer_head * bh;	unsigned long i;	if ((block < 0) || (block >= 8 + 256 + 256 * 256))		return 0;	if (block < 8) {		if (create && !inode->i_zone[block])			if ((inode->i_zone[block] = new_block(inode->i_dev)) != 0){				inode->i_mtime       = file_datetime;				inode->i_dirt        = 1;			}		return inode->i_zone[block];	}	block -= 8;	if (block < 256) {		if (create && !inode->i_zone[8])			if ((inode->i_zone[8] = new_block(inode->i_dev)) != 0){				inode->i_mtime   = file_datetime;
				inode->i_dirt    = 1;			}		if (!inode->i_zone[8])			return 0;		if (!(bh = bread(inode->i_dev,inode->i_zone[8],0)))			return 0;		i = ((unsigned long *) (bh->b_data))[block];		if (create && !i)			if ((i = new_block(inode->i_dev)) != 0){				((unsigned long *) (bh->b_data))[block] = i;				bh->b_dirt		= 1;
				inode->i_mtime	= file_datetime;
				inode->i_dirt	= 1;			}		brelse(bh);		return i;	}	block -= 256;	if (create && !inode->i_zone[9])		if ((inode->i_zone[9] = new_block(inode->i_dev)) != 0){			inode->i_mtime = file_datetime;
			inode->i_dirt  = 1;		}	if (!inode->i_zone[9])		return 0;	if (!(bh = bread(inode->i_dev,inode->i_zone[9],0)))		return 0;	i = ((unsigned long *)bh->b_data)[block >> 8];	if (create && !i)		if ((i = new_block(inode->i_dev)) != 0){			((unsigned long *) (bh->b_data))[block >> 8] = i;			bh->b_dirt		= 1;
			inode->i_mtime	= file_datetime;
			inode->i_dirt	= 1;		}	brelse(bh);	if (!i)		return 0;	if (!(bh = bread(inode->i_dev,i,0)))		return 0;	i = ((unsigned long *)bh->b_data)[block & 255];	if (create && !i)		if ((i = new_block(inode->i_dev)) != 0){			((unsigned long *) (bh->b_data))[block & 255] = i;			bh->b_dirt		= 1;
			inode->i_mtime	= file_datetime;
			inode->i_dirt	= 1;		}	brelse(bh);	return i;}int bmap(struct m_inode * inode,int block){	return _bmap(inode,block,0);}int create_block(struct m_inode * inode, int block){	return _bmap(inode,block,1);}
struct m_inode * get_empty_inode(void)
{
	struct m_inode * inode;
	int    inr;

	inr   = last_allocated_inode;
	do {
		if (!inode_table[inr].i_count) {
			last_allocated_inode = inr;			
			inode = inode_table + inr;
			memset(inode,0,sizeof(*inode));
			inode->i_count = 1;
			return inode;
		}
		inr++;
		if (inr == NR_INODE)
			inr=0;
	} while (inr != last_allocated_inode);

	return NULL;
}
		void iput(struct m_inode * inode){	if (!inode || (!inode->i_count))		return;
	inode->i_count--;
	if (inode->i_count)
		return;
	if (!inode->i_nlinks) {		truncate(inode);		free_inode(inode);
		return;	}	if (inode->i_dirt)		write_inode(inode);		return;}struct m_inode * iget(int dev,int nr){	struct m_inode * inode;	inode = inode_table;	while (inode < inode_table + NR_INODE) {		if (inode->i_dev == dev && inode->i_num == nr) {			inode->i_count++;			return inode;		}		inode++;
	}
	inode = get_empty_inode();	if (!inode)		return NULL;	inode->i_dev = dev;	inode->i_num = nr;	if (read_inode(inode))		return inode;
	else
	{
		memset(inode,0,sizeof(*inode));
		return NULL;
	}}int read_inode(struct m_inode * inode){	struct super_block * sb;	struct buffer_head * bh;	int    block;
	if (!inode || (inode->i_dev >= nr_super_blocks))
		return 0;
	sb = &the_super_block[inode->i_dev];
	block = 1 + sb->s_imap_blocks + sb->s_zmap_blocks + (inode->i_num - 1) / INODES_PER_BLOCK;	bh = bread(inode->i_dev,block,0);
	if (bh){		*(struct d_inode *)inode = ((struct d_inode *)bh->b_data)[(inode->i_num - 1) % INODES_PER_BLOCK];		brelse(bh);
		inode->i_dirt = 0;
		return 1;
	}
	return 0;}int write_inode(struct m_inode * inode){	struct super_block * sb;	struct buffer_head * bh;	int    block;	if (!inode || (inode->i_dev >= nr_super_blocks))
		return 0;
	sb = &the_super_block[inode->i_dev];
	block = 1 + sb->s_imap_blocks + sb->s_zmap_blocks + (inode->i_num - 1) / INODES_PER_BLOCK;	bh = bread(inode->i_dev,block,0);
	if (bh){		((struct d_inode *)bh->b_data)[(inode->i_num - 1) % INODES_PER_BLOCK] = *(struct d_inode *)inode;		bh->b_dirt    = 1;
		brelse(bh);
		inode->i_dirt = 0;
		return 1;
	}
	return 0;}

⌨️ 快捷键说明

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