summaryrefslogtreecommitdiffstats
path: root/sys/sys/diskslice.h
blob: 8f422505cfcec0d060f8d393bc59aee144165635 (plain)
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
/*-
 * 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.
 *
 *	$FreeBSD$
 */

#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 */
	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 */
	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_ */
OpenPOWER on IntegriCloud