1#ifndef _LINUX_GENHD_H
2#define _LINUX_GENHD_H
3
4
5
6
7
8
9
10
11
12#include <linux/config.h>
13#include <linux/types.h>
14#include <linux/major.h>
15
16enum {
17
18
19 DOS_EXTENDED_PARTITION = 5,
20 LINUX_EXTENDED_PARTITION = 0x85,
21 WIN98_EXTENDED_PARTITION = 0x0f,
22
23 LINUX_SWAP_PARTITION = 0x82,
24 LINUX_RAID_PARTITION = 0xfd,
25
26 SOLARIS_X86_PARTITION = LINUX_SWAP_PARTITION,
27
28 DM6_PARTITION = 0x54,
29 EZD_PARTITION = 0x55,
30 DM6_AUX1PARTITION = 0x51,
31 DM6_AUX3PARTITION = 0x53,
32
33 FREEBSD_PARTITION = 0xa5,
34 OPENBSD_PARTITION = 0xa6,
35 NETBSD_PARTITION = 0xa9,
36 BSDI_PARTITION = 0xb7,
37
38 BSD_PARTITION = FREEBSD_PARTITION,
39 MINIX_PARTITION = 0x81,
40 PLAN9_PARTITION = 0x39,
41 UNIXWARE_PARTITION = 0x63,
42
43};
44
45struct partition {
46 unsigned char boot_ind;
47 unsigned char head;
48 unsigned char sector;
49 unsigned char cyl;
50 unsigned char sys_ind;
51 unsigned char end_head;
52 unsigned char end_sector;
53 unsigned char end_cyl;
54 unsigned int start_sect;
55 unsigned int nr_sects;
56} __attribute__((packed));
57
58#ifdef __KERNEL__
59# include <linux/devfs_fs_kernel.h>
60
61struct hd_struct {
62 unsigned long start_sect;
63 unsigned long nr_sects;
64 devfs_handle_t de;
65#ifdef CONFIG_DEVFS_FS
66 int number;
67#endif
68#ifdef CONFIG_BLK_STATS
69
70 unsigned int ios_in_flight;
71 unsigned int io_ticks;
72 unsigned int last_idle_time;
73 unsigned int last_queue_change;
74 unsigned int aveq;
75
76 unsigned int rd_ios;
77 unsigned int rd_merges;
78 unsigned int rd_ticks;
79 unsigned int rd_sectors;
80 unsigned int wr_ios;
81 unsigned int wr_merges;
82 unsigned int wr_ticks;
83 unsigned int wr_sectors;
84#endif
85};
86
87#define GENHD_FL_REMOVABLE 1
88
89struct gendisk {
90 int major;
91 const char *major_name;
92 int minor_shift;
93
94 int max_p;
95
96 struct hd_struct *part;
97 int *sizes;
98 int nr_real;
99
100 void *real_devices;
101 struct gendisk *next;
102 struct block_device_operations *fops;
103
104 devfs_handle_t *de_arr;
105 char *flags;
106};
107
108
109extern struct gendisk *gendisk_head;
110
111extern void add_gendisk(struct gendisk *gp);
112extern void del_gendisk(struct gendisk *gp);
113extern struct gendisk *get_gendisk(kdev_t dev);
114extern int walk_gendisk(int (*walk)(struct gendisk *, void *), void *);
115
116#endif
117
118#ifdef CONFIG_SOLARIS_X86_PARTITION
119
120#define SOLARIS_X86_NUMSLICE 8
121#define SOLARIS_X86_VTOC_SANE (0x600DDEEEUL)
122
123struct solaris_x86_slice {
124 ushort s_tag;
125 ushort s_flag;
126 unsigned int s_start;
127 unsigned int s_size;
128};
129
130struct solaris_x86_vtoc {
131 unsigned int v_bootinfo[3];
132 unsigned int v_sanity;
133 unsigned int v_version;
134 char v_volume[8];
135 ushort v_sectorsz;
136 ushort v_nparts;
137 unsigned int v_reserved[10];
138 struct solaris_x86_slice
139 v_slice[SOLARIS_X86_NUMSLICE];
140 unsigned int timestamp[SOLARIS_X86_NUMSLICE];
141 char v_asciilabel[128];
142};
143
144#endif
145
146#ifdef CONFIG_BSD_DISKLABEL
147
148
149
150
151
152
153
154#define BSD_DISKMAGIC (0x82564557UL)
155#define BSD_MAXPARTITIONS 8
156#define OPENBSD_MAXPARTITIONS 16
157#define BSD_FS_UNUSED 0
158struct bsd_disklabel {
159 __u32 d_magic;
160 __s16 d_type;
161 __s16 d_subtype;
162 char d_typename[16];
163 char d_packname[16];
164 __u32 d_secsize;
165 __u32 d_nsectors;
166 __u32 d_ntracks;
167 __u32 d_ncylinders;
168 __u32 d_secpercyl;
169 __u32 d_secperunit;
170 __u16 d_sparespertrack;
171 __u16 d_sparespercyl;
172 __u32 d_acylinders;
173 __u16 d_rpm;
174 __u16 d_interleave;
175 __u16 d_trackskew;
176 __u16 d_cylskew;
177 __u32 d_headswitch;
178 __u32 d_trkseek;
179 __u32 d_flags;
180#define NDDATA 5
181 __u32 d_drivedata[NDDATA];
182#define NSPARE 5
183 __u32 d_spare[NSPARE];
184 __u32 d_magic2;
185 __u16 d_checksum;
186
187
188 __u16 d_npartitions;
189 __u32 d_bbsize;
190 __u32 d_sbsize;
191 struct bsd_partition {
192 __u32 p_size;
193 __u32 p_offset;
194 __u32 p_fsize;
195 __u8 p_fstype;
196 __u8 p_frag;
197 __u16 p_cpg;
198 } d_partitions[BSD_MAXPARTITIONS];
199};
200
201#endif
202
203#ifdef CONFIG_UNIXWARE_DISKLABEL
204
205
206
207
208
209#define UNIXWARE_DISKMAGIC (0xCA5E600DUL)
210#define UNIXWARE_DISKMAGIC2 (0x600DDEEEUL)
211#define UNIXWARE_NUMSLICE 16
212#define UNIXWARE_FS_UNUSED 0
213
214struct unixware_slice {
215 __u16 s_label;
216 __u16 s_flags;
217 __u32 start_sect;
218 __u32 nr_sects;
219};
220
221struct unixware_disklabel {
222 __u32 d_type;
223 __u32 d_magic;
224 __u32 d_version;
225 char d_serial[12];
226 __u32 d_ncylinders;
227 __u32 d_ntracks;
228 __u32 d_nsectors;
229 __u32 d_secsize;
230 __u32 d_part_start;
231 __u32 d_unknown1[12];
232 __u32 d_alt_tbl;
233 __u32 d_alt_len;
234 __u32 d_phys_cyl;
235 __u32 d_phys_trk;
236 __u32 d_phys_sec;
237 __u32 d_phys_bytes;
238 __u32 d_unknown2;
239 __u32 d_unknown3;
240 __u32 d_pad[8];
241
242 struct unixware_vtoc {
243 __u32 v_magic;
244 __u32 v_version;
245 char v_name[8];
246 __u16 v_nslices;
247 __u16 v_unknown1;
248 __u32 v_reserved[10];
249 struct unixware_slice
250 v_slice[UNIXWARE_NUMSLICE];
251 } vtoc;
252
253};
254
255#endif
256
257#ifdef CONFIG_MINIX_SUBPARTITION
258# define MINIX_NR_SUBPARTITIONS 4
259#endif
260
261#ifdef __KERNEL__
262
263char *disk_name (struct gendisk *hd, int minor, char *buf);
264
265
266
267
268
269struct request;
270
271#ifdef CONFIG_BLK_STATS
272extern void disk_round_stats(struct hd_struct *hd);
273extern void req_new_io(struct request *req, int merge, int sectors);
274extern void req_merged_io(struct request *req);
275extern void req_finished_io(struct request *req);
276#else
277static inline void req_new_io(struct request *req, int merge, int sectors) { }
278static inline void req_merged_io(struct request *req) { }
279static inline void req_finished_io(struct request *req) { }
280#endif
281
282extern void devfs_register_partitions (struct gendisk *dev, int minor,
283 int unregister);
284
285
286
287
288
289
290static inline unsigned int disk_index (kdev_t dev)
291{
292 int major = MAJOR(dev);
293 int minor = MINOR(dev);
294 unsigned int index;
295
296 switch (major) {
297 case DAC960_MAJOR+0:
298 index = (minor & 0x00f8) >> 3;
299 break;
300 case SCSI_DISK0_MAJOR:
301 index = (minor & 0x00f0) >> 4;
302 break;
303 case IDE0_MAJOR:
304 case XT_DISK_MAJOR:
305 index = (minor & 0x0040) >> 6;
306 break;
307 case IDE1_MAJOR:
308 index = ((minor & 0x0040) >> 6) + 2;
309 break;
310 default:
311 return 0;
312 }
313 return index;
314}
315
316#endif
317
318#endif
319