root / lab4 / .minix-src / include / sys / disk.h @ 13
History | View | Annotate | Download (17.4 KB)
1 |
/* $NetBSD: disk.h,v 1.65 2015/08/16 18:00:03 mlelstv Exp $ */
|
---|---|
2 |
|
3 |
/*-
|
4 |
* Copyright (c) 1996, 1997, 2004 The NetBSD Foundation, Inc.
|
5 |
* All rights reserved.
|
6 |
*
|
7 |
* This code is derived from software contributed to The NetBSD Foundation
|
8 |
* by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
|
9 |
* NASA Ames Research Center.
|
10 |
*
|
11 |
* Redistribution and use in source and binary forms, with or without
|
12 |
* modification, are permitted provided that the following conditions
|
13 |
* are met:
|
14 |
* 1. Redistributions of source code must retain the above copyright
|
15 |
* notice, this list of conditions and the following disclaimer.
|
16 |
* 2. Redistributions in binary form must reproduce the above copyright
|
17 |
* notice, this list of conditions and the following disclaimer in the
|
18 |
* documentation and/or other materials provided with the distribution.
|
19 |
*
|
20 |
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
21 |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22 |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
23 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
24 |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25 |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26 |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
27 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
28 |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
29 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30 |
* POSSIBILITY OF SUCH DAMAGE.
|
31 |
*/
|
32 |
|
33 |
/*
|
34 |
* Copyright (c) 1992, 1993
|
35 |
* The Regents of the University of California. All rights reserved.
|
36 |
*
|
37 |
* This software was developed by the Computer Systems Engineering group
|
38 |
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
|
39 |
* contributed to Berkeley.
|
40 |
*
|
41 |
* All advertising materials mentioning features or use of this software
|
42 |
* must display the following acknowledgement:
|
43 |
* This product includes software developed by the University of
|
44 |
* California, Lawrence Berkeley Laboratories.
|
45 |
*
|
46 |
* Redistribution and use in source and binary forms, with or without
|
47 |
* modification, are permitted provided that the following conditions
|
48 |
* are met:
|
49 |
* 1. Redistributions of source code must retain the above copyright
|
50 |
* notice, this list of conditions and the following disclaimer.
|
51 |
* 2. Redistributions in binary form must reproduce the above copyright
|
52 |
* notice, this list of conditions and the following disclaimer in the
|
53 |
* documentation and/or other materials provided with the distribution.
|
54 |
* 3. Neither the name of the University nor the names of its contributors
|
55 |
* may be used to endorse or promote products derived from this software
|
56 |
* without specific prior written permission.
|
57 |
*
|
58 |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
59 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
60 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
61 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
62 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
63 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
64 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
65 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
66 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
67 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
68 |
* SUCH DAMAGE.
|
69 |
*
|
70 |
* from: Header: disk.h,v 1.5 92/11/19 04:33:03 torek Exp (LBL)
|
71 |
*
|
72 |
* @(#)disk.h 8.2 (Berkeley) 1/9/95
|
73 |
*/
|
74 |
|
75 |
#ifndef _SYS_DISK_H_
|
76 |
#define _SYS_DISK_H_
|
77 |
|
78 |
/*
|
79 |
* Disk device structures.
|
80 |
*/
|
81 |
|
82 |
#ifdef _KERNEL
|
83 |
#include <sys/device.h> |
84 |
#endif
|
85 |
#include <sys/dkio.h> |
86 |
#include <sys/time.h> |
87 |
#include <sys/queue.h> |
88 |
#include <sys/mutex.h> |
89 |
#include <sys/iostat.h> |
90 |
|
91 |
#include <prop/proplib.h> |
92 |
|
93 |
struct buf;
|
94 |
struct disk;
|
95 |
struct disklabel;
|
96 |
struct cpu_disklabel;
|
97 |
struct lwp;
|
98 |
struct vnode;
|
99 |
|
100 |
/*
|
101 |
* Disk information dictionary.
|
102 |
*
|
103 |
* This contains general infomation for disk devices.
|
104 |
*
|
105 |
* <dict>
|
106 |
* <key>type</key>
|
107 |
* <string>...</string>
|
108 |
* <key>geometry</key>
|
109 |
* <dict>
|
110 |
* <!-- See below for disk geometry dictionary
|
111 |
* contents. -->
|
112 |
* </dict>
|
113 |
*
|
114 |
* <!-- optional information -->
|
115 |
* <key>rpm</key>
|
116 |
* <integer>...</integer>
|
117 |
* <key>sector-interleave</key>
|
118 |
* <integer>...</integer>
|
119 |
* <key>track-skew</key>
|
120 |
* <integer>...</integer>
|
121 |
* <key>cylinder-skew</key>
|
122 |
* <integer>...</integer>
|
123 |
* <key>head-switch-usecs</key>
|
124 |
* <integer>...</integer>
|
125 |
* <key>track-seek-usecs</key>
|
126 |
* <integer>...</integer>
|
127 |
* <key>removable</key>
|
128 |
* <false/>
|
129 |
* <key>ecc</key>
|
130 |
* <false/>
|
131 |
* <key>bad-sector-forwarding</key>
|
132 |
* <true/>
|
133 |
* <key>ramdisk</key>
|
134 |
* <false/>
|
135 |
* <key>back-to-back-transfers</key>
|
136 |
* <true/>
|
137 |
*
|
138 |
* <!-- additional information for SMD drives -->
|
139 |
* <key>smd-skip-sectoring</key>
|
140 |
* <false/>
|
141 |
* <!-- XXX better names for these properties -->
|
142 |
* <key>smd-mindist</key>
|
143 |
* <integer>...</integer>
|
144 |
* <key>smd-maxdist</key>
|
145 |
* <integer>...</integer>
|
146 |
* <key>smd-sdist</key>
|
147 |
* <integer>...</integer>
|
148 |
*
|
149 |
* <!-- additional information for ST506 drives -->
|
150 |
* <!-- XXX better names for these properties -->
|
151 |
* <key>st506-precompcyl</key>
|
152 |
* <integer>...</integer>
|
153 |
* <key>st506-gap3</key>
|
154 |
* <integer>...</integer>
|
155 |
*
|
156 |
* <!-- additional information for ATA drives -->
|
157 |
* <!-- XXX -->
|
158 |
*
|
159 |
* <!-- additional information for SCSI drives -->
|
160 |
* <!-- XXX -->
|
161 |
* </dict>
|
162 |
*/
|
163 |
|
164 |
/*
|
165 |
* dkwedge_info:
|
166 |
*
|
167 |
* Information needed to configure (or query configuration of) a
|
168 |
* disk wedge.
|
169 |
*/
|
170 |
struct dkwedge_info {
|
171 |
char dkw_devname[16];/* device-style name (e.g. "dk0") */ |
172 |
uint8_t dkw_wname[128]; /* wedge name (Unicode, UTF-8) */ |
173 |
char dkw_parent[16]; /* parent disk device name */ |
174 |
daddr_t dkw_offset; /* LBA offset of wedge in parent */
|
175 |
uint64_t dkw_size; /* size of wedge in blocks */
|
176 |
char dkw_ptype[32]; /* partition type string */ |
177 |
}; |
178 |
|
179 |
/*
|
180 |
* dkwedge_list:
|
181 |
*
|
182 |
* Structure used to query a list of wedges.
|
183 |
*/
|
184 |
struct dkwedge_list {
|
185 |
void *dkwl_buf; /* storage for dkwedge_info array */ |
186 |
size_t dkwl_bufsize; /* size of that buffer */
|
187 |
u_int dkwl_nwedges; /* total number of wedges */
|
188 |
u_int dkwl_ncopied; /* number actually copied */
|
189 |
}; |
190 |
|
191 |
#ifdef _KERNEL
|
192 |
/*
|
193 |
* dkwedge_discovery_method:
|
194 |
*
|
195 |
* Structure used to describe partition map parsing schemes
|
196 |
* used for wedge autodiscovery.
|
197 |
*/
|
198 |
struct dkwedge_discovery_method {
|
199 |
/* link in wedge driver's list */
|
200 |
LIST_ENTRY(dkwedge_discovery_method) ddm_list; |
201 |
const char *ddm_name; /* name of this method */ |
202 |
int ddm_priority; /* search priority */ |
203 |
int (*ddm_discover)(struct disk *, struct vnode *); |
204 |
}; |
205 |
|
206 |
#define DKWEDGE_DISCOVERY_METHOD_DECL(name, prio, discover) \
|
207 |
static struct dkwedge_discovery_method name ## _ddm = { \ |
208 |
{ NULL, NULL }, \ |
209 |
#name, \
|
210 |
prio, \ |
211 |
discover \ |
212 |
}; \ |
213 |
__link_set_add_data(dkwedge_methods, name ## _ddm) |
214 |
#endif /* _KERNEL */ |
215 |
|
216 |
/* Some common partition types */
|
217 |
#define DKW_PTYPE_UNKNOWN "" |
218 |
#define DKW_PTYPE_UNUSED "unused" |
219 |
#define DKW_PTYPE_SWAP "swap" |
220 |
#define DKW_PTYPE_V6 "v6" |
221 |
#define DKW_PTYPE_V7 "v7" |
222 |
#define DKW_PTYPE_SYSV "sysv" |
223 |
#define DKW_PTYPE_V71K "v71k" |
224 |
#define DKW_PTYPE_V8 "v8" |
225 |
#define DKW_PTYPE_FFS "ffs" |
226 |
#define DKW_PTYPE_FAT "msdos" |
227 |
#define DKW_PTYPE_LFS "lfs" |
228 |
#define DKW_PTYPE_OTHER "other" |
229 |
#define DKW_PTYPE_HPFS "hpfs" |
230 |
#define DKW_PTYPE_ISO9660 "cd9660" |
231 |
#define DKW_PTYPE_BOOT "boot" |
232 |
#define DKW_PTYPE_AMIGADOS "ados" |
233 |
#define DKW_PTYPE_HFS "hfs" |
234 |
#define DKW_PTYPE_FILECORE "filecore" |
235 |
#define DKW_PTYPE_EXT2FS "ext2fs" |
236 |
#define DKW_PTYPE_NTFS "ntfs" |
237 |
#define DKW_PTYPE_RAIDFRAME "raidframe" |
238 |
#define DKW_PTYPE_CCD "ccd" |
239 |
#define DKW_PTYPE_JFS2 "jfs2" |
240 |
#define DKW_PTYPE_APPLEUFS "appleufs" |
241 |
#define DKW_PTYPE_VINUM "vinum" |
242 |
#define DKW_PTYPE_UDF "udf" |
243 |
#define DKW_PTYPE_APPLEHFS "hfs" |
244 |
#define DKW_PTYPE_SYSVBFS "sysvbfs" |
245 |
#define DKW_PTYPE_EFS "efs" |
246 |
#define DKW_PTYPE_NILFS "nilfs" |
247 |
#define DKW_PTYPE_CGD "cgd" |
248 |
#define DKW_PTYPE_MINIXFS3 "minixfs3" |
249 |
|
250 |
/*
|
251 |
* Ensure each symbol used in FSTYPE_DEFN in <sys/disklabel.h>
|
252 |
* has a corresponding DKW_PTYPE_* definition.
|
253 |
*/
|
254 |
#define DKW_PTYPE_MSDOS DKW_PTYPE_FAT
|
255 |
#define DKW_PTYPE_BSDFFS DKW_PTYPE_FFS
|
256 |
#define DKW_PTYPE_BSDLFS DKW_PTYPE_LFS
|
257 |
#define DKW_PTYPE_ADOS DKW_PTYPE_AMIGADOS
|
258 |
#define DKW_PTYPE_EX2FS DKW_PTYPE_EXT2FS
|
259 |
#define DKW_PTYPE_RAID DKW_PTYPE_RAIDFRAME
|
260 |
|
261 |
/*
|
262 |
* Disk geometry dictionary.
|
263 |
*
|
264 |
* NOTE: Not all geometry information is relevant for every kind of disk.
|
265 |
*
|
266 |
* <dict>
|
267 |
* <key>sectors-per-unit</key>
|
268 |
* <integer>...</integer>
|
269 |
* <key>sector-size</key>
|
270 |
* <integer>...</integer>
|
271 |
* <key>sectors-per-track</key>
|
272 |
* <integer>...</integer>
|
273 |
* <key>tracks-per-cylinder</key>
|
274 |
* <integer>...</integer>
|
275 |
* <key>cylinders-per-unit</key>
|
276 |
* <integer>...</integer>
|
277 |
* <key>physical-cylinders-per-unit</key>
|
278 |
* <integer>...</integer>
|
279 |
* <key>spare-sectors-per-track</key>
|
280 |
* <integer>...</integer>
|
281 |
* <key>spare-sectors-per-cylinder</key>
|
282 |
* <integer>...</integer>
|
283 |
* <key>alternative-cylinders</key>
|
284 |
* <integer>...</integer>
|
285 |
* </dict>
|
286 |
* NOTE: Not all geometry information is relevant for every kind of disk.
|
287 |
*/
|
288 |
|
289 |
struct disk_geom {
|
290 |
int64_t dg_secperunit; /* # of data sectors per unit */
|
291 |
uint32_t dg_secsize; /* # of bytes per sector */
|
292 |
uint32_t dg_nsectors; /* # of data sectors per track */
|
293 |
uint32_t dg_ntracks; /* # of tracks per cylinder */
|
294 |
uint32_t dg_ncylinders; /* # of data cylinders per unit */
|
295 |
uint32_t dg_secpercyl; /* # of data sectors per cylinder */
|
296 |
uint32_t dg_pcylinders; /* # of physical cylinders per unit */
|
297 |
|
298 |
/*
|
299 |
* Spares (bad sector replacements) below are not counted in
|
300 |
* dg_nsectors or dg_secpercyl. Spare sectors are assumed to
|
301 |
* be physical sectors which occupy space at the end of each
|
302 |
* track and/or cylinder.
|
303 |
*/
|
304 |
uint32_t dg_sparespertrack; |
305 |
uint32_t dg_sparespercyl; |
306 |
/*
|
307 |
* Alternative cylinders include maintenance, replacement,
|
308 |
* configuration description areas, etc.
|
309 |
*/
|
310 |
uint32_t dg_acylinders; |
311 |
}; |
312 |
|
313 |
/*
|
314 |
* Disk partition dictionary.
|
315 |
*
|
316 |
* A partition is represented as a dictionary containing generic partition
|
317 |
* properties (such as starting block and block count), as well as information
|
318 |
* that is specific to individual partition map formats.
|
319 |
*
|
320 |
* <dict>
|
321 |
* <key>start-block</key>
|
322 |
* <integer>...</integer>
|
323 |
* <key>block-count</key>
|
324 |
* <integer>...</integer>
|
325 |
* <!-- DKW_PTYPE strings ("" or missing if unknown) -->
|
326 |
* <key>type</type>
|
327 |
* <string>...</string>
|
328 |
* <!-- optional -->
|
329 |
* <key>name</key>
|
330 |
* <string>...</string>
|
331 |
*
|
332 |
* <!-- these are valid for GPT partition maps -->
|
333 |
* <key>gpt-type-guid</key>
|
334 |
* <string>...</string>
|
335 |
* <key>gpt-partition-guid</key>
|
336 |
* <string>...</string>
|
337 |
* <key>gpt-platform-required</key>
|
338 |
* <false/>
|
339 |
*
|
340 |
* <!-- these are valid for 4.4BSD partition maps -->
|
341 |
* <key>bsd44-partition-type</key>
|
342 |
* <integer>...</integer>
|
343 |
* <key>bsd44-fs-fragment-size</key>
|
344 |
* <integer>...</integer>
|
345 |
* <key>bsd44-iso9660-session-offset</key>
|
346 |
* <integer>...</integer>
|
347 |
* <key>bsd44-ffs-cylinders-per-group</key>
|
348 |
* <integer>...</integer>
|
349 |
* <key>bsd44-lfs-segment-shift</key>
|
350 |
* <integer>...</integer>
|
351 |
*
|
352 |
* <!-- these are valid for NeXT partition maps -->
|
353 |
* <key>next-block-size</key>
|
354 |
* <integer>...</integer>
|
355 |
* <key>next-fs-fragment-size</key>
|
356 |
* <integer>...</integer>
|
357 |
* <key>next-fs-optimization</key>
|
358 |
* <string>...</string> <!-- "space" or "time" -->
|
359 |
* <key>next-fs-cylinders-per-group</key>
|
360 |
* <integer>...</integer>
|
361 |
* <key>next-bytes-per-inode-density</key>
|
362 |
* <integer>...</integer>
|
363 |
* <key>next-minfree-percentage</key>
|
364 |
* <integer>...</integer>
|
365 |
* <key>next-run-newfs-during-init</key>
|
366 |
* <false/>
|
367 |
* <key>next-mount-point</key>
|
368 |
* <string>...</string>
|
369 |
* <key>next-automount</key>
|
370 |
* <true/>
|
371 |
* <key>next-partition-type</key>
|
372 |
* <string>...</string>
|
373 |
*
|
374 |
* <!-- these are valid for MBR partition maps -->
|
375 |
* <key>mbr-start-head</key>
|
376 |
* <integer>...</integer>
|
377 |
* <key>mbr-start-sector</key>
|
378 |
* <integer>...</integer>
|
379 |
* <key>mbr-start-cylinder</key>
|
380 |
* <integer>...</integer>
|
381 |
* <key>mbr-partition-type</key>
|
382 |
* <integer>...</integer>
|
383 |
* <key>mbr-end-head</key>
|
384 |
* <integer>...</integer>
|
385 |
* <key>mbr-end-sector</key>
|
386 |
* <integer>...</integer>
|
387 |
* <key>mbr-end-cylinder</key>
|
388 |
* <integer>...</integer>
|
389 |
* <key>mbr-active-partition</key>
|
390 |
* <false/>
|
391 |
*
|
392 |
* <!-- these are valid for Apple partition maps -->
|
393 |
* <key>apple-partition-type</key>
|
394 |
* <string>...</string>
|
395 |
* <!-- XXX What else do we need? wrstuden? -->
|
396 |
*
|
397 |
* <!-- these are valid for RISCiX partition maps -->
|
398 |
* <key>riscix-partition-type</key>
|
399 |
* <integer>...</integer>
|
400 |
*
|
401 |
* <!-- these are valid for MIPS/SGI partition maps -->
|
402 |
* <key>mips-partition-type</key>
|
403 |
* <integer>...</integer>
|
404 |
*
|
405 |
* <!-- SunOS 4 partition maps have no specific
|
406 |
* additional information. Note, however,
|
407 |
* that SunOS 4 partitions must begin on
|
408 |
* cylinder boundaries. -->
|
409 |
*
|
410 |
* <!-- XXX Need Amiga partition map info -->
|
411 |
*
|
412 |
* <!-- these are valid for VTOC partition maps -->
|
413 |
* <key>vtoc-tag</key>
|
414 |
* <integer>...</integer>
|
415 |
* <key>vtoc-unmount</key>
|
416 |
* <false/>
|
417 |
* <key>vtoc-read-only</key>
|
418 |
* <false/>
|
419 |
* <!-- XXX is this really part of the partition info? -->
|
420 |
* <key>vtoc-timestamp</key>
|
421 |
* <integer>...</integer>
|
422 |
*
|
423 |
* <!-- mvme68k partition maps use 4.4BSD partition
|
424 |
* info stuffed into two different areas of the
|
425 |
* disk information label recognized by BUG. -->
|
426 |
*
|
427 |
* <!-- XXX What else? -->
|
428 |
* </dict>
|
429 |
*/
|
430 |
|
431 |
struct disk {
|
432 |
TAILQ_ENTRY(disk) dk_link; /* link in global disklist */
|
433 |
const char *dk_name; /* disk name */ |
434 |
prop_dictionary_t dk_info; /* reference to disk-info dictionary */
|
435 |
struct disk_geom dk_geom; /* cooked version of dk_info */ |
436 |
int dk_bopenmask; /* block devices open */ |
437 |
int dk_copenmask; /* character devices open */ |
438 |
int dk_openmask; /* composite (bopen|copen) */ |
439 |
int dk_state; /* label state ### */ |
440 |
int dk_blkshift; /* shift to convert DEV_BSIZE to blks */ |
441 |
int dk_byteshift; /* shift to convert bytes to blks */ |
442 |
|
443 |
/*
|
444 |
* Metrics data; note that some metrics may have no meaning
|
445 |
* on certain types of disks.
|
446 |
*/
|
447 |
struct io_stats *dk_stats;
|
448 |
|
449 |
const struct dkdriver *dk_driver; /* pointer to driver */ |
450 |
|
451 |
/*
|
452 |
* Information required to be the parent of a disk wedge.
|
453 |
*/
|
454 |
kmutex_t dk_rawlock; /* lock on these fields */
|
455 |
u_int dk_rawopens; /* # of openes of rawvp */
|
456 |
struct vnode *dk_rawvp; /* vnode for the RAW_PART bdev */ |
457 |
|
458 |
kmutex_t dk_openlock; /* lock on these and openmask */
|
459 |
u_int dk_nwedges; /* # of configured wedges */
|
460 |
/* all wedges on this disk */
|
461 |
LIST_HEAD(, dkwedge_softc) dk_wedges; |
462 |
|
463 |
/*
|
464 |
* Disk label information. Storage for the in-core disk label
|
465 |
* must be dynamically allocated, otherwise the size of this
|
466 |
* structure becomes machine-dependent.
|
467 |
*/
|
468 |
daddr_t dk_labelsector; /* sector containing label */
|
469 |
struct disklabel *dk_label; /* label */ |
470 |
struct cpu_disklabel *dk_cpulabel;
|
471 |
}; |
472 |
|
473 |
#ifdef _KERNEL
|
474 |
struct dkdriver {
|
475 |
void (*d_strategy)(struct buf *); |
476 |
void (*d_minphys)(struct buf *); |
477 |
int (*d_open)(dev_t, int, int, struct lwp *); |
478 |
int (*d_close)(dev_t, int, int, struct lwp *); |
479 |
int (*d_diskstart)(device_t, struct buf *); |
480 |
void (*d_iosize)(device_t, int *); |
481 |
int (*d_dumpblocks)(device_t, void *, daddr_t, int); |
482 |
int (*d_lastclose)(device_t);
|
483 |
int (*d_discard)(device_t, off_t, off_t);
|
484 |
}; |
485 |
#endif
|
486 |
|
487 |
/* states */
|
488 |
#define DK_CLOSED 0 /* drive is closed */ |
489 |
#define DK_WANTOPEN 1 /* drive being opened */ |
490 |
#define DK_WANTOPENRAW 2 /* drive being opened */ |
491 |
#define DK_RDLABEL 3 /* label being read */ |
492 |
#define DK_OPEN 4 /* label read, drive open */ |
493 |
#define DK_OPENRAW 5 /* open without label */ |
494 |
|
495 |
/*
|
496 |
* Bad sector lists per fixed disk
|
497 |
*/
|
498 |
struct disk_badsectors {
|
499 |
SLIST_ENTRY(disk_badsectors) dbs_next; |
500 |
daddr_t dbs_min; /* min. sector number */
|
501 |
daddr_t dbs_max; /* max. sector number */
|
502 |
struct timeval dbs_failedat; /* first failure at */ |
503 |
}; |
504 |
|
505 |
struct disk_badsecinfo {
|
506 |
uint32_t dbsi_bufsize; /* size of region pointed to */
|
507 |
uint32_t dbsi_skip; /* how many to skip past */
|
508 |
uint32_t dbsi_copied; /* how many got copied back */
|
509 |
uint32_t dbsi_left; /* remaining to copy */
|
510 |
void * dbsi_buffer; /* region to copy disk_badsectors to */ |
511 |
}; |
512 |
|
513 |
#define DK_STRATEGYNAMELEN 32 |
514 |
struct disk_strategy {
|
515 |
char dks_name[DK_STRATEGYNAMELEN]; /* name of strategy */ |
516 |
char *dks_param; /* notyet; should be NULL */ |
517 |
size_t dks_paramlen; /* notyet; should be 0 */
|
518 |
}; |
519 |
|
520 |
#define DK_BSIZE2BLKSHIFT(b) ((ffs((b) / DEV_BSIZE)) - 1) |
521 |
#define DK_BSIZE2BYTESHIFT(b) (ffs((b)) - 1) |
522 |
|
523 |
#ifdef _KERNEL
|
524 |
extern int disk_count; /* number of disks in global disklist */ |
525 |
|
526 |
struct proc;
|
527 |
|
528 |
void disk_attach(struct disk *); |
529 |
int disk_begindetach(struct disk *, int (*)(device_t), device_t, int); |
530 |
void disk_detach(struct disk *); |
531 |
void disk_init(struct disk *, const char *, const struct dkdriver *); |
532 |
void disk_destroy(struct disk *); |
533 |
void disk_busy(struct disk *); |
534 |
void disk_unbusy(struct disk *, long, int); |
535 |
bool disk_isbusy(struct disk *); |
536 |
struct disk *disk_find(const char *); |
537 |
int disk_ioctl(struct disk *, dev_t, u_long, void *, int, struct lwp *); |
538 |
void disk_set_info(device_t, struct disk *, const char *); |
539 |
|
540 |
void dkwedge_init(void); |
541 |
int dkwedge_add(struct dkwedge_info *); |
542 |
int dkwedge_del(struct dkwedge_info *); |
543 |
void dkwedge_delall(struct disk *); |
544 |
int dkwedge_list(struct disk *, struct dkwedge_list *, struct lwp *); |
545 |
void dkwedge_discover(struct disk *); |
546 |
int dkwedge_read(struct disk *, struct vnode *, daddr_t, void *, size_t); |
547 |
device_t dkwedge_find_by_wname(const char *); |
548 |
const char *dkwedge_get_parent_name(dev_t); |
549 |
void dkwedge_print_wnames(void); |
550 |
device_t dkwedge_find_partition(device_t, daddr_t, uint64_t); |
551 |
#endif
|
552 |
|
553 |
#endif /* _SYS_DISK_H_ */ |