This source file includes following definitions.
- end_request
1 #ifndef _BLK_H
2 #define _BLK_H
3
4 #include <linux/blkdev.h>
5 #include <linux/locks.h>
6
7
8
9
10
11
12
13
14
15
16
17 #define NR_REQUEST 64
18
19
20
21
22
23
24 #define IN_ORDER(s1,s2) \
25 ((s1)->cmd < (s2)->cmd || ((s1)->cmd == (s2)->cmd && \
26 ((s1)->dev < (s2)->dev || (((s1)->dev == (s2)->dev && \
27 (s1)->sector < (s2)->sector)))))
28
29
30
31
32
33 #define SECTOR_MASK (blksize_size[MAJOR_NR] && \
34 blksize_size[MAJOR_NR][MINOR(CURRENT->dev)] ? \
35 ((blksize_size[MAJOR_NR][MINOR(CURRENT->dev)] >> 9) - 1) : \
36 ((BLOCK_SIZE >> 9) - 1))
37
38 #define SUBSECTOR(block) (CURRENT->current_nr_sectors > 0)
39
40 extern unsigned long hd_init(unsigned long mem_start, unsigned long mem_end);
41 extern unsigned long cdu31a_init(unsigned long mem_start, unsigned long mem_end);
42 extern unsigned long mcd_init(unsigned long mem_start, unsigned long mem_end);
43 #ifdef CONFIG_SBPCD
44 extern unsigned long sbpcd_init(unsigned long, unsigned long);
45 #endif CONFIG_SBPCD
46 extern void set_device_ro(int dev,int flag);
47
48 extern void floppy_init(void);
49 #ifdef FD_MODULE
50 static
51 #else
52 extern
53 #endif
54 int new_floppy_init(void);
55 extern void rd_load(void);
56 extern long rd_init(long mem_start, int length);
57 extern int ramdisk_size;
58
59 extern unsigned long xd_init(unsigned long mem_start, unsigned long mem_end);
60
61 #define RO_IOCTLS(dev,where) \
62 case BLKROSET: if (!suser()) return -EACCES; \
63 set_device_ro((dev),get_fs_long((long *) (where))); return 0; \
64 case BLKROGET: { int __err = verify_area(VERIFY_WRITE, (void *) (where), sizeof(long)); \
65 if (!__err) put_fs_long(0!=is_read_only(dev),(long *) (where)); return __err; }
66
67 #ifdef MAJOR_NR
68
69
70
71
72
73
74 #if (MAJOR_NR == MEM_MAJOR)
75
76
77 #define DEVICE_NAME "ramdisk"
78 #define DEVICE_REQUEST do_rd_request
79 #define DEVICE_NR(device) ((device) & 7)
80 #define DEVICE_ON(device)
81 #define DEVICE_OFF(device)
82
83 #elif (MAJOR_NR == FLOPPY_MAJOR)
84
85 static void floppy_off(unsigned int nr);
86
87 #define DEVICE_NAME "floppy"
88 #define DEVICE_INTR do_floppy
89 #define DEVICE_REQUEST do_fd_request
90 #define DEVICE_NR(device) ( ((device) & 3) | (((device) & 0x80 ) >> 5 ))
91 #define DEVICE_ON(device)
92 #define DEVICE_OFF(device) floppy_off(DEVICE_NR(device))
93
94 #elif (MAJOR_NR == HD_MAJOR)
95
96
97 #define DEVICE_NAME "harddisk"
98 #define DEVICE_INTR do_hd
99 #define DEVICE_TIMEOUT HD_TIMER
100 #define TIMEOUT_VALUE 600
101 #define DEVICE_REQUEST do_hd_request
102 #define DEVICE_NR(device) (MINOR(device)>>6)
103 #define DEVICE_ON(device)
104 #define DEVICE_OFF(device)
105
106 #elif (MAJOR_NR == SCSI_DISK_MAJOR)
107
108 #define DEVICE_NAME "scsidisk"
109 #define DEVICE_INTR do_sd
110 #define TIMEOUT_VALUE 200
111 #define DEVICE_REQUEST do_sd_request
112 #define DEVICE_NR(device) (MINOR(device) >> 4)
113 #define DEVICE_ON(device)
114 #define DEVICE_OFF(device)
115
116 #elif (MAJOR_NR == SCSI_TAPE_MAJOR)
117
118 #define DEVICE_NAME "scsitape"
119 #define DEVICE_INTR do_st
120 #define DEVICE_NR(device) (MINOR(device))
121 #define DEVICE_ON(device)
122 #define DEVICE_OFF(device)
123
124 #elif (MAJOR_NR == SCSI_CDROM_MAJOR)
125
126 #define DEVICE_NAME "CD-ROM"
127 #define DEVICE_INTR do_sr
128 #define DEVICE_REQUEST do_sr_request
129 #define DEVICE_NR(device) (MINOR(device))
130 #define DEVICE_ON(device)
131 #define DEVICE_OFF(device)
132
133 #elif (MAJOR_NR == XT_DISK_MAJOR)
134
135 #define DEVICE_NAME "xt disk"
136 #define DEVICE_REQUEST do_xd_request
137 #define DEVICE_NR(device) (MINOR(device) >> 6)
138 #define DEVICE_ON(device)
139 #define DEVICE_OFF(device)
140
141 #elif (MAJOR_NR == CDU31A_CDROM_MAJOR)
142
143 #define DEVICE_NAME "CDU31A"
144 #define DEVICE_REQUEST do_cdu31a_request
145 #define DEVICE_NR(device) (MINOR(device))
146 #define DEVICE_ON(device)
147 #define DEVICE_OFF(device)
148
149 #elif (MAJOR_NR == MITSUMI_CDROM_MAJOR)
150
151 #define DEVICE_NAME "Mitsumi CD-ROM"
152
153 #define DEVICE_REQUEST do_mcd_request
154 #define DEVICE_NR(device) (MINOR(device))
155 #define DEVICE_ON(device)
156 #define DEVICE_OFF(device)
157
158 #elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR)
159
160 #define DEVICE_NAME "Matsushita CD-ROM controller #1"
161 #define DEVICE_REQUEST do_sbpcd_request
162 #define DEVICE_NR(device) (MINOR(device))
163 #define DEVICE_ON(device)
164 #define DEVICE_OFF(device)
165
166 #elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR)
167
168 #define DEVICE_NAME "Matsushita CD-ROM controller #2"
169 #define DEVICE_REQUEST do_sbpcd2_request
170 #define DEVICE_NR(device) (MINOR(device))
171 #define DEVICE_ON(device)
172 #define DEVICE_OFF(device)
173
174 #elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR)
175
176 #define DEVICE_NAME "Matsushita CD-ROM controller #3"
177 #define DEVICE_REQUEST do_sbpcd3_request
178 #define DEVICE_NR(device) (MINOR(device))
179 #define DEVICE_ON(device)
180 #define DEVICE_OFF(device)
181
182 #elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR)
183
184 #define DEVICE_NAME "Matsushita CD-ROM controller #4"
185 #define DEVICE_REQUEST do_sbpcd4_request
186 #define DEVICE_NR(device) (MINOR(device))
187 #define DEVICE_ON(device)
188 #define DEVICE_OFF(device)
189
190 #endif
191
192 #if (MAJOR_NR != SCSI_TAPE_MAJOR)
193
194 #ifndef CURRENT
195 #define CURRENT (blk_dev[MAJOR_NR].current_request)
196 #endif
197
198 #define CURRENT_DEV DEVICE_NR(CURRENT->dev)
199
200 #ifdef DEVICE_INTR
201 void (*DEVICE_INTR)(void) = NULL;
202 #endif
203 #ifdef DEVICE_TIMEOUT
204
205 #define SET_TIMER \
206 ((timer_table[DEVICE_TIMEOUT].expires = jiffies + TIMEOUT_VALUE), \
207 (timer_active |= 1<<DEVICE_TIMEOUT))
208
209 #define CLEAR_TIMER \
210 timer_active &= ~(1<<DEVICE_TIMEOUT)
211
212 #define SET_INTR(x) \
213 if ((DEVICE_INTR = (x)) != NULL) \
214 SET_TIMER; \
215 else \
216 CLEAR_TIMER;
217
218 #else
219
220 #define SET_INTR(x) (DEVICE_INTR = (x))
221
222 #endif
223 static void (DEVICE_REQUEST)(void);
224
225
226
227 #if ! SCSI_MAJOR(MAJOR_NR)
228
229 static void end_request(int uptodate)
230 {
231 struct request * req;
232 struct buffer_head * bh;
233
234 req = CURRENT;
235 req->errors = 0;
236 if (!uptodate) {
237 printk(DEVICE_NAME " I/O error\n");
238 printk("dev %04lX, sector %lu\n",
239 (unsigned long)req->dev, req->sector);
240 req->nr_sectors--;
241 req->nr_sectors &= ~SECTOR_MASK;
242 req->sector += (BLOCK_SIZE / 512);
243 req->sector &= ~SECTOR_MASK;
244 }
245
246 if ((bh = req->bh) != NULL) {
247 req->bh = bh->b_reqnext;
248 bh->b_reqnext = NULL;
249 bh->b_uptodate = uptodate;
250 if (!uptodate) bh->b_req = 0;
251 unlock_buffer(bh);
252 if ((bh = req->bh) != NULL) {
253 req->current_nr_sectors = bh->b_size >> 9;
254 if (req->nr_sectors < req->current_nr_sectors) {
255 req->nr_sectors = req->current_nr_sectors;
256 printk("end_request: buffer-list destroyed\n");
257 }
258 req->buffer = bh->b_data;
259 return;
260 }
261 }
262 DEVICE_OFF(req->dev);
263 CURRENT = req->next;
264 if (req->sem != NULL)
265 up(req->sem);
266 req->dev = -1;
267 wake_up(&wait_for_request);
268 }
269 #endif
270
271 #ifdef DEVICE_INTR
272 #define CLEAR_INTR SET_INTR(NULL)
273 #else
274 #define CLEAR_INTR
275 #endif
276
277 #define INIT_REQUEST \
278 if (!CURRENT) {\
279 CLEAR_INTR; \
280 return; \
281 } \
282 if (MAJOR(CURRENT->dev) != MAJOR_NR) \
283 panic(DEVICE_NAME ": request list destroyed"); \
284 if (CURRENT->bh) { \
285 if (!CURRENT->bh->b_lock) \
286 panic(DEVICE_NAME ": block not locked"); \
287 }
288
289 #endif
290
291 #endif
292 #endif