| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: disk.h,v 1.70 2017/03/05 23:07:12 mlelstv Exp $ */ | | 1 | /* $NetBSD: disk.h,v 1.71 2017/06/08 22:24:59 chs Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 1996, 1997, 2004 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 1996, 1997, 2004 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, | | 8 | * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, |
9 | * NASA Ames Research Center. | | 9 | * NASA Ames Research Center. |
10 | * | | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | | 11 | * Redistribution and use in source and binary forms, with or without |
12 | * modification, are permitted provided that the following conditions | | 12 | * modification, are permitted provided that the following conditions |
13 | * are met: | | 13 | * are met: |
14 | * 1. Redistributions of source code must retain the above copyright | | 14 | * 1. Redistributions of source code must retain the above copyright |
| @@ -69,43 +69,29 @@ | | | @@ -69,43 +69,29 @@ |
69 | * | | 69 | * |
70 | * from: Header: disk.h,v 1.5 92/11/19 04:33:03 torek Exp (LBL) | | 70 | * from: Header: disk.h,v 1.5 92/11/19 04:33:03 torek Exp (LBL) |
71 | * | | 71 | * |
72 | * @(#)disk.h 8.2 (Berkeley) 1/9/95 | | 72 | * @(#)disk.h 8.2 (Berkeley) 1/9/95 |
73 | */ | | 73 | */ |
74 | | | 74 | |
75 | #ifndef _SYS_DISK_H_ | | 75 | #ifndef _SYS_DISK_H_ |
76 | #define _SYS_DISK_H_ | | 76 | #define _SYS_DISK_H_ |
77 | | | 77 | |
78 | /* | | 78 | /* |
79 | * Disk device structures. | | 79 | * Disk device structures. |
80 | */ | | 80 | */ |
81 | | | 81 | |
82 | #ifdef _KERNEL | | | |
83 | #include <sys/device.h> | | | |
84 | #endif | | | |
85 | #include <sys/dkio.h> | | 82 | #include <sys/dkio.h> |
86 | #include <sys/time.h> | | 83 | #include <sys/time.h> |
87 | #include <sys/queue.h> | | 84 | #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 | | | 85 | |
100 | /* | | 86 | /* |
101 | * Disk information dictionary. | | 87 | * Disk information dictionary. |
102 | * | | 88 | * |
103 | * This contains general infomation for disk devices. | | 89 | * This contains general infomation for disk devices. |
104 | * | | 90 | * |
105 | * <dict> | | 91 | * <dict> |
106 | * <key>type</key> | | 92 | * <key>type</key> |
107 | * <string>...</string> | | 93 | * <string>...</string> |
108 | * <key>geometry</key> | | 94 | * <key>geometry</key> |
109 | * <dict> | | 95 | * <dict> |
110 | * <!-- See below for disk geometry dictionary | | 96 | * <!-- See below for disk geometry dictionary |
111 | * contents. --> | | 97 | * contents. --> |
| @@ -178,51 +164,26 @@ struct dkwedge_info { | | | @@ -178,51 +164,26 @@ struct dkwedge_info { |
178 | | | 164 | |
179 | /* | | 165 | /* |
180 | * dkwedge_list: | | 166 | * dkwedge_list: |
181 | * | | 167 | * |
182 | * Structure used to query a list of wedges. | | 168 | * Structure used to query a list of wedges. |
183 | */ | | 169 | */ |
184 | struct dkwedge_list { | | 170 | struct dkwedge_list { |
185 | void *dkwl_buf; /* storage for dkwedge_info array */ | | 171 | void *dkwl_buf; /* storage for dkwedge_info array */ |
186 | size_t dkwl_bufsize; /* size of that buffer */ | | 172 | size_t dkwl_bufsize; /* size of that buffer */ |
187 | u_int dkwl_nwedges; /* total number of wedges */ | | 173 | u_int dkwl_nwedges; /* total number of wedges */ |
188 | u_int dkwl_ncopied; /* number actually copied */ | | 174 | u_int dkwl_ncopied; /* number actually copied */ |
189 | }; | | 175 | }; |
190 | | | 176 | |
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 */ | | 177 | /* Some common partition types */ |
217 | #define DKW_PTYPE_UNKNOWN "" | | 178 | #define DKW_PTYPE_UNKNOWN "" |
218 | #define DKW_PTYPE_UNUSED "unused" | | 179 | #define DKW_PTYPE_UNUSED "unused" |
219 | #define DKW_PTYPE_SWAP "swap" | | 180 | #define DKW_PTYPE_SWAP "swap" |
220 | #define DKW_PTYPE_V6 "v6" | | 181 | #define DKW_PTYPE_V6 "v6" |
221 | #define DKW_PTYPE_V7 "v7" | | 182 | #define DKW_PTYPE_V7 "v7" |
222 | #define DKW_PTYPE_SYSV "sysv" | | 183 | #define DKW_PTYPE_SYSV "sysv" |
223 | #define DKW_PTYPE_V71K "v71k" | | 184 | #define DKW_PTYPE_V71K "v71k" |
224 | #define DKW_PTYPE_V8 "v8" | | 185 | #define DKW_PTYPE_V8 "v8" |
225 | #define DKW_PTYPE_FFS "ffs" | | 186 | #define DKW_PTYPE_FFS "ffs" |
226 | #define DKW_PTYPE_FAT "msdos" | | 187 | #define DKW_PTYPE_FAT "msdos" |
227 | #define DKW_PTYPE_LFS "lfs" | | 188 | #define DKW_PTYPE_LFS "lfs" |
228 | #define DKW_PTYPE_OTHER "other" | | 189 | #define DKW_PTYPE_OTHER "other" |
| @@ -301,26 +262,88 @@ struct disk_geom { | | | @@ -301,26 +262,88 @@ struct disk_geom { |
301 | * be physical sectors which occupy space at the end of each | | 262 | * be physical sectors which occupy space at the end of each |
302 | * track and/or cylinder. | | 263 | * track and/or cylinder. |
303 | */ | | 264 | */ |
304 | uint32_t dg_sparespertrack; | | 265 | uint32_t dg_sparespertrack; |
305 | uint32_t dg_sparespercyl; | | 266 | uint32_t dg_sparespercyl; |
306 | /* | | 267 | /* |
307 | * Alternative cylinders include maintenance, replacement, | | 268 | * Alternative cylinders include maintenance, replacement, |
308 | * configuration description areas, etc. | | 269 | * configuration description areas, etc. |
309 | */ | | 270 | */ |
310 | uint32_t dg_acylinders; | | 271 | uint32_t dg_acylinders; |
311 | }; | | 272 | }; |
312 | | | 273 | |
313 | /* | | 274 | /* |
| | | 275 | * Bad sector lists per fixed disk |
| | | 276 | */ |
| | | 277 | struct disk_badsectors { |
| | | 278 | SLIST_ENTRY(disk_badsectors) dbs_next; |
| | | 279 | daddr_t dbs_min; /* min. sector number */ |
| | | 280 | daddr_t dbs_max; /* max. sector number */ |
| | | 281 | struct timeval dbs_failedat; /* first failure at */ |
| | | 282 | }; |
| | | 283 | |
| | | 284 | struct disk_badsecinfo { |
| | | 285 | uint32_t dbsi_bufsize; /* size of region pointed to */ |
| | | 286 | uint32_t dbsi_skip; /* how many to skip past */ |
| | | 287 | uint32_t dbsi_copied; /* how many got copied back */ |
| | | 288 | uint32_t dbsi_left; /* remaining to copy */ |
| | | 289 | void * dbsi_buffer; /* region to copy disk_badsectors to */ |
| | | 290 | }; |
| | | 291 | |
| | | 292 | #define DK_STRATEGYNAMELEN 32 |
| | | 293 | struct disk_strategy { |
| | | 294 | char dks_name[DK_STRATEGYNAMELEN]; /* name of strategy */ |
| | | 295 | char *dks_param; /* notyet; should be NULL */ |
| | | 296 | size_t dks_paramlen; /* notyet; should be 0 */ |
| | | 297 | }; |
| | | 298 | |
| | | 299 | #ifdef _KERNEL |
| | | 300 | #include <sys/device.h> |
| | | 301 | #include <sys/mutex.h> |
| | | 302 | #include <sys/iostat.h> |
| | | 303 | |
| | | 304 | #include <prop/proplib.h> |
| | | 305 | |
| | | 306 | struct buf; |
| | | 307 | struct disk; |
| | | 308 | struct disklabel; |
| | | 309 | struct cpu_disklabel; |
| | | 310 | struct lwp; |
| | | 311 | struct vnode; |
| | | 312 | |
| | | 313 | /* |
| | | 314 | * dkwedge_discovery_method: |
| | | 315 | * |
| | | 316 | * Structure used to describe partition map parsing schemes |
| | | 317 | * used for wedge autodiscovery. |
| | | 318 | */ |
| | | 319 | struct dkwedge_discovery_method { |
| | | 320 | /* link in wedge driver's list */ |
| | | 321 | LIST_ENTRY(dkwedge_discovery_method) ddm_list; |
| | | 322 | const char *ddm_name; /* name of this method */ |
| | | 323 | int ddm_priority; /* search priority */ |
| | | 324 | int (*ddm_discover)(struct disk *, struct vnode *); |
| | | 325 | }; |
| | | 326 | |
| | | 327 | #define DKWEDGE_DISCOVERY_METHOD_DECL(name, prio, discover) \ |
| | | 328 | static struct dkwedge_discovery_method name ## _ddm = { \ |
| | | 329 | { NULL, NULL }, \ |
| | | 330 | #name, \ |
| | | 331 | prio, \ |
| | | 332 | discover \ |
| | | 333 | }; \ |
| | | 334 | __link_set_add_data(dkwedge_methods, name ## _ddm) |
| | | 335 | |
| | | 336 | /* |
314 | * Disk partition dictionary. | | 337 | * Disk partition dictionary. |
315 | * | | 338 | * |
316 | * A partition is represented as a dictionary containing generic partition | | 339 | * A partition is represented as a dictionary containing generic partition |
317 | * properties (such as starting block and block count), as well as information | | 340 | * properties (such as starting block and block count), as well as information |
318 | * that is specific to individual partition map formats. | | 341 | * that is specific to individual partition map formats. |
319 | * | | 342 | * |
320 | * <dict> | | 343 | * <dict> |
321 | * <key>start-block</key> | | 344 | * <key>start-block</key> |
322 | * <integer>...</integer> | | 345 | * <integer>...</integer> |
323 | * <key>block-count</key> | | 346 | * <key>block-count</key> |
324 | * <integer>...</integer> | | 347 | * <integer>...</integer> |
325 | * <!-- DKW_PTYPE strings ("" or missing if unknown) --> | | 348 | * <!-- DKW_PTYPE strings ("" or missing if unknown) --> |
326 | * <key>type</type> | | 349 | * <key>type</type> |
| @@ -460,81 +483,53 @@ struct disk { | | | @@ -460,81 +483,53 @@ struct disk { |
460 | /* all wedges on this disk */ | | 483 | /* all wedges on this disk */ |
461 | LIST_HEAD(, dkwedge_softc) dk_wedges; | | 484 | LIST_HEAD(, dkwedge_softc) dk_wedges; |
462 | | | 485 | |
463 | /* | | 486 | /* |
464 | * Disk label information. Storage for the in-core disk label | | 487 | * Disk label information. Storage for the in-core disk label |
465 | * must be dynamically allocated, otherwise the size of this | | 488 | * must be dynamically allocated, otherwise the size of this |
466 | * structure becomes machine-dependent. | | 489 | * structure becomes machine-dependent. |
467 | */ | | 490 | */ |
468 | daddr_t dk_labelsector; /* sector containing label */ | | 491 | daddr_t dk_labelsector; /* sector containing label */ |
469 | struct disklabel *dk_label; /* label */ | | 492 | struct disklabel *dk_label; /* label */ |
470 | struct cpu_disklabel *dk_cpulabel; | | 493 | struct cpu_disklabel *dk_cpulabel; |
471 | }; | | 494 | }; |
472 | | | 495 | |
473 | #ifdef _KERNEL | | | |
474 | struct dkdriver { | | 496 | struct dkdriver { |
475 | void (*d_strategy)(struct buf *); | | 497 | void (*d_strategy)(struct buf *); |
476 | void (*d_minphys)(struct buf *); | | 498 | void (*d_minphys)(struct buf *); |
477 | int (*d_open)(dev_t, int, int, struct lwp *); | | 499 | int (*d_open)(dev_t, int, int, struct lwp *); |
478 | int (*d_close)(dev_t, int, int, struct lwp *); | | 500 | int (*d_close)(dev_t, int, int, struct lwp *); |
479 | int (*d_diskstart)(device_t, struct buf *); | | 501 | int (*d_diskstart)(device_t, struct buf *); |
480 | void (*d_iosize)(device_t, int *); | | 502 | void (*d_iosize)(device_t, int *); |
481 | int (*d_dumpblocks)(device_t, void *, daddr_t, int); | | 503 | int (*d_dumpblocks)(device_t, void *, daddr_t, int); |
482 | int (*d_lastclose)(device_t); | | 504 | int (*d_lastclose)(device_t); |
483 | int (*d_discard)(device_t, off_t, off_t); | | 505 | int (*d_discard)(device_t, off_t, off_t); |
484 | int (*d_firstopen)(device_t, dev_t, int, int); | | 506 | int (*d_firstopen)(device_t, dev_t, int, int); |
485 | void (*d_label)(device_t, struct disklabel *lp); | | 507 | void (*d_label)(device_t, struct disklabel *lp); |
486 | }; | | 508 | }; |
487 | #endif | | | |
488 | | | 509 | |
489 | /* states */ | | 510 | /* states */ |
490 | #define DK_CLOSED 0 /* drive is closed */ | | 511 | #define DK_CLOSED 0 /* drive is closed */ |
491 | #define DK_WANTOPEN 1 /* drive being opened */ | | 512 | #define DK_WANTOPEN 1 /* drive being opened */ |
492 | #define DK_WANTOPENRAW 2 /* drive being opened */ | | 513 | #define DK_WANTOPENRAW 2 /* drive being opened */ |
493 | #define DK_RDLABEL 3 /* label being read */ | | 514 | #define DK_RDLABEL 3 /* label being read */ |
494 | #define DK_OPEN 4 /* label read, drive open */ | | 515 | #define DK_OPEN 4 /* label read, drive open */ |
495 | #define DK_OPENRAW 5 /* open without label */ | | 516 | #define DK_OPENRAW 5 /* open without label */ |
496 | | | 517 | |
497 | /* | | | |
498 | * Bad sector lists per fixed disk | | | |
499 | */ | | | |
500 | struct disk_badsectors { | | | |
501 | SLIST_ENTRY(disk_badsectors) dbs_next; | | | |
502 | daddr_t dbs_min; /* min. sector number */ | | | |
503 | daddr_t dbs_max; /* max. sector number */ | | | |
504 | struct timeval dbs_failedat; /* first failure at */ | | | |
505 | }; | | | |
506 | | | | |
507 | struct disk_badsecinfo { | | | |
508 | uint32_t dbsi_bufsize; /* size of region pointed to */ | | | |
509 | uint32_t dbsi_skip; /* how many to skip past */ | | | |
510 | uint32_t dbsi_copied; /* how many got copied back */ | | | |
511 | uint32_t dbsi_left; /* remaining to copy */ | | | |
512 | void * dbsi_buffer; /* region to copy disk_badsectors to */ | | | |
513 | }; | | | |
514 | | | | |
515 | #define DK_STRATEGYNAMELEN 32 | | | |
516 | struct disk_strategy { | | | |
517 | char dks_name[DK_STRATEGYNAMELEN]; /* name of strategy */ | | | |
518 | char *dks_param; /* notyet; should be NULL */ | | | |
519 | size_t dks_paramlen; /* notyet; should be 0 */ | | | |
520 | }; | | | |
521 | | | | |
522 | #define DK_BSIZE2BLKSHIFT(b) ((ffs((b) / DEV_BSIZE)) - 1) | | 518 | #define DK_BSIZE2BLKSHIFT(b) ((ffs((b) / DEV_BSIZE)) - 1) |
523 | #define DK_BSIZE2BYTESHIFT(b) (ffs((b)) - 1) | | 519 | #define DK_BSIZE2BYTESHIFT(b) (ffs((b)) - 1) |
524 | #define DK_DEV_BSIZE_OK(b) \ | | 520 | #define DK_DEV_BSIZE_OK(b) \ |
525 | ((b) >= DEV_BSIZE && ((b) & ((b) - 1)) == 0 && (b) <= MAXPHYS) | | 521 | ((b) >= DEV_BSIZE && ((b) & ((b) - 1)) == 0 && (b) <= MAXPHYS) |
526 | | | 522 | |
527 | #ifdef _KERNEL | | | |
528 | extern int disk_count; /* number of disks in global disklist */ | | 523 | extern int disk_count; /* number of disks in global disklist */ |
529 | | | 524 | |
530 | struct proc; | | 525 | struct proc; |
531 | | | 526 | |
532 | void disk_attach(struct disk *); | | 527 | void disk_attach(struct disk *); |
533 | int disk_begindetach(struct disk *, int (*)(device_t), device_t, int); | | 528 | int disk_begindetach(struct disk *, int (*)(device_t), device_t, int); |
534 | void disk_detach(struct disk *); | | 529 | void disk_detach(struct disk *); |
535 | void disk_init(struct disk *, const char *, const struct dkdriver *); | | 530 | void disk_init(struct disk *, const char *, const struct dkdriver *); |
536 | void disk_destroy(struct disk *); | | 531 | void disk_destroy(struct disk *); |
537 | void disk_wait(struct disk *); | | 532 | void disk_wait(struct disk *); |
538 | void disk_busy(struct disk *); | | 533 | void disk_busy(struct disk *); |
539 | void disk_unbusy(struct disk *, long, int); | | 534 | void disk_unbusy(struct disk *, long, int); |
540 | bool disk_isbusy(struct disk *); | | 535 | bool disk_isbusy(struct disk *); |
| @@ -545,16 +540,16 @@ void disk_set_info(device_t, struct disk | | | @@ -545,16 +540,16 @@ void disk_set_info(device_t, struct disk |
545 | void dkwedge_init(void); | | 540 | void dkwedge_init(void); |
546 | int dkwedge_add(struct dkwedge_info *); | | 541 | int dkwedge_add(struct dkwedge_info *); |
547 | int dkwedge_del(struct dkwedge_info *); | | 542 | int dkwedge_del(struct dkwedge_info *); |
548 | void dkwedge_delall(struct disk *); | | 543 | void dkwedge_delall(struct disk *); |
549 | int dkwedge_list(struct disk *, struct dkwedge_list *, struct lwp *); | | 544 | int dkwedge_list(struct disk *, struct dkwedge_list *, struct lwp *); |
550 | void dkwedge_discover(struct disk *); | | 545 | void dkwedge_discover(struct disk *); |
551 | int dkwedge_read(struct disk *, struct vnode *, daddr_t, void *, size_t); | | 546 | int dkwedge_read(struct disk *, struct vnode *, daddr_t, void *, size_t); |
552 | device_t dkwedge_find_by_wname(const char *); | | 547 | device_t dkwedge_find_by_wname(const char *); |
553 | device_t dkwedge_find_by_parent(const char *, size_t *); | | 548 | device_t dkwedge_find_by_parent(const char *, size_t *); |
554 | const char *dkwedge_get_parent_name(dev_t); | | 549 | const char *dkwedge_get_parent_name(dev_t); |
555 | void dkwedge_print_wnames(void); | | 550 | void dkwedge_print_wnames(void); |
556 | device_t dkwedge_find_partition(device_t, daddr_t, uint64_t); | | 551 | device_t dkwedge_find_partition(device_t, daddr_t, uint64_t); |
557 | | | 552 | |
558 | #endif | | 553 | #endif /* _KERNEL */ |
559 | | | 554 | |
560 | #endif /* _SYS_DISK_H_ */ | | 555 | #endif /* _SYS_DISK_H_ */ |