1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
/*-
* Copyright (c) 1994 Bruce D. Evans.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: diskslice.h,v 1.20 1997/02/22 09:45:06 peter Exp $
*/
#ifndef _SYS_DISKSLICE_H_
#define _SYS_DISKSLICE_H_
#ifndef KERNEL
#include <sys/types.h>
#endif
#include <sys/ioccom.h>
#define BASE_SLICE 2
#define COMPATIBILITY_SLICE 0
#define DIOCGSLICEINFO _IOR('d', 111, struct diskslices)
#define DIOCSYNCSLICEINFO _IOW('d', 112, int)
#define MAX_SLICES 32
#define WHOLE_DISK_SLICE 1
/* upcoming change from julian.. early warning of probable form */
#if 1
struct diskslice {
u_long ds_offset; /* starting sector */
u_long ds_size; /* number of sectors */
int ds_type; /* (foreign) slice type */
#ifdef PC98
int ds_subtype; /* sub slice type */
u_char ds_name[16]; /* slice name */
#endif
struct dkbad_intern *ds_bad; /* bad sector table, if any */
struct disklabel *ds_label; /* BSD label, if any */
void *ds_bdev; /* devfs token for whole slice */
void *ds_cdev; /* devfs token for raw whole slice */
#ifdef MAXPARTITIONS /* XXX don't depend on disklabel.h */
#if MAXPARTITIONS != 8 /* but check consistency if possible */
#error "inconsistent MAXPARTITIONS"
#endif
#else
#define MAXPARTITIONS 8
#endif
void *ds_bdevs[MAXPARTITIONS]; /* XXX s.b. in label */
void *ds_cdevs[MAXPARTITIONS]; /* XXX s.b. in label */
u_char ds_bopenmask; /* bdevs open */
u_char ds_copenmask; /* cdevs open */
u_char ds_openmask; /* [bc]devs open */
u_char ds_wlabel; /* nonzero if label is writable */
};
#else
/* switch table for slice handlers (sample only) */
struct slice_switch {
int (*slice_load)();
int (*slice_check)();
int (*slice_gone)();
/*
* etc.
* each routine is called with the address of the private data
* and the minor number..
* Other arguments as needed
*/
};
struct diskslice {
u_long ds_offset; /* starting sector */
u_long ds_size; /* number of sectors */
int ds_type; /* (foreign) slice type */
#ifdef PC98
int ds_subtype; /* sub slice type */
u_char ds_name[16]; /* slice name */
#endif
struct dkbad_intern *ds_bad; /* bad sector table, if any */
void *ds_date; /* Slice type specific data */
struct slice_switch *switch; /* switch table for type handler */
u_char ds_bopenmask; /* bdevs open */
u_char ds_copenmask; /* cdevs open */
u_char ds_openmask; /* [bc]devs open */
u_char ds_wlabel; /* nonzero if label is writable */
};
#endif
struct diskslices {
struct bdevsw *dss_bdevsw; /* for containing device */
struct cdevsw *dss_cdevsw; /* for containing device */
int dss_first_bsd_slice; /* COMPATIBILITY_SLICE is mapped here */
u_int dss_nslices; /* actual dimension of dss_slices[] */
struct diskslice
dss_slices[MAX_SLICES]; /* actually usually less */
};
#ifdef KERNEL
#define dsgetbad(dev, ssp) (ssp->dss_slices[dkslice(dev)].ds_bad)
#define dsgetlabel(dev, ssp) (ssp->dss_slices[dkslice(dev)].ds_label)
struct buf;
struct disklabel;
typedef int ds_setgeom_t __P((struct disklabel *lp));
int dscheck __P((struct buf *bp, struct diskslices *ssp));
void dsclose __P((dev_t dev, int mode, struct diskslices *ssp));
void dsgone __P((struct diskslices **sspp));
int dsinit __P((char *dname, dev_t dev, void (*strat)(struct buf *bp),
struct disklabel *lp, struct diskslices **sspp));
int dsioctl __P((char *dname, dev_t dev, int cmd, caddr_t data, int flags,
struct diskslices **sspp, void (*strat)(struct buf *bp),
ds_setgeom_t *setgeom));
int dsisopen __P((struct diskslices *ssp));
char *dsname __P((char *dname, int unit, int slice, int part,
char *partname));
int dsopen __P((char *dname, dev_t dev, int mode, struct diskslices **sspp,
struct disklabel *lp, void (*strat)(struct buf *bp),
ds_setgeom_t *setgeom, struct bdevsw *bdevsw,
struct cdevsw *cdevsw));
int dssize __P((dev_t dev, struct diskslices **sspp,
int (*dopen)(dev_t dev, int oflags, int devtype,
struct proc *p),
int (*dclose)(dev_t dev, int fflag, int devtype,
struct proc *p)));
#endif /* KERNEL */
#endif /* !_SYS_DISKSLICE_H_ */
|