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

📄 blk.h

📁 GNU Mach 微内核源代码, 基于美国卡内基美隆大学的 Mach 研究项目
💻 H
字号:
/* Is this okay? by OKUJI Yoshinori */#ifndef _BLK_H#define _BLK_H#include <linux/blkdev.h>#include <linux/locks.h>#include <linux/malloc.h>#include <linux/config.h>#include <linux/md.h>/* * NR_REQUEST is the number of entries in the request-queue. * NOTE that writes may use only the low 2/3 of these: reads * take precedence. */#define NR_REQUEST	64/* * This is used in the elevator algorithm.  We don't prioritise reads * over writes any more --- although reads are more time-critical than * writes, by treating them equally we increase filesystem throughput. * This turns out to give better overall performance.  -- sct */#define IN_ORDER(s1,s2) \((s1)->rq_dev < (s2)->rq_dev || (((s1)->rq_dev == (s2)->rq_dev && \(s1)->sector < (s2)->sector)))/* * These will have to be changed to be aware of different buffer * sizes etc.. It actually needs a major cleanup. */#if defined(IDE_DRIVER) || defined(MD_DRIVER)#define SECTOR_MASK ((BLOCK_SIZE >> 9) - 1)#else#define SECTOR_MASK (blksize_size[MAJOR_NR] &&     \	blksize_size[MAJOR_NR][MINOR(CURRENT->rq_dev)] ? \	((blksize_size[MAJOR_NR][MINOR(CURRENT->rq_dev)] >> 9) - 1) :  \	((BLOCK_SIZE >> 9)  -  1))#endif /* IDE_DRIVER */#define SUBSECTOR(block) (CURRENT->current_nr_sectors > 0)#ifdef CONFIG_CDU31Aextern int cdu31a_init(void);#endif /* CONFIG_CDU31A */#ifdef CONFIG_MCDextern int mcd_init(void);#endif /* CONFIG_MCD */#ifdef CONFIG_MCDXextern int mcdx_init(void);#endif /* CONFIG_MCDX */#ifdef CONFIG_SBPCDextern int sbpcd_init(void);#endif /* CONFIG_SBPCD */#ifdef CONFIG_AZTCDextern int aztcd_init(void);#endif /* CONFIG_AZTCD */#ifdef CONFIG_CDU535extern int sony535_init(void);#endif /* CONFIG_CDU535 */#ifdef CONFIG_GSCDextern int gscd_init(void);#endif /* CONFIG_GSCD */#ifdef CONFIG_CM206extern int cm206_init(void);#endif /* CONFIG_CM206 */#ifdef CONFIG_OPTCDextern int optcd_init(void);#endif /* CONFIG_OPTCD */#ifdef CONFIG_SJCDextern int sjcd_init(void);#endif /* CONFIG_SJCD */#ifdef CONFIG_CDI_INITextern int cdi_init(void);#endif /* CONFIG_CDI_INIT */#ifdef CONFIG_BLK_DEV_HDextern int hd_init(void);#endif#ifdef CONFIG_BLK_DEV_IDEextern int ide_init(void);#endif#ifdef CONFIG_BLK_DEV_XDextern int xd_init(void);#endif#ifdef CONFIG_BLK_DEV_LOOPextern int loop_init(void);#endif#ifdef CONFIG_BLK_DEV_MDextern int md_init(void);#endif /* CONFIG_BLK_DEV_MD */extern void set_device_ro(kdev_t dev,int flag);void add_blkdev_randomness(int major);extern int floppy_init(void);extern void rd_load(void);extern int rd_init(void);extern int rd_doload;		/* 1 = load ramdisk, 0 = don't load */extern int rd_prompt;		/* 1 = prompt for ramdisk, 0 = don't prompt */extern int rd_image_start;	/* starting block # of image */#ifdef CONFIG_BLK_DEV_INITRD#define INITRD_MINOR 250 /* shouldn't collide with /dev/ram* too soon ... */extern unsigned long initrd_start,initrd_end;extern int mount_initrd; /* zero if initrd should not be mounted */void initrd_init(void);#endif#define RO_IOCTLS(dev,where) \  case BLKROSET: { int __err;  if (!suser()) return -EACCES; \		   __err = verify_area(VERIFY_READ, (void *) (where), sizeof(long)); \		   if (!__err) set_device_ro((dev),get_fs_long((long *) (where))); return __err; } \  case BLKROGET: { int __err = verify_area(VERIFY_WRITE, (void *) (where), sizeof(long)); \		   if (!__err) put_fs_long(0!=is_read_only(dev),(long *) (where)); return __err; }#if defined(MAJOR_NR) || defined(IDE_DRIVER)/* * Add entries as needed. */#ifdef IDE_DRIVER#define DEVICE_NR(device)	(MINOR(device) >> PARTN_BITS)#define DEVICE_ON(device)	/* nothing */#define DEVICE_OFF(device)	/* nothing */#elif (MAJOR_NR == RAMDISK_MAJOR)/* ram disk */#define DEVICE_NAME "ramdisk"#define DEVICE_REQUEST rd_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#define DEVICE_NO_RANDOM#elif (MAJOR_NR == FLOPPY_MAJOR)static void floppy_off(unsigned int nr);#define DEVICE_NAME "floppy"#define DEVICE_INTR do_floppy#define DEVICE_REQUEST do_fd_request#define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 ))#define DEVICE_ON(device)#define DEVICE_OFF(device) floppy_off(DEVICE_NR(device))#elif (MAJOR_NR == HD_MAJOR)/* harddisk: timeout is 6 seconds.. */#define DEVICE_NAME "harddisk"#define DEVICE_INTR do_hd#define DEVICE_TIMEOUT HD_TIMER#define TIMEOUT_VALUE (6*HZ)#define DEVICE_REQUEST do_hd_request#define DEVICE_NR(device) (MINOR(device)>>6)#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == SCSI_DISK_MAJOR)#define DEVICE_NAME "scsidisk"#define DEVICE_INTR do_sd#define TIMEOUT_VALUE (2*HZ)#define DEVICE_REQUEST do_sd_request#define DEVICE_NR(device) (MINOR(device) >> 4)#define DEVICE_ON(device)#define DEVICE_OFF(device)/* Kludge to use the same number for both char and block major numbers */#elif  (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER)#define DEVICE_NAME "Multiple devices driver"#define DEVICE_REQUEST do_md_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == SCSI_TAPE_MAJOR)#define DEVICE_NAME "scsitape"#define DEVICE_INTR do_st#define DEVICE_NR(device) (MINOR(device) & 0x7f)#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == SCSI_CDROM_MAJOR)#define DEVICE_NAME "CD-ROM"#define DEVICE_INTR do_sr#define DEVICE_REQUEST do_sr_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == XT_DISK_MAJOR)#define DEVICE_NAME "xt disk"#define DEVICE_REQUEST do_xd_request#define DEVICE_NR(device) (MINOR(device) >> 6)#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == CDU31A_CDROM_MAJOR)#define DEVICE_NAME "CDU31A"#define DEVICE_REQUEST do_cdu31a_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == MITSUMI_CDROM_MAJOR)#define DEVICE_NAME "Mitsumi CD-ROM"/* #define DEVICE_INTR do_mcd */#define DEVICE_REQUEST do_mcd_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR)#define DEVICE_NAME "Mitsumi CD-ROM"/* #define DEVICE_INTR do_mcdx */#define DEVICE_REQUEST do_mcdx_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR)#define DEVICE_NAME "Matsushita CD-ROM controller #1"#define DEVICE_REQUEST do_sbpcd_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR)#define DEVICE_NAME "Matsushita CD-ROM controller #2"#define DEVICE_REQUEST do_sbpcd2_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR)#define DEVICE_NAME "Matsushita CD-ROM controller #3"#define DEVICE_REQUEST do_sbpcd3_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR)#define DEVICE_NAME "Matsushita CD-ROM controller #4"#define DEVICE_REQUEST do_sbpcd4_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == AZTECH_CDROM_MAJOR)#define DEVICE_NAME "Aztech CD-ROM"#define DEVICE_REQUEST do_aztcd_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == CDU535_CDROM_MAJOR)#define DEVICE_NAME "SONY-CDU535"#define DEVICE_INTR do_cdu535#define DEVICE_REQUEST do_cdu535_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR)#define DEVICE_NAME "Goldstar R420"#define DEVICE_REQUEST do_gscd_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == CM206_CDROM_MAJOR)#define DEVICE_NAME "Philips/LMS cd-rom cm206"#define DEVICE_REQUEST do_cm206_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == OPTICS_CDROM_MAJOR)#define DEVICE_NAME "DOLPHIN 8000AT CD-ROM"#define DEVICE_REQUEST do_optcd_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#elif (MAJOR_NR == SANYO_CDROM_MAJOR)#define DEVICE_NAME "Sanyo H94A CD-ROM"#define DEVICE_REQUEST do_sjcd_request#define DEVICE_NR(device) (MINOR(device))#define DEVICE_ON(device)#define DEVICE_OFF(device)#endif /* MAJOR_NR == whatever */#if (MAJOR_NR != SCSI_TAPE_MAJOR)#if !defined(IDE_DRIVER)#ifndef CURRENT#define CURRENT (blk_dev[MAJOR_NR].current_request)#endif#define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev)#ifdef DEVICE_INTRstatic void (*DEVICE_INTR)(void) = NULL;#endif#ifdef DEVICE_TIMEOUT#define SET_TIMER \((timer_table[DEVICE_TIMEOUT].expires = jiffies + TIMEOUT_VALUE), \(timer_active |= 1<<DEVICE_TIMEOUT))#define CLEAR_TIMER \timer_active &= ~(1<<DEVICE_TIMEOUT)#define SET_INTR(x) \if ((DEVICE_INTR = (x)) != NULL) \	SET_TIMER; \else \	CLEAR_TIMER;#else#define SET_INTR(x) (DEVICE_INTR = (x))#endif /* DEVICE_TIMEOUT */static void (DEVICE_REQUEST)(void);#ifdef DEVICE_INTR#define CLEAR_INTR SET_INTR(NULL)#else#define CLEAR_INTR#endif#define INIT_REQUEST \	if (!CURRENT) {\		CLEAR_INTR; \		return; \	} \	if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \		panic(DEVICE_NAME ": request list destroyed"); \	if (CURRENT->bh) { \		if (!buffer_locked(CURRENT->bh)) \			panic(DEVICE_NAME ": block not locked"); \	}#endif /* !defined(IDE_DRIVER) *//* end_request() - SCSI devices have their own version *//*               - IDE drivers have their own copy too */#if ! SCSI_BLK_MAJOR(MAJOR_NR)#if defined(IDE_DRIVER) && !defined(_IDE_C) /* shared copy for IDE modules */void ide_end_request(byte uptodate, ide_hwgroup_t *hwgroup);#else#ifdef IDE_DRIVERvoid ide_end_request(byte uptodate, ide_hwgroup_t *hwgroup) {	struct request *req = hwgroup->rq;#elsestatic void end_request(int uptodate) {	struct request *req = CURRENT;#endif /* IDE_DRIVER */	struct buffer_head * bh;	int nsect;	req->errors = 0;	if (!uptodate) {		printk("end_request: I/O error, dev %s, sector %lu\n",			kdevname(req->rq_dev), req->sector);#ifdef MACH		for (bh = req->bh; bh; )		  {		    struct buffer_head *next = bh->b_reqnext;		    bh->b_reqnext = NULL;		    mark_buffer_uptodate (bh, 0);		    unlock_buffer (bh);		    bh = next;		  }		req->bh = NULL;#else		if ((bh = req->bh) != NULL) {			nsect = bh->b_size >> 9;			req->nr_sectors--;			req->nr_sectors &= ~(nsect - 1);			req->sector += nsect;			req->sector &= ~(nsect - 1);		}#endif	}	if ((bh = req->bh) != NULL) {		req->bh = bh->b_reqnext;		bh->b_reqnext = NULL; 		/* 		 * This is our 'MD IO has finished' event handler. 		 * note that b_state should be cached in a register 		 * anyways, so the overhead if this checking is almost 		 * zero. But anyways .. we never get OO for free :) 		 */ 		if (test_bit(BH_MD, &bh->b_state)) { 			struct md_personality * pers=(struct md_personality *)bh->personality; 			pers->end_request(bh,uptodate); 		} 		/* 		 * the normal (nonmirrored and no RAID5) case: 		 */ 		else { 			mark_buffer_uptodate(bh, uptodate); 			unlock_buffer(bh); 		}		if ((bh = req->bh) != NULL) {			req->current_nr_sectors = bh->b_size >> 9;			if (req->nr_sectors < req->current_nr_sectors) {				req->nr_sectors = req->current_nr_sectors;				printk("end_request: buffer-list destroyed\n");			}			req->buffer = bh->b_data;			return;		}	}#ifndef DEVICE_NO_RANDOM	add_blkdev_randomness(MAJOR(req->rq_dev));#endif#ifdef IDE_DRIVER	blk_dev[MAJOR(req->rq_dev)].current_request = req->next;	hwgroup->rq = NULL;#else	DEVICE_OFF(req->rq_dev);	CURRENT = req->next;#endif /* IDE_DRIVER */	if (req->sem != NULL)		up(req->sem);	req->rq_status = RQ_INACTIVE;	wake_up(&wait_for_request);}#endif /* defined(IDE_DRIVER) && !defined(_IDE_C) */#endif /* ! SCSI_BLK_MAJOR(MAJOR_NR) */#endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) */#endif /* defined(MAJOR_NR) || defined(IDE_DRIVER) */#endif /* _BLK_H */

⌨️ 快捷键说明

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