Import 2.1.63
[davej-history.git] / include / linux / blk.h
blob0625942de1e43fdceb91447e3c09079a6387fea9
1 #ifndef _BLK_H
2 #define _BLK_H
4 #include <linux/blkdev.h>
5 #include <linux/locks.h>
6 #include <linux/config.h>
8 /*
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
11 * take precedence.
13 #define NR_REQUEST 64
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)
31 #else
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)
40 #ifdef CONFIG_CDU31A
41 externintcdu31a_init(void);
42 #endif CONFIG_CDU31A
43 #ifdef CONFIG_ATARI_ACSI
44 externintacsi_init(void);
45 #endif CONFIG_ATARI_ACSI
46 #ifdef CONFIG_MCD
47 externintmcd_init(void);
48 #endif CONFIG_MCD
49 #ifdef CONFIG_MCDX
50 externintmcdx_init(void);
51 #endif CONFIG_MCDX
52 #ifdef CONFIG_SBPCD
53 externintsbpcd_init(void);
54 #endif CONFIG_SBPCD
55 #ifdef CONFIG_AZTCD
56 externintaztcd_init(void);
57 #endif CONFIG_AZTCD
58 #ifdef CONFIG_CDU535
59 externintsony535_init(void);
60 #endif CONFIG_CDU535
61 #ifdef CONFIG_GSCD
62 externintgscd_init(void);
63 #endif CONFIG_GSCD
64 #ifdef CONFIG_CM206
65 externintcm206_init(void);
66 #endif CONFIG_CM206
67 #ifdef CONFIG_OPTCD
68 externintoptcd_init(void);
69 #endif CONFIG_OPTCD
70 #ifdef CONFIG_SJCD
71 externintsjcd_init(void);
72 #endif CONFIG_SJCD
73 #ifdef CONFIG_CDI_INIT
74 externintcdi_init(void);
75 #endif CONFIG_CDI_INIT
76 #ifdef CONFIG_BLK_DEV_HD
77 externinthd_init(void);
78 #endif
79 #ifdef CONFIG_BLK_DEV_IDE
80 externintide_init(void);
81 #endif
82 #ifdef CONFIG_BLK_DEV_XD
83 externintxd_init(void);
84 #endif
85 #ifdef CONFIG_BLK_DEV_LOOP
86 externintloop_init(void);
87 #endif
88 #ifdef CONFIG_BLK_DEV_MD
89 externintmd_init(void);
90 #endif CONFIG_BLK_DEV_MD
91 #ifdef CONFIG_APBLOCK
92 externintap_init(void);
93 #endif
94 #ifdef CONFIG_DDV
95 externintddv_init(void);
96 #endif
97 #ifdef CONFIG_AMIGA_Z2RAM
98 externintz2_init(void);
99 #endif
100 #ifdef CONFIG_MAC_FLOPPY
101 externintswim3_init(void);
102 #endif
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);
123 #endif
124 #ifdef CONFIG_BLK_DEV_PS2
125 externintps2esdi_init(void);
126 #endif
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.
141 #ifdef IDE_DRIVER
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)
149 /* ram disk */
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)
159 /* Zorro II Ram */
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)
377 #ifndef CURRENT
378 #define CURRENT (blk_dev[MAJOR_NR].current_request)
379 #endif
381 #define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev)
383 #ifdef DEVICE_INTR
384 static void(*DEVICE_INTR)(void) = NULL;
385 #endif
386 #ifdef DEVICE_TIMEOUT
388 #define SET_TIMER \
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) \
397 SET_TIMER; \
398 else \
399 CLEAR_TIMER;
401 #else
403 #define SET_INTR(x) (DEVICE_INTR = (x))
405 #endif/* DEVICE_TIMEOUT */
407 static void(DEVICE_REQUEST)(void);
409 #ifdef DEVICE_INTR
410 #define CLEAR_INTR SET_INTR(NULL)
411 #else
412 #define CLEAR_INTR
413 #endif
415 #define INIT_REQUEST \
416 if (!CURRENT) {\
417 CLEAR_INTR; \
418 return; \
420 if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \
421 panic(DEVICE_NAME": request list destroyed"); \
422 if (CURRENT->bh) { \
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);
436 #else
438 #ifdef IDE_DRIVER
439 voidide_end_request(byte uptodate, ide_hwgroup_t *hwgroup) {
440 struct request *req = hwgroup->rq;
441 #else
442 static voidend_request(int uptodate) {
443 struct request *req = CURRENT;
444 #endif/* IDE_DRIVER */
445 struct buffer_head * bh;
446 int nsect;
448 req->errors =0;
449 if(!uptodate) {
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;
454 req->nr_sectors--;
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;
472 return;
475 #ifndef DEVICE_NO_RANDOM
476 add_blkdev_randomness(MAJOR(req->rq_dev));
477 #endif
478 #ifdef IDE_DRIVER
479 hwgroup->drive->queue = req->next;
480 blk_dev[MAJOR(req->rq_dev)].current_request = NULL;
481 hwgroup->rq = NULL;
482 #else
483 DEVICE_OFF(req->rq_dev);
484 CURRENT = req->next;
485 #endif/* IDE_DRIVER */
486 if(req->sem != NULL)
487 up(req->sem);
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) */
497 #endif/* _BLK_H */
close