📄 iallfre.c
字号:
/************************************************/
/* */
/* iallfre.c */ // 完成
/* */
/************************************************/
#include <stdio.h>
#include "filsys.h"
static struct dinode block_buf[BLOCKSIZ / DINODESIZ];
struct inode * ialloc()
{ struct filsys aaa;
struct inode * temp_inode;
unsigned int cur_di,temp;
int i;
if( filsys.s_ninode == 0 ) /* 没有空闲磁盘i节点 */
{
printf( "No leisure dinode!\n" );
return NULL;
}
if( filsys.s_pinode == NICINOD ) /* 空闲磁盘i节点栈空 */
{
cur_di = filsys.s_rinode;
if( filsys.s_ninode >= NICINOD ) /* 空闲磁盘i节点数可装满空闲i节点栈 */
{
filsys.s_pinode = 0;
/* 把下一组磁盘i节点读进空闲磁盘i节点栈 */
while( filsys.s_pinode < NICINOD )
{
fseek (fd, DINODESTART + cur_di * DINODESIZ, SEEK_SET);
fread (block_buf, 1, BLOCKSIZ, fd);
for( i = 0; ( i < BLOCKSIZ / DINODESIZ ) && ( filsys.s_pinode < NICINOD ); )
{
if( block_buf[i].di_mode == DIEMPTY ) /* 该磁盘i节点空闲 */
{
filsys.s_inode[filsys.s_pinode] = cur_di; /* 把该i节点装入空闲栈 */
filsys.s_pinode++; /* 栈指针下移一位 */
}
i++;
cur_di++;
}
}
filsys.s_pinode = 0;
}
else /* 剩下的空闲磁盘i节点不能装满栈区 */
{
/* 计算出空闲栈指针装入i节点的第一个位置 */
filsys.s_pinode = NICINOD - filsys.s_ninode;
while( filsys.s_pinode < NICINOD )
{
fseek (fd, DINODESTART + cur_di * DINODESIZ, SEEK_SET);
fread (block_buf, 1, BLOCKSIZ, fd);
for( i = 0; ( i < BLOCKSIZ / DINODESIZ ) && ( filsys.s_pinode < filsys.s_ninode ); )
{
if( block_buf[i].di_mode == DIEMPTY )
{
filsys.s_inode[filsys.s_pinode] = cur_di;
filsys.s_pinode++;
}
i++;
cur_di++;
}
}
filsys.s_pinode = NICINOD - filsys.s_ninode;
}
}
/* 初始化磁盘i节点 */
// temp_inode = iget( filsys.s_inode[filsys.s_pinode] );
// temp_inode->i_number = 1;
// temp_inode->i_uid = user[user_id].u_uid;
// temp_inode->i_gid = user[user_id].u_gid;
// temp_inode->i_size = 0;
// temp_inode->i_addr[0] = 0;
// iput( temp_inode );
/* 分配内存i节点 */
temp_inode = iget( filsys.s_inode[filsys.s_pinode] );
/* 从磁盘i节点读取数据到内存i节点 */
fseek( fd, DINODESTART + filsys.s_inode[filsys.s_pinode] * DINODESIZ, SEEK_SET );
fwrite( &temp_inode->i_number, 1, sizeof(struct dinode), fd );
filsys.s_pinode++; /* 栈指针下移一位 */
filsys.s_ninode--; /* 空闲磁盘i节点又少了一个 */
// filsys.s_fmod = SUPDATE; /* 置超级块修改标志 */
aaa=filsys;
return temp_inode;
}
ifree(unsigned int dinodeid)
{
filsys.s_ninode++; /* 空闲磁盘i节点加1 */
if( filsys.s_pinode != 0 ) /* 空闲磁盘i节点栈未满 */
{
/* 直接回收 */
filsys.s_pinode--;
filsys.s_inode[filsys.s_pinode] = dinodeid;
}
else /* 空闲磁盘i节点栈已满 */
{
if( dinodeid < filsys.s_rinode ) /* 磁盘i节点号小于铭记i节点号 */
{
filsys.s_inode[0] = dinodeid; /* 回收 */
filsys.s_rinode = dinodeid; /* 把新回收的i节点作为铭记i节点 */
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -