亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ll_rw_blk.c

?? linux 1.0 源代碼
?? C
字號:
/* *  linux/kernel/blk_dev/ll_rw.c * * Copyright (C) 1991, 1992 Linus Torvalds *//* * This handles all read/write requests to block devices */#include <linux/sched.h>#include <linux/kernel.h>#include <linux/kernel_stat.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/config.h>#include <linux/locks.h>#include <asm/system.h>#include "blk.h"#ifdef CONFIG_SBPCDextern u_long sbpcd_init(u_long, u_long);#endif CONFIG_SBPCD/* * The request-struct contains all necessary data * to load a nr of sectors into memory */static struct request all_requests[NR_REQUEST];/* * used to wait on when there are no free requests */struct wait_queue * wait_for_request = NULL;/* This specifies how many sectors to read ahead on the disk.  */int read_ahead[MAX_BLKDEV] = {0, };/* blk_dev_struct is: *	do_request-address *	next-request */struct blk_dev_struct blk_dev[MAX_BLKDEV] = {	{ NULL, NULL },		/* no_dev */	{ NULL, NULL },		/* dev mem */	{ NULL, NULL },		/* dev fd */	{ NULL, NULL },		/* dev hd */	{ NULL, NULL },		/* dev ttyx */	{ NULL, NULL },		/* dev tty */	{ NULL, NULL },		/* dev lp */	{ NULL, NULL },		/* dev pipes */	{ NULL, NULL },		/* dev sd */	{ NULL, NULL }		/* dev st */};/* * blk_size contains the size of all block-devices in units of 1024 byte * sectors: * * blk_size[MAJOR][MINOR] * * if (!blk_size[MAJOR]) then no minor size checking is done. */int * blk_size[MAX_BLKDEV] = { NULL, NULL, };/* * blksize_size contains the size of all block-devices: * * blksize_size[MAJOR][MINOR] * * if (!blksize_size[MAJOR]) then 1024 bytes is assumed. */int * blksize_size[MAX_BLKDEV] = { NULL, NULL, };/* * look for a free request in the first N entries. * NOTE: interrupts must be disabled on the way in, and will still *       be disabled on the way out. */static inline struct request * get_request(int n, int dev){	static struct request *prev_found = NULL, *prev_limit = NULL;	register struct request *req, *limit;	if (n <= 0)		panic("get_request(%d): impossible!\n", n);	limit = all_requests + n;	if (limit != prev_limit) {		prev_limit = limit;		prev_found = all_requests;	}	req = prev_found;	for (;;) {		req = ((req > all_requests) ? req : limit) - 1;		if (req->dev < 0)			break;		if (req == prev_found)			return NULL;	}	prev_found = req;	req->dev = dev;	return req;}/* * wait until a free request in the first N entries is available. * NOTE: interrupts must be disabled on the way in, and will still *       be disabled on the way out. */static inline struct request * get_request_wait(int n, int dev){	register struct request *req;	while ((req = get_request(n, dev)) == NULL)		sleep_on(&wait_for_request);	return req;}/* RO fail safe mechanism */static long ro_bits[MAX_BLKDEV][8];int is_read_only(int dev){	int minor,major;	major = MAJOR(dev);	minor = MINOR(dev);	if (major < 0 || major >= MAX_BLKDEV) return 0;	return ro_bits[major][minor >> 5] & (1 << (minor & 31));}void set_device_ro(int dev,int flag){	int minor,major;	major = MAJOR(dev);	minor = MINOR(dev);	if (major < 0 || major >= MAX_BLKDEV) return;	if (flag) ro_bits[major][minor >> 5] |= 1 << (minor & 31);	else ro_bits[major][minor >> 5] &= ~(1 << (minor & 31));}/* * add-request adds a request to the linked list. * It disables interrupts so that it can muck with the * request-lists in peace. */static void add_request(struct blk_dev_struct * dev, struct request * req){	struct request * tmp;	req->next = NULL;	cli();	if (req->bh)		req->bh->b_dirt = 0;	if (!(tmp = dev->current_request)) {		dev->current_request = req;		(dev->request_fn)();		sti();		return;	}	for ( ; tmp->next ; tmp = tmp->next) {		if ((IN_ORDER(tmp,req) ||		    !IN_ORDER(tmp,tmp->next)) &&		    IN_ORDER(req,tmp->next))			break;	}	req->next = tmp->next;	tmp->next = req;/* for SCSI devices, call request_fn unconditionally */	if (scsi_major(MAJOR(req->dev)))		(dev->request_fn)();	sti();}static void make_request(int major,int rw, struct buffer_head * bh){	unsigned int sector, count;	struct request * req;	int rw_ahead, max_req;/* WRITEA/READA is special case - it is not really needed, so if the *//* buffer is locked, we just forget about it, else it's a normal read */	rw_ahead = (rw == READA || rw == WRITEA);	if (rw_ahead) {		if (bh->b_lock)			return;		if (rw == READA)			rw = READ;		else			rw = WRITE;	}	if (rw!=READ && rw!=WRITE) {		printk("Bad block dev command, must be R/W/RA/WA\n");		return;	}	count = bh->b_size >> 9;	sector = bh->b_blocknr * count;	if (blk_size[major])		if (blk_size[major][MINOR(bh->b_dev)] < (sector + count)>>1) {			bh->b_dirt = bh->b_uptodate = 0;			return;		}	lock_buffer(bh);	if ((rw == WRITE && !bh->b_dirt) || (rw == READ && bh->b_uptodate)) {		unlock_buffer(bh);		return;	}/* we don't allow the write-requests to fill up the queue completely: * we want some room for reads: they take precedence. The last third * of the requests are only for reads. */	max_req = (rw == READ) ? NR_REQUEST : ((NR_REQUEST*2)/3);/* big loop: look for a free request. */repeat:	cli();/* The scsi disk drivers completely remove the request from the queue when * they start processing an entry.  For this reason it is safe to continue * to add links to the top entry for scsi devices. */	if ((major == HD_MAJOR	     || major == SCSI_DISK_MAJOR	     || major == SCSI_CDROM_MAJOR)	    && (req = blk_dev[major].current_request))	{	        if (major == HD_MAJOR)			req = req->next;		while (req) {			if (req->dev == bh->b_dev &&			    !req->waiting &&			    req->cmd == rw &&			    req->sector + req->nr_sectors == sector &&			    req->nr_sectors < 254)			{				req->bhtail->b_reqnext = bh;				req->bhtail = bh;				req->nr_sectors += count;				bh->b_dirt = 0;				sti();				return;			}			if (req->dev == bh->b_dev &&			    !req->waiting &&			    req->cmd == rw &&			    req->sector - count == sector &&			    req->nr_sectors < 254)			{			    	req->nr_sectors += count;			    	bh->b_reqnext = req->bh;			    	req->buffer = bh->b_data;			    	req->current_nr_sectors = count;			    	req->sector = sector;			    	bh->b_dirt = 0;			    	req->bh = bh;			    	sti();			    	return;			}    			req = req->next;		}	}/* find an unused request. */	req = get_request(max_req, bh->b_dev);/* if no request available: if rw_ahead, forget it; otherwise try again. */	if (! req) {		if (rw_ahead) {			sti();			unlock_buffer(bh);			return;		}		sleep_on(&wait_for_request);		sti();		goto repeat;	}/* we found a request. */	sti();/* fill up the request-info, and add it to the queue */	req->cmd = rw;	req->errors = 0;	req->sector = sector;	req->nr_sectors = count;	req->current_nr_sectors = count;	req->buffer = bh->b_data;	req->waiting = NULL;	req->bh = bh;	req->bhtail = bh;	req->next = NULL;	add_request(major+blk_dev,req);}void ll_rw_page(int rw, int dev, int page, char * buffer){	struct request * req;	unsigned int major = MAJOR(dev);	if (major >= MAX_BLKDEV || !(blk_dev[major].request_fn)) {		printk("Trying to read nonexistent block-device %04x (%d)\n",dev,page*8);		return;	}	if (rw!=READ && rw!=WRITE)		panic("Bad block dev command, must be R/W");	if (rw == WRITE && is_read_only(dev)) {		printk("Can't page to read-only device 0x%X\n",dev);		return;	}	cli();	req = get_request_wait(NR_REQUEST, dev);	sti();/* fill up the request-info, and add it to the queue */	req->cmd = rw;	req->errors = 0;	req->sector = page<<3;	req->nr_sectors = 8;	req->current_nr_sectors = 8;	req->buffer = buffer;	req->waiting = current;	req->bh = NULL;	req->next = NULL;	current->state = TASK_SWAPPING;	add_request(major+blk_dev,req);	schedule();}/* This function can be used to request a number of buffers from a block   device. Currently the only restriction is that all buffers must belong to   the same device */void ll_rw_block(int rw, int nr, struct buffer_head * bh[]){	unsigned int major;	struct request plug;	int plugged;	int correct_size;	struct blk_dev_struct * dev;	int i;	/* Make sure that the first block contains something reasonable */	while (!*bh) {		bh++;		if (--nr <= 0)			return;	};	dev = NULL;	if ((major = MAJOR(bh[0]->b_dev)) < MAX_BLKDEV)		dev = blk_dev + major;	if (!dev || !dev->request_fn) {		printk(	"ll_rw_block: Trying to read nonexistent block-device %04lX (%ld)\n",		       (unsigned long) bh[0]->b_dev, bh[0]->b_blocknr);		goto sorry;	}	/* Determine correct block size for this device.  */	correct_size = BLOCK_SIZE;	if (blksize_size[major]) {		i = blksize_size[major][MINOR(bh[0]->b_dev)];		if (i)			correct_size = i;	}	/* Verify requested block sizees.  */	for (i = 0; i < nr; i++) {		if (bh[i] && bh[i]->b_size != correct_size) {			printk(			"ll_rw_block: only %d-char blocks implemented (%lu)\n",			       correct_size, bh[i]->b_size);			goto sorry;		}	}	if ((rw == WRITE || rw == WRITEA) && is_read_only(bh[0]->b_dev)) {		printk("Can't write to read-only device 0x%X\n",bh[0]->b_dev);		goto sorry;	}	/* If there are no pending requests for this device, then we insert	   a dummy request for that device.  This will prevent the request	   from starting until we have shoved all of the blocks into the	   queue, and then we let it rip.  */	plugged = 0;	cli();	if (!dev->current_request && nr > 1) {		dev->current_request = &plug;		plug.dev = -1;		plug.next = NULL;		plugged = 1;	}	sti();	for (i = 0; i < nr; i++) {		if (bh[i]) {			bh[i]->b_req = 1;			make_request(major, rw, bh[i]);			if (rw == READ || rw == READA)				kstat.pgpgin++;			else				kstat.pgpgout++;		}	}	if (plugged) {		cli();		dev->current_request = plug.next;		(dev->request_fn)();		sti();	}	return;      sorry:	for (i = 0; i < nr; i++) {		if (bh[i])			bh[i]->b_dirt = bh[i]->b_uptodate = 0;	}	return;}void ll_rw_swap_file(int rw, int dev, unsigned int *b, int nb, char *buf){	int i;	int buffersize;	struct request * req;	unsigned int major = MAJOR(dev);	if (major >= MAX_BLKDEV || !(blk_dev[major].request_fn)) {		printk("ll_rw_swap_file: trying to swap nonexistent block-device\n");		return;	}	if (rw!=READ && rw!=WRITE) {		printk("ll_rw_swap: bad block dev command, must be R/W");		return;	}	if (rw == WRITE && is_read_only(dev)) {		printk("Can't swap to read-only device 0x%X\n",dev);		return;	}		buffersize = PAGE_SIZE / nb;	for (i=0; i<nb; i++, buf += buffersize)	{		cli();		req = get_request_wait(NR_REQUEST, dev);		sti();		req->cmd = rw;		req->errors = 0;		req->sector = (b[i] * buffersize) >> 9;		req->nr_sectors = buffersize >> 9;		req->current_nr_sectors = buffersize >> 9;		req->buffer = buf;		req->waiting = current;		req->bh = NULL;		req->next = NULL;		current->state = TASK_UNINTERRUPTIBLE;		add_request(major+blk_dev,req);		schedule();	}}long blk_dev_init(long mem_start, long mem_end){	struct request * req;	req = all_requests + NR_REQUEST;	while (--req >= all_requests) {		req->dev = -1;		req->next = NULL;	}	memset(ro_bits,0,sizeof(ro_bits));#ifdef CONFIG_BLK_DEV_HD	mem_start = hd_init(mem_start,mem_end);#endif#ifdef CONFIG_BLK_DEV_XD	mem_start = xd_init(mem_start,mem_end);#endif#ifdef CONFIG_CDU31A	mem_start = cdu31a_init(mem_start,mem_end);#endif#ifdef CONFIG_MCD	mem_start = mcd_init(mem_start,mem_end);#endif#ifdef CONFIG_SBPCD	mem_start = sbpcd_init(mem_start, mem_end);#endif CONFIG_SBPCD	if (ramdisk_size)		mem_start += rd_init(mem_start, ramdisk_size*1024);	return mem_start;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
97se狠狠狠综合亚洲狠狠| 久久成人免费网站| 99久久国产综合色|国产精品| 久久久久久毛片| 国产毛片精品视频| 国产午夜精品理论片a级大结局| 国产成人精品免费视频网站| 国产精品久久精品日日| 91久久人澡人人添人人爽欧美 | 成人国产精品免费观看| 国产精品视频麻豆| 在线免费av一区| 蜜臀av一区二区在线免费观看| 2020国产精品| 97精品久久久午夜一区二区三区 | 一区二区三区日韩欧美| 欧美日韩你懂得| 国产一区二区三区蝌蚪| 国产精品国产自产拍高清av王其| 欧美专区日韩专区| 黄色资源网久久资源365| 国产精品二三区| 欧美二区三区的天堂| 风间由美一区二区av101| 亚洲高清不卡在线| 久久久亚洲国产美女国产盗摄| 91蝌蚪porny九色| 热久久免费视频| 中文字幕一区二区三中文字幕| 欧美色图一区二区三区| 国产一区二区三区| 亚洲一二三专区| 国产日韩欧美综合在线| 国产成人免费视频精品含羞草妖精| 久久综合丝袜日本网| 日本高清不卡在线观看| 久久99精品国产.久久久久| 国产精品第一页第二页第三页| 91精品国产一区二区三区蜜臀| 不卡影院免费观看| 日本免费在线视频不卡一不卡二| 国产精品视频九色porn| 日韩欧美高清在线| 欧美午夜寂寞影院| 国产成人av在线影院| 免费成人在线观看| 亚洲综合视频在线观看| 日本一区二区三区免费乱视频| 日韩一区二区在线播放| 色噜噜狠狠色综合欧洲selulu | 国产精品一区二区黑丝| 亚洲第一主播视频| 亚洲视频一区二区在线观看| 精品成人在线观看| 6080午夜不卡| 欧美在线观看一二区| 99视频精品全部免费在线| 麻豆传媒一区二区三区| 亚洲精品成人精品456| 国产精品美女视频| 久久夜色精品一区| 日韩欧美一区二区三区在线| 色婷婷综合久久| 色综合久久久久久久久久久| www.亚洲色图| 国产精品白丝jk黑袜喷水| 久久精品国产77777蜜臀| 首页欧美精品中文字幕| 亚洲成人免费电影| 亚洲成人动漫av| 亚洲成a人片在线不卡一二三区| 亚洲美腿欧美偷拍| 亚洲免费高清视频在线| 亚洲另类色综合网站| 亚洲女人的天堂| 中文字幕一区免费在线观看| 中文字幕一区二区三| 国产精品不卡一区| 亚洲伦理在线精品| 一区二区三区免费| 亚洲一区在线视频观看| 亚洲网友自拍偷拍| 午夜视频一区在线观看| 日韩av不卡一区二区| 美女精品自拍一二三四| 国产一区欧美二区| 成人午夜免费视频| 99re这里只有精品视频首页| 99re视频精品| 欧美中文字幕一区二区三区 | 国产不卡视频在线观看| 国产aⅴ综合色| av一二三不卡影片| 91福利视频网站| 欧美精品在线一区二区| 日韩欧美高清一区| 中文字幕不卡在线观看| 亚洲欧美国产毛片在线| 偷拍亚洲欧洲综合| 狠狠色丁香久久婷婷综| 成人精品鲁一区一区二区| 成人av手机在线观看| 欧美日韩中文一区| 精品久久久三级丝袜| 亚洲国产成人自拍| 亚洲综合久久久| 理论电影国产精品| 不卡的av电影在线观看| 欧美视频在线播放| 欧美精品一区二区三区久久久| 国产精品麻豆视频| 日韩精品福利网| 国产91在线观看| 欧美私人免费视频| 精品成人一区二区| 一区二区三区.www| 国产毛片精品国产一区二区三区| 91麻豆国产自产在线观看| 在线不卡欧美精品一区二区三区| 久久综合久久综合久久综合| 亚洲欧美日韩国产另类专区| 麻豆精品精品国产自在97香蕉| 北岛玲一区二区三区四区| 日韩一区二区三| 中文字幕视频一区| 黄色成人免费在线| 欧美视频在线观看一区| 国产人成一区二区三区影院| 亚洲国产精品久久久久婷婷884| 国产麻豆成人精品| 在线播放视频一区| 亚洲女子a中天字幕| 国产在线国偷精品免费看| 欧美日韩综合在线免费观看| 国产精品毛片高清在线完整版| 天堂影院一区二区| 91久久精品一区二区| 欧美国产日韩在线观看| 久久国产尿小便嘘嘘| 欧美亚一区二区| 国产精品久久久久久久久免费丝袜 | 视频一区在线视频| 日韩免费视频一区| 亚洲一二三区不卡| 97久久精品人人做人人爽| 精品91自产拍在线观看一区| 亚洲成av人片观看| 在线一区二区观看| 中文字幕永久在线不卡| 国产成人精品aa毛片| 精品久久人人做人人爽| 天堂影院一区二区| 欧美日产国产精品| 亚洲一区在线观看免费观看电影高清| 成人国产精品免费| 国产精品美女久久久久aⅴ| 国产精品 欧美精品| 精品国精品自拍自在线| 美女在线视频一区| 欧美成人精品1314www| 蜜臀精品一区二区三区在线观看 | 亚洲成人免费视频| 欧美自拍偷拍午夜视频| 亚洲乱码国产乱码精品精可以看| 不卡电影一区二区三区| 国产精品久久久久久久蜜臀| 波多野结衣欧美| 亚洲欧洲成人自拍| 成人av免费观看| 国产精品美女一区二区三区| 成人免费电影视频| 国产精品激情偷乱一区二区∴| kk眼镜猥琐国模调教系列一区二区| 久久久99精品久久| 成人黄色在线视频| 成人免费一区二区三区视频| 91久久一区二区| 亚洲aaa精品| 日韩欧美中文字幕公布| 国精产品一区一区三区mba视频| 26uuu亚洲| 国产大片一区二区| 成人免费小视频| 欧亚一区二区三区| 美女一区二区视频| 久久色在线视频| 成人性色生活片免费看爆迷你毛片| 国产精品你懂的在线欣赏| 91免费小视频| 五月天久久比比资源色| 日韩一区二区免费在线观看| 国产在线观看一区二区| 一区在线中文字幕| 欧美日韩中字一区| 精品一区二区三区香蕉蜜桃| 国产精品色婷婷久久58| 欧美日韩国产另类不卡| 韩日欧美一区二区三区| 亚洲欧美日韩在线不卡| 欧美成人激情免费网|