📄 buffer.c
字号:
#include "general.h"
#include "sti_cli.h"
#include "hd_info_struct.h"
#include "dir_entry.h"
#include "msdos_dir_entry.h"
#include "d_inode.h"
#include "m_inode.h"
#include "buffer_head.h"
#include "fat_cache.h"
#include "file.h"
#include "hd_request_struct.h"
#include "super_block.h"
#include "common_head.h"
int sys_sync(void){ struct buffer_head * bh; int i;
sync_inodes();
sys_sync_0: for (i = 0, bh = start_buffer; i < nr_buffers; i++,bh++)
if (((bh < sys_buffer) || (bh->b_count == 0)) && (bh->b_lock == 0) && (bh->b_dirt))
if (ll_rw_block_0(bh) <= 0) {
ll_rw_block_1();
goto sys_sync_0;
}
ll_rw_block_1(); return 0;}
struct buffer_head * bread(int dev, int block, unsigned char floppy_importflag)
{
struct buffer_head * bh;
int i;
for (bh = hash_table[block % NR_HASH] ; bh != NULL ; bh = bh->b_next)
if (bh->b_dev == dev && bh->b_blocknr == block){
while (bh->b_lock);
if (!(bh->b_uptodate & 0x01))
{
if (floppy_importflag == 0x80)
floppy_workstate = -1;
return NULL;
}
bh->b_uptodate = bh->b_uptodate | floppy_importflag;
if ((bh->b_count == 0) && (bh->b_dirt == 0)){
cli();
bh->b_prev_free->b_next_free = bh->b_next_free;
bh->b_next_free->b_prev_free = bh->b_prev_free;
if (free_list == bh)
free_list = bh->b_next_free;
if (free_list == bh)
free_list = NULL;
sti();
bh->b_prev_free = bh->b_next_free = bh;
}
bh->b_count++;
return bh;
}
while (free_list == NULL){
for (i = 0; i < SYNC_BUFFERS; i++){
if (((current_buffer < sys_buffer) || (current_buffer->b_count == 0)) &&
(current_buffer->b_lock == 0) && (current_buffer->b_dirt))
if (ll_rw_block_0(current_buffer) <= 0)
break;
current_buffer++;
if (current_buffer == end_buffer)
current_buffer = start_buffer;
}
ll_rw_block_1();
}
cli();
bh = free_list;
bh->b_prev_free->b_next_free = bh->b_next_free;
bh->b_next_free->b_prev_free = bh->b_prev_free;
free_list = bh->b_next_free;
if (free_list == bh)
free_list = NULL;
sti();
bh->b_prev_free = bh->b_next_free = bh;
if (bh->b_next)
bh->b_next->b_prev = bh->b_prev;
if (bh->b_prev)
bh->b_prev->b_next = bh->b_next;
if (hash_table[bh->b_blocknr % NR_HASH] == bh)
hash_table[bh->b_blocknr % NR_HASH] = bh->b_next;
bh->b_prev = NULL;
bh->b_next = NULL;
bh->b_dev = dev;
bh->b_blocknr = block;
bh->b_uptodate = floppy_importflag;
bh->b_dirt = 0;
bh->b_count = 1;
bh->b_next = hash_table[bh->b_blocknr % NR_HASH];
hash_table[bh->b_blocknr % NR_HASH] = bh;
if (bh->b_next)
bh->b_next->b_prev = bh;
ll_rw_block_2(bh);
while (bh->b_lock);
if (bh->b_uptodate & 0x01)
return bh;
else {
bh->b_count = 0;
cli();
if (free_list == NULL)
free_list = bh;
else {
bh->b_next_free = free_list;
bh->b_prev_free = free_list->b_prev_free;
free_list->b_prev_free->b_next_free = bh;
free_list->b_prev_free = bh;
free_list = bh;
}
sti();
return NULL;
}
return NULL;
}
void brelse(struct buffer_head * buf){ if (!buf || (buf->b_count == 0))
return;
buf->b_count--;
if ((buf->b_count == 0) && (buf->b_dirt == 0)){
cli();
if (free_list == NULL)
free_list = buf;
else {
buf->b_next_free = free_list;
buf->b_prev_free = free_list->b_prev_free;
free_list->b_prev_free->b_next_free = buf;
free_list->b_prev_free = buf;
}
sti();
}
return;
}
///////////////////////////////////////////////////////////////////////
int ll_rw_block_0(struct buffer_head * bh)
{
int temp_ret;
if (bh->b_dev == 0)
temp_ret = ll_rw_block_f0(bh);
else
temp_ret = ll_rw_block_h0(bh);
return temp_ret;
}
void ll_rw_block_1(void)
{
ll_rw_block_f1();
ll_rw_block_h1();
return;
}
int ll_rw_block_2(struct buffer_head * bh)
{
int temp_ret;
if (bh->b_dev == 0)
temp_ret = ll_rw_block_f2(bh);
else
temp_ret = ll_rw_block_h2(bh);
return temp_ret;
}
///////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -