⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fd.c

📁 阿基米德操作系统的源代码
💻 C
字号:
//////////////////////////////////////////////////////////////////////////////
#include "general.h"
#include "sti_cli.h"
#include "in_order.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 ll_rw_block_f0(struct buffer_head * bh)
{
	unsigned int temp_block,temp_block_0;
	unsigned int temp_cyl,temp_head,temp_sec;
	struct hd_request_struct * temp_req , * temp_req_0;

	///////////////////////////////////////////
	temp_block = bh->b_blocknr << 1;
	if (temp_block >= 2880)
		return -1;

	temp_block_0 = temp_block;

	temp_sec	 = temp_block % 18;
	temp_block	 = temp_block / 18;
	temp_head	 = temp_block % 2;
	temp_cyl	 = temp_block / 2;
	///////////////////////////////////////////
	
	temp_req = current_req;
	do {
		if (temp_req->hd < 0){
			current_req = temp_req;
			break;
		}
		temp_req++;
		if (temp_req == hd_request + NR_REQUEST)
			temp_req = hd_request;
	} while (temp_req != current_req);

	if (temp_req->hd >= 0)
		return 0;

	bh->b_lock = 1;

	temp_req->hd		= 0;
	temp_req->block		= temp_block_0;
	temp_req->cyl		= temp_cyl;
	temp_req->head		= temp_head;
	temp_req->sector	= temp_sec + 1;
	temp_req->nsector	= 2;
	temp_req->cmd		= 0;
	temp_req->errors	= 0;
	temp_req->bh		= bh;
	temp_req->next		= NULL;

	if (start_request_f0 == NULL){
		start_request_f0 = temp_req;
		end_request_f0	 = temp_req;
		return 1; 
	}

	if IN_ORDER(temp_req,start_request_f0){
		temp_req->next		= start_request_f0;
		start_request_f0	= temp_req;
		return 1;
	}

	temp_req_0 = start_request_f0;
	while ((temp_req_0->next) && !IN_ORDER(temp_req,temp_req_0->next))
		temp_req_0 = temp_req_0->next;

	temp_req->next		= temp_req_0->next;
	temp_req_0->next	= temp_req;
	
	if (temp_req->next == NULL)
		end_request_f0	= temp_req;		

	return 1;
}

void ll_rw_block_f1(void)
{
	int temp_flag;

	if (!start_request_f0)
		return;

	temp_flag = 0;
	cli();
	if (!end_request_f){
		start_request_f = start_request_f0;
		end_request_f	= end_request_f0;
		temp_flag       = 1;
	}
	else{
		end_request_f->next = start_request_f0;
		end_request_f		= end_request_f0;
	}
	sti();
	start_request_f0 = NULL;
	end_request_f0	 = NULL;
	if (temp_flag)		
		fd_rwblock_1();	
	return;
}

int ll_rw_block_f2(struct buffer_head * bh)
{
	unsigned int temp_block,temp_block_0;
	unsigned int temp_cyl,temp_head,temp_sec;
	struct hd_request_struct * temp_req;
	int					temp_flag;


	///////////////////////////////////////////
	temp_block = bh->b_blocknr << 1;
	if (temp_block >= 2880)
		return -1;

	temp_block_0 = temp_block;

	temp_sec	 = temp_block % 18;
	temp_block	 = temp_block / 18;
	temp_head	 = temp_block % 2;
	temp_cyl	 = temp_block / 2;
	///////////////////////////////////////////
	
	temp_req = current_req;
	while (temp_req->hd >= 0){
		temp_req++;
		if (temp_req == hd_request + NR_REQUEST)
			temp_req = hd_request;		
	}
	current_req = temp_req;

	bh->b_lock = 1;

	temp_req->hd		= 0;
	temp_req->block		= temp_block_0;
	temp_req->cyl		= temp_cyl;
	temp_req->head		= temp_head;
	temp_req->sector	= temp_sec + 1;	
	temp_req->nsector	= 2;
	temp_req->cmd		= 1;
	temp_req->errors	= 0;
	temp_req->bh		= bh;
	temp_req->next		= NULL;

	temp_flag = 0;
	cli();
	if (!start_request_f){
		start_request_f = temp_req;
		end_request_f	= temp_req;
		temp_flag       = 1;
	}
	else{
		temp_req->next			= start_request_f->next;
		start_request_f->next	= temp_req;
		if (temp_req->next == NULL)
			end_request_f	= temp_req;
	}
	sti();
	if (temp_flag)		
		fd_rwblock_1();	
	return 1;
}


//////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -