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

📄 inode.c

📁 操作系统课程设计
💻 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 + -