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

📄 inode.c

📁 一个用C++写的模拟LINUX文件系统的程序
💻 C
字号:
/* inode.c */

#include "inode.h"

/* return inode numbers, and return -1 if free inode is nil */
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){ /* if more than one block */
	i = super.free_inode_stack[0];
	ind_no = super.free_inode_stack[i];

	super.free_inode_stack[0] -= 1;
	super.free_inode_count--;

	/* if stack was empty and free blocks not nil, update the stack */
	if((super.free_inode_stack[0]==0) && (super.free_inode_count>0)){
	    int j = 0;
	    struct fs_inode inode;

	    for( i=super.remembered_inode; i<TOTAL_INODES; 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 */

	fseek( fp, sizeof(struct fs_boot), SEEK_SET); /* write back */
	fwrite( &super, sizeof(super), 1, fp);
	
	return ind_no;
    }
    else
	return -1;
}


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 */
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 + -