4 #include <linux/blkdev.h> 5 #include <linux/locks.h> 6 #include <linux/config.h> 9 * NR_REQUEST is the number of entries in the request-queue. 10 * NOTE that writes may use only the low 2/3 of these: reads 16 * This is used in the elevator algorithm. We don't prioritise reads 17 * over writes any more --- although reads are more time-critical than 18 * writes, by treating them equally we increase filesystem throughput. 19 * This turns out to give better overall performance. -- sct 21 #define IN_ORDER(s1,s2) \ 22 ((s1)->rq_dev < (s2)->rq_dev || (((s1)->rq_dev == (s2)->rq_dev && \ 23 (s1)->sector < (s2)->sector))) 26 * These will have to be changed to be aware of different buffer 27 * sizes etc.. It actually needs a major cleanup. 29 #if defined(IDE_DRIVER) || defined(MD_DRIVER) 30 #define SECTOR_MASK ((BLOCK_SIZE >> 9) - 1) 32 #define SECTOR_MASK (blksize_size[MAJOR_NR] && \ 33 blksize_size[MAJOR_NR][MINOR(CURRENT->rq_dev)] ? \ 34 ((blksize_size[MAJOR_NR][MINOR(CURRENT->rq_dev)] >> 9) - 1) : \ 35 ((BLOCK_SIZE >> 9) - 1)) 36 #endif/* IDE_DRIVER */ 38 #define SUBSECTOR(block) (CURRENT->current_nr_sectors > 0) 41 externintcdu31a_init(void); 43 #ifdef CONFIG_ATARI_ACSI 44 externintacsi_init(void); 45 #endif CONFIG_ATARI_ACSI 47 externintmcd_init(void); 50 externintmcdx_init(void); 53 externintsbpcd_init(void); 56 externintaztcd_init(void); 59 externintsony535_init(void); 62 externintgscd_init(void); 65 externintcm206_init(void); 68 externintoptcd_init(void); 71 externintsjcd_init(void); 73 #ifdef CONFIG_CDI_INIT 74 externintcdi_init(void); 75 #endif CONFIG_CDI_INIT 76 #ifdef CONFIG_BLK_DEV_HD 77 externinthd_init(void); 79 #ifdef CONFIG_BLK_DEV_IDE 80 externintide_init(void); 82 #ifdef CONFIG_BLK_DEV_XD 83 externintxd_init(void); 85 #ifdef CONFIG_BLK_DEV_LOOP 86 externintloop_init(void); 88 #ifdef CONFIG_BLK_DEV_MD 89 externintmd_init(void); 90 #endif CONFIG_BLK_DEV_MD 92 externintap_init(void); 95 externintddv_init(void); 97 #ifdef CONFIG_AMIGA_Z2RAM 98 externintz2_init(void); 100 #ifdef CONFIG_MAC_FLOPPY 101 externintswim3_init(void); 104 externvoidset_device_ro(kdev_t dev
,int flag
); 105 voidadd_blkdev_randomness(int major
); 107 externintfloppy_init(void); 108 externvoidrd_load(void); 109 externintrd_init(void); 110 externint rd_doload
;/* 1 = load ramdisk, 0 = don't load */ 111 externint rd_prompt
;/* 1 = prompt for ramdisk, 0 = don't prompt */ 112 externint rd_image_start
;/* starting block # of image */ 114 #ifdef CONFIG_BLK_DEV_INITRD 116 #define INITRD_MINOR 250/* shouldn't collide with /dev/ram* too soon ... */ 118 externunsigned long initrd_start
,initrd_end
; 119 externint mount_initrd
;/* zero if initrd should not be mounted */ 120 externint initrd_below_start_ok
;/* 1 if it is not an error if initrd_start < memory_start */ 121 voidinitrd_init(void); 124 #ifdef CONFIG_BLK_DEV_PS2 125 externintps2esdi_init(void); 128 #define RO_IOCTLS(dev,where) \ 129 case BLKROSET: { int __val; if (!suser()) return -EACCES; \ 130 if (get_user(__val, (int *)(where))) return -EFAULT; \ 131 set_device_ro((dev),__val); return 0; } \ 132 case BLKROGET: { int __val = (is_read_only(dev) != 0) ; \ 133 return put_user(__val,(int *) (where)); } 135 #if defined(MAJOR_NR) || defined(IDE_DRIVER) 138 * Add entries as needed. 143 #define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS) 144 #define DEVICE_ON(device)/* nothing */ 145 #define DEVICE_OFF(device)/* nothing */ 147 #elif (MAJOR_NR == RAMDISK_MAJOR) 150 #define DEVICE_NAME"ramdisk" 151 #define DEVICE_REQUEST rd_request 152 #define DEVICE_NR(device) (MINOR(device)) 153 #define DEVICE_ON(device) 154 #define DEVICE_OFF(device) 155 #define DEVICE_NO_RANDOM 157 #elif (MAJOR_NR == Z2RAM_MAJOR) 160 #define DEVICE_NAME"Z2RAM" 161 #define DEVICE_REQUEST do_z2_request 162 #define DEVICE_NR(device) (MINOR(device)) 163 #define DEVICE_ON(device) 164 #define DEVICE_OFF(device) 166 #elif (MAJOR_NR == FLOPPY_MAJOR) 168 static voidfloppy_off(unsigned int nr
); 170 #define DEVICE_NAME"floppy" 171 #define DEVICE_INTR do_floppy 172 #define DEVICE_REQUEST do_fd_request 173 #define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 )) 174 #define DEVICE_ON(device) 175 #define DEVICE_OFF(device) floppy_off(DEVICE_NR(device)) 177 #elif (MAJOR_NR == HD_MAJOR) 179 /* harddisk: timeout is 6 seconds.. */ 180 #define DEVICE_NAME"harddisk" 181 #define DEVICE_INTR do_hd 182 #define DEVICE_TIMEOUT HD_TIMER 183 #define TIMEOUT_VALUE (6*HZ) 184 #define DEVICE_REQUEST do_hd_request 185 #define DEVICE_NR(device) (MINOR(device)>>6) 186 #define DEVICE_ON(device) 187 #define DEVICE_OFF(device) 189 #elif (MAJOR_NR == SCSI_DISK_MAJOR) 191 #define DEVICE_NAME"scsidisk" 192 #define DEVICE_INTR do_sd 193 #define TIMEOUT_VALUE (2*HZ) 194 #define DEVICE_REQUEST do_sd_request 195 #define DEVICE_NR(device) (MINOR(device) >> 4) 196 #define DEVICE_ON(device) 197 #define DEVICE_OFF(device) 199 /* Kludge to use the same number for both char and block major numbers */ 200 #elif (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER) 202 #define DEVICE_NAME"Multiple devices driver" 203 #define DEVICE_REQUEST do_md_request 204 #define DEVICE_NR(device) (MINOR(device)) 205 #define DEVICE_ON(device) 206 #define DEVICE_OFF(device) 208 #elif (MAJOR_NR == SCSI_TAPE_MAJOR) 210 #define DEVICE_NAME"scsitape" 211 #define DEVICE_INTR do_st 212 #define DEVICE_NR(device) (MINOR(device) & 0x7f) 213 #define DEVICE_ON(device) 214 #define DEVICE_OFF(device) 216 #elif (MAJOR_NR == SCSI_CDROM_MAJOR) 218 #define DEVICE_NAME"CD-ROM" 219 #define DEVICE_INTR do_sr 220 #define DEVICE_REQUEST do_sr_request 221 #define DEVICE_NR(device) (MINOR(device)) 222 #define DEVICE_ON(device) 223 #define DEVICE_OFF(device) 225 #elif (MAJOR_NR == XT_DISK_MAJOR) 227 #define DEVICE_NAME"xt disk" 228 #define DEVICE_REQUEST do_xd_request 229 #define DEVICE_NR(device) (MINOR(device) >> 6) 230 #define DEVICE_ON(device) 231 #define DEVICE_OFF(device) 233 #elif (MAJOR_NR == PS2ESDI_MAJOR) 235 #define DEVICE_NAME"PS/2 ESDI" 236 #define DEVICE_REQUEST do_ps2esdi_request 237 #define DEVICE_NR(device) (MINOR(device) >> 6) 238 #define DEVICE_ON(device) 239 #define DEVICE_OFF(device) 241 #elif (MAJOR_NR == CDU31A_CDROM_MAJOR) 243 #define DEVICE_NAME"CDU31A" 244 #define DEVICE_REQUEST do_cdu31a_request 245 #define DEVICE_NR(device) (MINOR(device)) 246 #define DEVICE_ON(device) 247 #define DEVICE_OFF(device) 249 #elif (MAJOR_NR == ACSI_MAJOR) && (defined(CONFIG_ATARI_ACSI) || defined(CONFIG_ATARI_ACSI_MODULE)) 251 #define DEVICE_NAME"ACSI" 252 #define DEVICE_INTR do_acsi 253 #define DEVICE_REQUEST do_acsi_request 254 #define DEVICE_NR(device) (MINOR(device) >> 4) 255 #define DEVICE_ON(device) 256 #define DEVICE_OFF(device) 258 #elif (MAJOR_NR == MITSUMI_CDROM_MAJOR) 260 #define DEVICE_NAME"Mitsumi CD-ROM" 261 /* #define DEVICE_INTR do_mcd */ 262 #define DEVICE_REQUEST do_mcd_request 263 #define DEVICE_NR(device) (MINOR(device)) 264 #define DEVICE_ON(device) 265 #define DEVICE_OFF(device) 267 #elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR) 269 #define DEVICE_NAME"Mitsumi CD-ROM" 270 /* #define DEVICE_INTR do_mcdx */ 271 #define DEVICE_REQUEST do_mcdx_request 272 #define DEVICE_NR(device) (MINOR(device)) 273 #define DEVICE_ON(device) 274 #define DEVICE_OFF(device) 276 #elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR) 278 #define DEVICE_NAME"Matsushita CD-ROM controller #1" 279 #define DEVICE_REQUEST do_sbpcd_request 280 #define DEVICE_NR(device) (MINOR(device)) 281 #define DEVICE_ON(device) 282 #define DEVICE_OFF(device) 284 #elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR) 286 #define DEVICE_NAME"Matsushita CD-ROM controller #2" 287 #define DEVICE_REQUEST do_sbpcd2_request 288 #define DEVICE_NR(device) (MINOR(device)) 289 #define DEVICE_ON(device) 290 #define DEVICE_OFF(device) 292 #elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR) 294 #define DEVICE_NAME"Matsushita CD-ROM controller #3" 295 #define DEVICE_REQUEST do_sbpcd3_request 296 #define DEVICE_NR(device) (MINOR(device)) 297 #define DEVICE_ON(device) 298 #define DEVICE_OFF(device) 300 #elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR) 302 #define DEVICE_NAME"Matsushita CD-ROM controller #4" 303 #define DEVICE_REQUEST do_sbpcd4_request 304 #define DEVICE_NR(device) (MINOR(device)) 305 #define DEVICE_ON(device) 306 #define DEVICE_OFF(device) 308 #elif (MAJOR_NR == AZTECH_CDROM_MAJOR) 310 #define DEVICE_NAME"Aztech CD-ROM" 311 #define DEVICE_REQUEST do_aztcd_request 312 #define DEVICE_NR(device) (MINOR(device)) 313 #define DEVICE_ON(device) 314 #define DEVICE_OFF(device) 316 #elif (MAJOR_NR == CDU535_CDROM_MAJOR) 318 #define DEVICE_NAME"SONY-CDU535" 319 #define DEVICE_INTR do_cdu535 320 #define DEVICE_REQUEST do_cdu535_request 321 #define DEVICE_NR(device) (MINOR(device)) 322 #define DEVICE_ON(device) 323 #define DEVICE_OFF(device) 325 #elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR) 327 #define DEVICE_NAME"Goldstar R420" 328 #define DEVICE_REQUEST do_gscd_request 329 #define DEVICE_NR(device) (MINOR(device)) 330 #define DEVICE_ON(device) 331 #define DEVICE_OFF(device) 333 #elif (MAJOR_NR == CM206_CDROM_MAJOR) 334 #define DEVICE_NAME"Philips/LMS cd-rom cm206" 335 #define DEVICE_REQUEST do_cm206_request 336 #define DEVICE_NR(device) (MINOR(device)) 337 #define DEVICE_ON(device) 338 #define DEVICE_OFF(device) 340 #elif (MAJOR_NR == OPTICS_CDROM_MAJOR) 342 #define DEVICE_NAME"DOLPHIN 8000AT CD-ROM" 343 #define DEVICE_REQUEST do_optcd_request 344 #define DEVICE_NR(device) (MINOR(device)) 345 #define DEVICE_ON(device) 346 #define DEVICE_OFF(device) 348 #elif (MAJOR_NR == SANYO_CDROM_MAJOR) 350 #define DEVICE_NAME"Sanyo H94A CD-ROM" 351 #define DEVICE_REQUEST do_sjcd_request 352 #define DEVICE_NR(device) (MINOR(device)) 353 #define DEVICE_ON(device) 354 #define DEVICE_OFF(device) 356 #elif (MAJOR_NR == APBLOCK_MAJOR) 358 #define DEVICE_NAME"apblock" 359 #define DEVICE_REQUEST ap_request 360 #define DEVICE_NR(device) (MINOR(device)) 361 #define DEVICE_ON(device) 362 #define DEVICE_OFF(device) 364 #elif (MAJOR_NR == DDV_MAJOR) 366 #define DEVICE_NAME"ddv" 367 #define DEVICE_REQUEST ddv_request 368 #define DEVICE_NR(device) (MINOR(device)>>PARTN_BITS) 369 #define DEVICE_ON(device) 370 #define DEVICE_OFF(device) 372 #endif/* MAJOR_NR == whatever */ 374 #if (MAJOR_NR != SCSI_TAPE_MAJOR) 375 #if !defined(IDE_DRIVER) 378 #define CURRENT (blk_dev[MAJOR_NR].current_request) 381 #define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev) 384 static void(*DEVICE_INTR
)(void) = NULL
; 386 #ifdef DEVICE_TIMEOUT 389 ((timer_table[DEVICE_TIMEOUT].expires = jiffies + TIMEOUT_VALUE), \ 390 (timer_active |= 1<<DEVICE_TIMEOUT)) 392 #define CLEAR_TIMER \ 393 timer_active &= ~(1<<DEVICE_TIMEOUT) 395 #define SET_INTR(x) \ 396 if ((DEVICE_INTR = (x)) != NULL) \ 403 #define SET_INTR(x) (DEVICE_INTR = (x)) 405 #endif/* DEVICE_TIMEOUT */ 407 static void(DEVICE_REQUEST
)(void); 410 #define CLEAR_INTR SET_INTR(NULL) 415 #define INIT_REQUEST \ 420 if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \ 421 panic(DEVICE_NAME": request list destroyed"); \ 423 if (!buffer_locked(CURRENT->bh)) \ 424 panic(DEVICE_NAME": block not locked"); \ 427 #endif/* !defined(IDE_DRIVER) */ 429 /* end_request() - SCSI devices have their own version */ 430 /* - IDE drivers have their own copy too */ 432 #if ! SCSI_BLK_MAJOR(MAJOR_NR) 434 #if defined(IDE_DRIVER) && !defined(_IDE_C)/* shared copy for IDE modules */ 435 voidide_end_request(byte uptodate
, ide_hwgroup_t
*hwgroup
); 439 voidide_end_request(byte uptodate
, ide_hwgroup_t
*hwgroup
) { 440 struct request
*req
= hwgroup
->rq
; 442 static voidend_request(int uptodate
) { 443 struct request
*req
= CURRENT
; 444 #endif/* IDE_DRIVER */ 445 struct buffer_head
* bh
; 450 printk("end_request: I/O error, dev %s, sector %lu\n", 451 kdevname(req
->rq_dev
), req
->sector
); 452 if((bh
= req
->bh
) != NULL
) { 453 nsect
= bh
->b_size
>>9; 455 req
->nr_sectors
&= ~(nsect
-1); 456 req
->sector
+= nsect
; 457 req
->sector
&= ~(nsect
-1); 461 if((bh
= req
->bh
) != NULL
) { 462 req
->bh
= bh
->b_reqnext
; 463 bh
->b_reqnext
= NULL
; 464 bh
->b_end_io(bh
, uptodate
); 465 if((bh
= req
->bh
) != NULL
) { 466 req
->current_nr_sectors
= bh
->b_size
>>9; 467 if(req
->nr_sectors
< req
->current_nr_sectors
) { 468 req
->nr_sectors
= req
->current_nr_sectors
; 469 printk("end_request: buffer-list destroyed\n"); 471 req
->buffer
= bh
->b_data
; 475 #ifndef DEVICE_NO_RANDOM 476 add_blkdev_randomness(MAJOR(req
->rq_dev
)); 479 hwgroup
->drive
->queue
= req
->next
; 480 blk_dev
[MAJOR(req
->rq_dev
)].current_request
= NULL
; 483 DEVICE_OFF(req
->rq_dev
); 485 #endif/* IDE_DRIVER */ 488 req
->rq_status
= RQ_INACTIVE
; 489 wake_up(&wait_for_request
); 491 #endif/* defined(IDE_DRIVER) && !defined(_IDE_C) */ 492 #endif/* ! SCSI_BLK_MAJOR(MAJOR_NR) */ 493 #endif/* (MAJOR_NR != SCSI_TAPE_MAJOR) */ 495 #endif/* defined(MAJOR_NR) || defined(IDE_DRIVER) */