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

📄 igetput.c

📁 此版本是在网上广为流传的 二级文件系统 基础上制作的.重新编写了块操作等模块,修正了N多BUG. 实现的命令有 ls-列目录 md-创建目录 cd-进入子目录 mf-创建文件 cat-显示文件内
💻 C
字号:
#include <stdio.h>
#include "filesys.h"

struct inode * iget(dinodeid)    /*  iget()  */
unsigned int dinodeid;
{
   int existed=0,inodeid;
   long addr;
   struct inode *temp, *newinode;
   inodeid=dinodeid % NHINO;
   if(hinode[inodeid].i_forw==NULL)  existed=0;
   else
   {
    temp=hinode[inodeid].i_forw;
    while(temp)
    {
        if(temp->i_ino==inodeid)
       /*existed */
        {    existed=1;
            temp->i_count++;
            return temp;
        }
        /*not existed*/
        else
            temp=temp->i_forw;
   };
    }
    /*  not existed  */
   /*  1.  calculate the addr of the dinode in the file sys column  */
       addr=DINODESTART+dinodeid*DINODESIZ;
   /*  2.  malloc the new inode  */
       newinode=(struct inode *)malloc (sizeof (struct inode));
       /*  3.  read the dinode to the inode  */
       fseek(fd,addr,SEEK_SET);
       fread(&(newinode->di_number),DINODESIZ,1,fd);
   /*  4.  put it into hinode [inodeid]queue  */
    newinode->i_forw=hinode[inodeid].i_forw;
       newinode->i_back=newinode;
if(newinode->i_forw!=NULL)
       newinode->i_forw->i_back=newinode;
        hinode[inodeid].i_forw=newinode;
   /*   5.  initialize the inode  */
       newinode->i_count=1;
       newinode->i_flag=0;  /*f1ag for not update */
       newinode->i_ino=dinodeid;
        newinode->di_size=3*(DIRSIZ+2);
 if(dinodeid == 3) newinode->di_size=BLOCKSIZ;
   return newinode;
   }
   
  iput(pinode)    /*iput()*/
   struct inode * pinode;
   {
     long addr;
     unsigned int block_num;
     int i;
     if(pinode->i_count>1)
     {
       pinode->i_count--;
        return;
     }
     else
     {
          if(pinode->di_number!=0)
       {
             /*  write back the inode  */
           addr=DINODESTART+pinode->i_ino*DINODESIZ;
           fseek(fd,addr,SEEK_SET);
           fwrite(&pinode->di_number,DINODESIZ,1,fd);
        }
        else  
        {
         /*  rm the inode & the block of the file in the disk  */
         block_num=pinode->di_size/BLOCKSIZ;
         for(i=0;i<block_num;i++)
         {
            bfree(pinode->di_addr[i]);
         }
         ifree(pinode->i_ino);
       };
       /*  free the inode in the memory  */
       if(pinode->i_forw==NULL)
           pinode->i_back->i_forw=NULL;
        else
        {
           pinode->i_forw->i_back=pinode->i_back;
           pinode->i_back->i_forw=pinode->i_forw;
        };
       ifree(pinode);
    };
 }

⌨️ 快捷键说明

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