Project

General

Profile

Statistics
| Revision:

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_ */