📄 block.c
字号:
/* block.c */
#include "block.h"
//返回当前在空闲块栈顶的空闲块号
int get_blk(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, blk_no;
if(super.free_block_count > 0){ /* if more than one block */
i = super.free_block_stack[0];//当前空闲块的索引值
blk_no = super.free_block_stack[i];//当前空闲块的块号
super.free_block_stack[0] -= 1; /* update the relative variable */
super.free_block_count--;//空闲块数目少1
//如果栈滿并且还有空闲块,则重新载入新的空闲块的栈
if((super.free_block_stack[0]==0) && (super.free_block_count>0)){
fseek( fp, BLOCK_SIZE*(INODE_TABLE_BLOCKS + 1 + blk_no), SEEK_SET);
fread( &super.free_block_stack, sizeof(super.free_block_stack), 1, fp);
}
fseek( fp, sizeof(struct fs_boot), SEEK_SET);
fwrite( &super, sizeof(super), 1, fp);
return blk_no;
}
else /* if free blocks is none*/
return -1;
}
//释放磁盘块
int free_blk(FILE *fp, int blk_no)
{
struct fs_super super;
fseek( fp, sizeof(struct fs_boot), SEEK_SET);
fread( &super, sizeof(super), 1, fp);
int i;
if(super.free_block_stack[0] == STACK_MAX){ /* if stack was full */
//在释放的位置写入新的空闲块
fseek( fp, BLOCK_SIZE*(INODE_TABLE_BLOCKS + 1 + blk_no), SEEK_SET);
fwrite( &super.free_block_stack, sizeof(super.free_block_stack), 1, fp);
super.free_block_count++; /* update the super */
super.free_block_stack[0] = 1;
super.free_block_stack[1] = blk_no;
}
else{
super.free_block_count++;
super.free_block_stack[0] += 1;
i = super.free_block_stack[0];
super.free_block_stack[i] = blk_no;//把刚释放的磁盘块号放在栈顶,这样就保证了总会先分配低块号的块
}
fseek( fp, sizeof(struct fs_boot), SEEK_SET); /* write back */
fwrite( &super, sizeof(super), 1, fp);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -