{
int i=0,inodeid; long addr;
unsigned int block_num; struct inode temp;
inodeid = pinode->i_ino%NHINO;
if (pinode->i_count>1) { pinode->i_count--; return 1; } else
{ if (pinode->di_number!=0) { /* write back the inode */
addr=DINODESTART+pinode->i_ino*sizeof(struct dinode);
fseek(fd,addr,SEEK_SET);
fread(&(temp.di_number),sizeof(struct dinode),1,fd); }
fseek(fd,addr,SEEK_SET);
fwrite(&(pinode->di_number),sizeof(struct dinode),1,fd);
else {
/* rm the inoide & the block of the file in the disk */ block_num=pinode->di_size/BLOCKSIZ; for(i=0;i
/*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; }
if(pinode->i_back == pinode) //hash表中该列剩下最后一个inode
hinode[inodeid].i_forw = NULL; free(pinode); }
return 0;
}
8、节点分配和释放函数ialloc( )和ifree( ) ( 文件名iallfre.c)
#include \#include \
static struct dinode block_buf[BLOCKSIZ/DINODESIZ];
struct inode *ialloc( ) /*ialloc */ { struct inode *temp_inode; unsigned int cur_di; int i,count,block_end_flag;
if (filsys.s_pinode==NICINOD) /*s_inode empty */ { i=0; count=0;
block_end_flag=1;
filsys.s_pinode=NICINOD-1; cur_di=filsys.s_rinode;
while ((count { fseek(fd,DINODESTART+cur_di*DINODESIZ,SEEK_SET); fread(block_buf,1,BLOCKSIZ,fd); block_end_flag=0; i=0; } while (block_buf[i].di_mode==DIEMPTY) { cur_di++; i++; } if (i==NICINOD) block_end_flag=1; else { filsys.s_inode[filsys.s_pinode--]=cur_di; count++; } } filsys.s_rinode=cur_di; } temp_inode=iget(filsys.s_inode[filsys.s_pinode]);//分配内存i节点 temp_inode->i_ino = filsys.s_inode[filsys.s_pinode]; //设置磁盘i节点号 fseek(fd,DINODESTART+filsys.s_inode[filsys.s_pinode]*sizeof(struct dinode),SEEK_SET); fwrite(&temp_inode->di_number,1,sizeof(struct dinode),fd); ++ filsys.s_pinode; -- filsys.s_ninode; //磁盘i结点总数-1,置超级块修改标志,返回 filsys.s_fmod=SUPDATE; return temp_inode; } ifree(dinodeid) /*ifree*/ unsigned dinodeid; { filsys.s_ninode++; if (filsys.s_pinode!=NICINOD) /*not full*/ { filsys.s_inode[filsys.s_pinode]=dinodeid; filsys.s_pinode++; } else /*full*/ if (dinodeid { filsys.s_inode[NICINOD]=dinodeid; filsys.s_rinode=dinodeid; } } 9、磁盘块分配与释放函数balloc( )与bfree( ) (文件名ballfre.c) #include \#include \ static unsigned int block_buf[BLOCKSIZ]; unsigned int balloc( ) { unsigned int free_block,free_block_num; int i; if (filsys.s_nfree==0) { printf(\ return DISKFULL; } free_block=filsys.s_free[filsys.s_pfree]; if(filsys.s_pfree==NICFREE-1) { fseek(fd,DATASTART+BLOCKSIZ*(iCur_free_block_index+NICFREE-1),SEEK_SET); fread(block_buf,1,BLOCKSIZ,fd); free_block_num=block_buf[NICFREE]; /*the total block num in the group */ for(i=0;i filsys.s_free[NICFREE-1-i]=block_buf[i]; filsys.s_pfree=NICFREE-free_block_num; } else filsys.s_pfree+=1; filsys.s_nfree-=1; filsys.s_fmod=SUPDATE; return free_block; } bfree(block_num) unsigned int block_num; { int i; if(block_num>=0&&block_num<=3) return; if (filsys.s_pfree==0&&iCur_free_block_index!=11) /*s_free full */ filsys.s_pfree-=1; { block_buf[NICFREE]=NICFREE; for(i=0;i block_buf[i]=filsys.s_free[NICFREE-1-i]; filsys.s_pfree=NICFREE-1; } if(iCur_free_block_index!=11) { iCur_free_block_index-=NICFREE; fseek(fd,DATASTART+BLOCKSIZ*(iCur_free_block_index-1),SEEK_SET); fread(block_buf,1,BLOCKSIZ,fd); filsys.s_nfree++; filsys.s_fmod=SUPDATE; } } 10、搜索函数namei( )和iname( ) ( 文件名name.c) #include \#include \#include \ unsigned int namei(name) /*namei 目录搜索函数*/ char *name; { int i,notfound=1; for(i=0;((i return i; return NULL; /*not find*/ }; unsigned short iname(name) /*iname */ char *name; { int i,notfound=1; for(i=0;((i if (notfound) { printf(\ return 0; } else { strcpy(dir.direct[i].d_name,name); return i; } } ((!strcmp(dir.direct[i].d_name,name)) &&(dir.direct[i].d_ino!=0)) 11、访问控制函数access( ) ( 文件名access.c) #include \ #include \ unsigned int access(user_id,inode,mode) unsigned int user_id; struct inode *inode; unsigned short mode; { int j,k; for(j=0;j if(user[j].u_uid == user_id) { k=j; break; }