当前位置:首页 > 操作系统实验文件系统设计
if(block_end_flag) { 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_inod=iget(filsys.s_inode[filsys.s_pinode]); fseek(fd,DINODESTART+filsys.s_inode[filsys.s_pinode]*DINODESIZ,SEEK_SET); fwrite(&temp_inod->di_number,1,sizeof(struct dinode),fd); filsys.s_pinode++; filsys.s_ninode--; filsys.s_fmod=SUPDATE; return temp_inod; }
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 9.磁盘块分配与释放函数balloc()与bfree()(文件名ballfre.c) #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+(562-filsys.s_nfree)*BLOCKSIZ,SEEK_SET); fread(block_buf,1,BLOCKSIZ,fd); free_block_num=block_buf[NICFREE]; // the total number in the group for(i=0;i bfree(block_num) unsigned int block_num; { int i; if(filsys.s_free==0) { //s_free full block_buf[NICFREE]=NICFREE; for(i=0;i 10.搜索函数namei()和iname()(文件名name.c) #include unsigned int iname(name) //iname char *name; { int i,notfound=1; for(i=0;((i strcpy(dir.direct[i].d_name,name); dir.direct[i].d_ino=1; return i; } } 11.访问控制函数access()(文件名access.c) #include unsigned int access(user_id,inode,mode) unsigned int user_id; struct inode *inode; unsigned short mode; { switch(mode) { case READ: if(inode->di_mode&ODIREAD) return 1; if((inode->di_mode&GDIREAD) &&(user[user_id].u_gid==inode->di_gid))return 1; if((inode->di_mode&UDIREAD) &&(user[user_id].u_uid==inode->di_uid))return 1; return 0; case WRITE: if(inode->di_mode&ODIWRITE) return 1; if((inode->di_mode&GDIWRITE) &&(user[user_id].u_gid==inode->di_gid))return 1; if((inode->di_mode&UDIWRITE) &&(user[user_id].u_uid==inode->di_uid)) return 1; return 0; case EXECUTE: if(inode->di_mode&ODIEXECUTE) return 1; if((inode->di_mode&GDIEXICUTE) &&(user[user_id].u_gid==inode->di_gid)) return 1; if((inode->di_mode&UDIEXICUTE) &&(user[user_id].u_uid==inode->di_uid)) return 1; return 0; case DEFAULTMODE: return 1; default: return 0; } } 12.显示列表函数_dir()和目录创建函数mkdir()等(文件名dir.c) #include if(temp_inode->di_mode&DIFILE) printf(\ else printf(\ for(j=0;j<9;j++) { one=di_mode%2; di_mode=di_mode/2; if(one) printf(\ } if(temp_inode->di_mode&DIFILE) { printf(\ printf(\ for(k=0;k mkdir(dirname) // mkdir char *dirname; { int dirid,dirpos; struct inode *inode; struct direct buf[BLOCKSIZ/(DIRSIZ+2)]; unsigned int block; dirid=namei(dirname); if(dirid!=0) { inode=iget(dirid); if(inode->di_mode&DIDIR) printf(\ else printf(\ iput(inode); return; } dirpos=iname(dirname); inode=ialloc(); dirid=inode->i_ino; dir.direct[dirpos].d_ino=inode->i_ino; dir.size++; // fill the new dir buf strcpy(buf[0].d_name, \ buf[0].d_ino=dirid; strcpy(buf[1].d_name, \ buf[1].d_ino=cur_path_inode->i_ino; buf[2].d_ino=0; block=balloc(); fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET); fwrite(buf,1,BLOCKSIZ,fd); inode->di_size=2*(DIRSIZ+2); inode->di_number=1; inode->di_mode=user[user_id].u_default_mode|DIDIR; inode->di_uid=user[user_id].u_uid; inode->di_gid=user[user_id].u_gid; inode->di_addr[0]=block;
共分享92篇相关文档