📄 inode.c
字号:
/* inode.c */
#include "inode.h"
//返回分配到的ionde号
int get_ind(FILE *fp)
{
struct fs_super super;
fseek( fp, sizeof(struct fs_boot), SEEK_SET); /* skip boot block */
fread( &super, sizeof(super), 1, fp);
int i, ind_no;
if(super.free_inode_count > 0){
i = super.free_inode_stack[0];
ind_no = super.free_inode_stack[i];
super.free_inode_stack[0] -= 1;//空闲inode弹出一个,向下走
super.free_inode_count--;//空闲inode个数减1
//空闲inode栈已满而inode还没分完,那么重新建立一个空闲inode栈
if((super.free_inode_stack[0]==0) && (super.free_inode_count>0))
{
int j = 0;
struct fs_inode inode;
//从上次记录的已分配的最大结点号开始,再建一个空闲inode栈
for( i=super.remembered_inode; i<TOTAL_INODES; i++)//i即结点号,最大可到结点的数目-1
{
//读取第i个结点
fseek( fp, INODE_OFFSET(i), SEEK_SET);
fread( &inode, sizeof(inode), 1, fp);
if(inode.type == 'i')//如果是空闲结点
{
super.free_inode_stack[0] += 1;
j = super.free_inode_stack[0];
super.free_inode_stack[j] = i;
}
if(j == STACK_MAX){
super.remembered_inode = i + 1;//记录当前的已分配的最大结点号
break;
}
}
} /* end of if */
//因为super块的数据修改了,要重新写回
fseek( fp, sizeof(struct fs_boot), SEEK_SET); /* write back */
fwrite( &super, sizeof(super), 1, fp);
return ind_no;
}
else
return -1;
}
//释放一个inode
int free_ind( FILE *fp, int ind_no)
{
struct fs_inode inode; /* write the free inode back to inode table*/
inode.type = 'i'; /* mark as free */
fseek( fp, INODE_OFFSET(ind_no), SEEK_SET);
fwrite( &inode, sizeof(inode), 1, fp);
struct fs_super super; /* update the super */
fseek( fp, sizeof(struct fs_boot), SEEK_SET);
fread( &super, sizeof(super), 1, fp);
int i;
if(super.free_inode_stack[0] == STACK_MAX &&
super.remembered_inode > ind_no)
{
super.remembered_inode = ind_no;
}
else if(super.free_inode_stack[0] < STACK_MAX){
super.free_inode_stack[0] += 1;
i = super.free_inode_stack[0];
super.free_inode_stack[i] = ind_no;
}
/* else the ind_no locate in next free inode collecting */
fseek( fp, sizeof(struct fs_boot), SEEK_SET); /* write back */
fwrite( &super, sizeof(super), 1, fp);
return 0;
}
/* update the provider inode data */
//写入一个ionde
int update_ind( FILE *fp, int ind_no, struct fs_inode inode)
{
fseek( fp, INODE_OFFSET(ind_no), SEEK_SET);
fwrite( &inode, sizeof(inode), 1, fp);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -