1 /* $NetBSD: disk.h,v 1.55 2011/11/13 22:07:00 christos Exp $ */
4 * Copyright (c) 1996, 1997, 2004 The NetBSD Foundation, Inc.
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.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
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.
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.
34 * Copyright (c) 1992, 1993
35 * The Regents of the University of California. All rights reserved.
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.
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.
46 * Redistribution and use in source and binary forms, with or without
47 * modification, are permitted provided that the following conditions
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.
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
70 * from: Header: disk.h,v 1.5 92/11/19 04:33:03 torek Exp (LBL)
72 * @(#)disk.h 8.2 (Berkeley) 1/9/95
79 * Disk device structures.
83 #include <sys/device.h>
87 #include <sys/queue.h>
88 #include <sys/mutex.h>
89 #include <sys/iostat.h>
91 #include <prop/proplib.h>
101 * Disk information dictionary.
103 * This contains general infomation for disk devices.
107 * <string>...</string>
108 * <key>geometry</key>
110 * <!-- See below for disk geometry dictionary
114 * <!-- optional information -->
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>
131 * <key>bad-sector-forwarding</key>
135 * <key>back-to-back-transfers</key>
138 * <!-- additional information for SMD drives -->
139 * <key>smd-skip-sectoring</key>
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>
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>
156 * <!-- additional information for ATA drives -->
159 * <!-- additional information for SCSI drives -->
167 * Information needed to configure (or query configuration of) a
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 */
182 * Structure used to query a list of wedges.
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 */
193 * dkwedge_discovery_method:
195 * Structure used to describe partition map parsing schemes
196 * used for wedge autodiscovery.
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
*);
206 #define DKWEDGE_DISCOVERY_METHOD_DECL(name, prio, discover) \
207 static struct dkwedge_discovery_method name ## _ddm = { \
213 __link_set_add_data(dkwedge_methods, name ## _ddm)
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"
250 * Disk geometry dictionary.
252 * NOTE: Not all geometry information is relevant for every kind of disk.
255 * <key>sectors-per-unit</key>
256 * <integer>...</integer>
257 * <key>sector-size</key>
258 * <integer>...</integer>
259 * <key>sectors-per-track</key>
260 * <integer>...</integer>
261 * <key>tracks-per-cylinder</key>
262 * <integer>...</integer>
263 * <key>cylinders-per-unit</key>
264 * <integer>...</integer>
265 * <key>physical-cylinders-per-unit</key>
266 * <integer>...</integer>
267 * <key>spare-sectors-per-track</key>
268 * <integer>...</integer>
269 * <key>spare-sectors-per-cylinder</key>
270 * <integer>...</integer>
271 * <key>alternative-cylinders</key>
272 * <integer>...</integer>
274 * NOTE: Not all geometry information is relevant for every kind of disk.
278 int64_t dg_secperunit
; /* # of data sectors per unit */
279 uint32_t dg_secsize
; /* # of bytes per sector */
280 uint32_t dg_nsectors
; /* # of data sectors per track */
281 uint32_t dg_ntracks
; /* # of tracks per cylinder */
282 uint32_t dg_ncylinders
; /* # of data cylinders per unit */
283 uint32_t dg_secpercyl
; /* # of data sectors per cylinder */
284 uint32_t dg_pcylinders
; /* # of physical cylinders per unit */
287 * Spares (bad sector replacements) below are not counted in
288 * dg_nsectors or dg_secpercyl. Spare sectors are assumed to
289 * be physical sectors which occupy space at the end of each
290 * track and/or cylinder.
292 uint32_t dg_sparespertrack
;
293 uint32_t dg_sparespercyl
;
295 * Alternative cylinders include maintenance, replacement,
296 * configuration description areas, etc.
298 uint32_t dg_acylinders
;
302 * Disk partition dictionary.
304 * A partition is represented as a dictionary containing generic partition
305 * properties (such as starting block and block count), as well as information
306 * that is specific to individual partition map formats.
309 * <key>start-block</key>
310 * <integer>...</integer>
311 * <key>block-count</key>
312 * <integer>...</integer>
313 * <!-- DKW_PTYPE strings ("" or missing if unknown) -->
315 * <string>...</string>
318 * <string>...</string>
320 * <!-- these are valid for GPT partition maps -->
321 * <key>gpt-type-guid</key>
322 * <string>...</string>
323 * <key>gpt-partition-guid</key>
324 * <string>...</string>
325 * <key>gpt-platform-required</key>
328 * <!-- these are valid for 4.4BSD partition maps -->
329 * <key>bsd44-partition-type</key>
330 * <integer>...</integer>
331 * <key>bsd44-fs-fragment-size</key>
332 * <integer>...</integer>
333 * <key>bsd44-iso9660-session-offset</key>
334 * <integer>...</integer>
335 * <key>bsd44-ffs-cylinders-per-group</key>
336 * <integer>...</integer>
337 * <key>bsd44-lfs-segment-shift</key>
338 * <integer>...</integer>
340 * <!-- these are valid for NeXT partition maps -->
341 * <key>next-block-size</key>
342 * <integer>...</integer>
343 * <key>next-fs-fragment-size</key>
344 * <integer>...</integer>
345 * <key>next-fs-optimization</key>
346 * <string>...</string> <!-- "space" or "time" -->
347 * <key>next-fs-cylinders-per-group</key>
348 * <integer>...</integer>
349 * <key>next-bytes-per-inode-density</key>
350 * <integer>...</integer>
351 * <key>next-minfree-percentage</key>
352 * <integer>...</integer>
353 * <key>next-run-newfs-during-init</key>
355 * <key>next-mount-point</key>
356 * <string>...</string>
357 * <key>next-automount</key>
359 * <key>next-partition-type</key>
360 * <string>...</string>
362 * <!-- these are valid for MBR partition maps -->
363 * <key>mbr-start-head</key>
364 * <integer>...</integer>
365 * <key>mbr-start-sector</key>
366 * <integer>...</integer>
367 * <key>mbr-start-cylinder</key>
368 * <integer>...</integer>
369 * <key>mbr-partition-type</key>
370 * <integer>...</integer>
371 * <key>mbr-end-head</key>
372 * <integer>...</integer>
373 * <key>mbr-end-sector</key>
374 * <integer>...</integer>
375 * <key>mbr-end-cylinder</key>
376 * <integer>...</integer>
377 * <key>mbr-active-partition</key>
380 * <!-- these are valid for Apple partition maps -->
381 * <key>apple-partition-type</key>
382 * <string>...</string>
383 * <!-- XXX What else do we need? wrstuden? -->
385 * <!-- these are valid for RISCiX partition maps -->
386 * <key>riscix-partition-type</key>
387 * <integer>...</integer>
389 * <!-- these are valid for MIPS/SGI partition maps -->
390 * <key>mips-partition-type</key>
391 * <integer>...</integer>
393 * <!-- SunOS 4 partition maps have no specific
394 * additional information. Note, however,
395 * that SunOS 4 partitions must begin on
396 * cylinder boundaries. -->
398 * <!-- XXX Need Amiga partition map info -->
400 * <!-- these are valid for VTOC partition maps -->
401 * <key>vtoc-tag</key>
402 * <integer>...</integer>
403 * <key>vtoc-unmount</key>
405 * <key>vtoc-read-only</key>
407 * <!-- XXX is this really part of the partition info? -->
408 * <key>vtoc-timestamp</key>
409 * <integer>...</integer>
411 * <!-- mvme68k partition maps use 4.4BSD partition
412 * info stuffed into two different areas of the
413 * disk information label recognized by BUG. -->
415 * <!-- XXX What else? -->
420 TAILQ_ENTRY(disk
) dk_link
; /* link in global disklist */
421 const char *dk_name
; /* disk name */
422 prop_dictionary_t dk_info
; /* reference to disk-info dictionary */
423 int dk_bopenmask
; /* block devices open */
424 int dk_copenmask
; /* character devices open */
425 int dk_openmask
; /* composite (bopen|copen) */
426 int dk_state
; /* label state ### */
427 int dk_blkshift
; /* shift to convert DEV_BSIZE to blks */
428 int dk_byteshift
; /* shift to convert bytes to blks */
431 * Metrics data; note that some metrics may have no meaning
432 * on certain types of disks.
434 struct io_stats
*dk_stats
;
436 const struct dkdriver
*dk_driver
; /* pointer to driver */
439 * Information required to be the parent of a disk wedge.
441 kmutex_t dk_rawlock
; /* lock on these fields */
442 u_int dk_rawopens
; /* # of openes of rawvp */
443 struct vnode
*dk_rawvp
; /* vnode for the RAW_PART bdev */
445 kmutex_t dk_openlock
; /* lock on these and openmask */
446 u_int dk_nwedges
; /* # of configured wedges */
447 /* all wedges on this disk */
448 LIST_HEAD(, dkwedge_softc
) dk_wedges
;
451 * Disk label information. Storage for the in-core disk label
452 * must be dynamically allocated, otherwise the size of this
453 * structure becomes machine-dependent.
455 daddr_t dk_labelsector
; /* sector containing label */
456 struct disklabel
*dk_label
; /* label */
457 struct cpu_disklabel
*dk_cpulabel
;
461 void (*d_strategy
)(struct buf
*);
462 void (*d_minphys
)(struct buf
*);
464 int (*d_open
)(dev_t
, int, int, struct proc
*);
465 int (*d_close
)(dev_t
, int, int, struct proc
*);
466 int (*d_ioctl
)(dev_t
, u_long
, void *, int, struct proc
*);
467 int (*d_dump
)(dev_t
);
468 void (*d_start
)(struct buf
*, daddr_t
);
469 int (*d_mklabel
)(struct disk
*);
474 #define DK_CLOSED 0 /* drive is closed */
475 #define DK_WANTOPEN 1 /* drive being opened */
476 #define DK_WANTOPENRAW 2 /* drive being opened */
477 #define DK_RDLABEL 3 /* label being read */
478 #define DK_OPEN 4 /* label read, drive open */
479 #define DK_OPENRAW 5 /* open without label */
482 * Bad sector lists per fixed disk
484 struct disk_badsectors
{
485 SLIST_ENTRY(disk_badsectors
) dbs_next
;
486 daddr_t dbs_min
; /* min. sector number */
487 daddr_t dbs_max
; /* max. sector number */
488 struct timeval dbs_failedat
; /* first failure at */
491 struct disk_badsecinfo
{
492 uint32_t dbsi_bufsize
; /* size of region pointed to */
493 uint32_t dbsi_skip
; /* how many to skip past */
494 uint32_t dbsi_copied
; /* how many got copied back */
495 uint32_t dbsi_left
; /* remaining to copy */
496 void * dbsi_buffer
; /* region to copy disk_badsectors to */
499 #define DK_STRATEGYNAMELEN 32
500 struct disk_strategy
{
501 char dks_name
[DK_STRATEGYNAMELEN
]; /* name of strategy */
502 char *dks_param
; /* notyet; should be NULL */
503 size_t dks_paramlen
; /* notyet; should be 0 */
506 #define DK_BSIZE2BLKSHIFT(b) ((ffs((b) / DEV_BSIZE)) - 1)
507 #define DK_BSIZE2BYTESHIFT(b) (ffs((b)) - 1)
510 extern int disk_count
; /* number of disks in global disklist */
514 void disk_attach(struct disk
*);
515 int disk_begindetach(struct disk
*, int (*)(device_t
), device_t
, int);
516 void disk_detach(struct disk
*);
517 void disk_init(struct disk
*, const char *, const struct dkdriver
*);
518 void disk_destroy(struct disk
*);
519 void disk_busy(struct disk
*);
520 void disk_unbusy(struct disk
*, long, int);
521 bool disk_isbusy(struct disk
*);
522 void disk_blocksize(struct disk
*, int);
523 struct disk
*disk_find(const char *);
524 int disk_ioctl(struct disk
*, u_long
, void *, int, struct lwp
*);
526 void dkwedge_init(void);
527 int dkwedge_add(struct dkwedge_info
*);
528 int dkwedge_del(struct dkwedge_info
*);
529 void dkwedge_delall(struct disk
*);
530 int dkwedge_list(struct disk
*, struct dkwedge_list
*, struct lwp
*);
531 void dkwedge_discover(struct disk
*);
532 void dkwedge_set_bootwedge(device_t
, daddr_t
, uint64_t);
533 int dkwedge_read(struct disk
*, struct vnode
*, daddr_t
, void *, size_t);
534 device_t
dkwedge_find_by_wname(const char *);
535 void dkwedge_print_wnames(void);
538 #endif /* _SYS_DISK_H_ */