📄 igetput.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 + -