v2.4.9.9 -> v2.4.9.10
[opensuse:kernel.git] / include / linux / genhd.h
1 #ifndef _LINUX_GENHD_H
2 #define _LINUX_GENHD_H
3
4 /*
5  *      genhd.h Copyright (C) 1992 Drew Eckhardt
6  *      Generic hard disk header file by  
7  *              Drew Eckhardt
8  *
9  *              <drew@colorado.edu>
10  */
11
12 #include <linux/config.h>
13 #include <linux/types.h>
14 #include <linux/major.h>
15
16 /* These three have identical behaviour; use the second one if DOS fdisk gets
17    confused about extended/logical partitions starting past cylinder 1023. */
18 #define DOS_EXTENDED_PARTITION 5
19 #define LINUX_EXTENDED_PARTITION 0x85
20 #define WIN98_EXTENDED_PARTITION 0x0f
21
22 #define LINUX_SWAP_PARTITION    0x82
23 #define LINUX_RAID_PARTITION    0xfd    /* autodetect RAID partition */
24
25 #ifdef CONFIG_SOLARIS_X86_PARTITION
26 #define SOLARIS_X86_PARTITION   LINUX_SWAP_PARTITION
27 #endif
28
29 #define DM6_PARTITION           0x54    /* has DDO: use xlated geom & offset */
30 #define EZD_PARTITION           0x55    /* EZ-DRIVE */
31 #define DM6_AUX1PARTITION       0x51    /* no DDO:  use xlated geom */
32 #define DM6_AUX3PARTITION       0x53    /* no DDO:  use xlated geom */
33
34 struct partition {
35         unsigned char boot_ind;         /* 0x80 - active */
36         unsigned char head;             /* starting head */
37         unsigned char sector;           /* starting sector */
38         unsigned char cyl;              /* starting cylinder */
39         unsigned char sys_ind;          /* What partition type */
40         unsigned char end_head;         /* end head */
41         unsigned char end_sector;       /* end sector */
42         unsigned char end_cyl;          /* end cylinder */
43         unsigned int start_sect;        /* starting sector counting from 0 */
44         unsigned int nr_sects;          /* nr of sectors in partition */
45 } __attribute__((packed));
46
47 #ifdef __KERNEL__
48 #  include <linux/devfs_fs_kernel.h>
49
50 struct hd_struct {
51         long start_sect;
52         long nr_sects;
53         devfs_handle_t de;              /* primary (master) devfs entry  */
54         int number;                     /* stupid old code wastes space  */
55 };
56
57 #define GENHD_FL_REMOVABLE  1
58
59 struct gendisk {
60         int major;                      /* major number of driver */
61         const char *major_name;         /* name of major driver */
62         int minor_shift;                /* number of times minor is shifted to
63                                            get real minor */
64         int max_p;                      /* maximum partitions per device */
65
66         struct hd_struct *part;         /* [indexed by minor] */
67         int *sizes;                     /* [idem], device size in blocks */
68         int nr_real;                    /* number of real devices */
69
70         void *real_devices;             /* internal use */
71         struct gendisk *next;
72         struct block_device_operations *fops;
73
74         devfs_handle_t *de_arr;         /* one per physical disc */
75         char *flags;                    /* one per physical disc */
76 };
77
78 /* drivers/block/genhd.c */
79 extern struct gendisk *gendisk_head;
80
81 extern void add_gendisk(struct gendisk *gp);
82 extern void del_gendisk(struct gendisk *gp);
83 extern struct gendisk *get_gendisk(kdev_t dev);
84
85 #endif  /*  __KERNEL__  */
86
87 #ifdef CONFIG_SOLARIS_X86_PARTITION
88
89 #define SOLARIS_X86_NUMSLICE    8
90 #define SOLARIS_X86_VTOC_SANE   (0x600DDEEEUL)
91
92 struct solaris_x86_slice {
93         ushort  s_tag;                  /* ID tag of partition */
94         ushort  s_flag;                 /* permission flags */
95         unsigned int s_start;           /* start sector no of partition */
96         unsigned int s_size;            /* # of blocks in partition */
97 };
98
99 struct solaris_x86_vtoc {
100         unsigned int v_bootinfo[3];     /* info needed by mboot (unsupported) */
101         unsigned int v_sanity;          /* to verify vtoc sanity */
102         unsigned int v_version;         /* layout version */
103         char    v_volume[8];            /* volume name */
104         ushort  v_sectorsz;             /* sector size in bytes */
105         ushort  v_nparts;               /* number of partitions */
106         unsigned int v_reserved[10];    /* free space */
107         struct solaris_x86_slice
108                 v_slice[SOLARIS_X86_NUMSLICE]; /* slice headers */
109         unsigned int timestamp[SOLARIS_X86_NUMSLICE]; /* timestamp (unsupported) */
110         char    v_asciilabel[128];      /* for compatibility */
111 };
112
113 #endif /* CONFIG_SOLARIS_X86_PARTITION */
114
115 #ifdef CONFIG_BSD_DISKLABEL
116 /*
117  * BSD disklabel support by Yossi Gottlieb <yogo@math.tau.ac.il>
118  * updated by Marc Espie <Marc.Espie@openbsd.org>
119  */
120 #define FREEBSD_PARTITION       0xa5    /* FreeBSD Partition ID */
121 #define OPENBSD_PARTITION       0xa6    /* OpenBSD Partition ID */
122 #define NETBSD_PARTITION        0xa9    /* NetBSD Partition ID */
123 #define BSDI_PARTITION          0xb7    /* BSDI Partition ID */
124
125 /* Ours is not to wonder why.. */
126 #define BSD_PARTITION           FREEBSD_PARTITION
127
128 /* check against BSD src/sys/sys/disklabel.h for consistency */
129
130 #define BSD_DISKMAGIC   (0x82564557UL)  /* The disk magic number */
131 #define BSD_MAXPARTITIONS       8
132 #define OPENBSD_MAXPARTITIONS   16
133 #define BSD_FS_UNUSED           0       /* disklabel unused partition entry ID */
134 struct bsd_disklabel {
135         __u32   d_magic;                /* the magic number */
136         __s16   d_type;                 /* drive type */
137         __s16   d_subtype;              /* controller/d_type specific */
138         char    d_typename[16];         /* type name, e.g. "eagle" */
139         char    d_packname[16];                 /* pack identifier */ 
140         __u32   d_secsize;              /* # of bytes per sector */
141         __u32   d_nsectors;             /* # of data sectors per track */
142         __u32   d_ntracks;              /* # of tracks per cylinder */
143         __u32   d_ncylinders;           /* # of data cylinders per unit */
144         __u32   d_secpercyl;            /* # of data sectors per cylinder */
145         __u32   d_secperunit;           /* # of data sectors per unit */
146         __u16   d_sparespertrack;       /* # of spare sectors per track */
147         __u16   d_sparespercyl;         /* # of spare sectors per cylinder */
148         __u32   d_acylinders;           /* # of alt. cylinders per unit */
149         __u16   d_rpm;                  /* rotational speed */
150         __u16   d_interleave;           /* hardware sector interleave */
151         __u16   d_trackskew;            /* sector 0 skew, per track */
152         __u16   d_cylskew;              /* sector 0 skew, per cylinder */
153         __u32   d_headswitch;           /* head switch time, usec */
154         __u32   d_trkseek;              /* track-to-track seek, usec */
155         __u32   d_flags;                /* generic flags */
156 #define NDDATA 5
157         __u32   d_drivedata[NDDATA];    /* drive-type specific information */
158 #define NSPARE 5
159         __u32   d_spare[NSPARE];        /* reserved for future use */
160         __u32   d_magic2;               /* the magic number (again) */
161         __u16   d_checksum;             /* xor of data incl. partitions */
162
163                         /* filesystem and partition information: */
164         __u16   d_npartitions;          /* number of partitions in following */
165         __u32   d_bbsize;               /* size of boot area at sn0, bytes */
166         __u32   d_sbsize;               /* max size of fs superblock, bytes */
167         struct  bsd_partition {         /* the partition table */
168                 __u32   p_size;         /* number of sectors in partition */
169                 __u32   p_offset;       /* starting sector */
170                 __u32   p_fsize;        /* filesystem basic fragment size */
171                 __u8    p_fstype;       /* filesystem type, see below */
172                 __u8    p_frag;         /* filesystem fragments per block */
173                 __u16   p_cpg;          /* filesystem cylinders per group */
174         } d_partitions[BSD_MAXPARTITIONS];      /* actually may be more */
175 };
176
177 #endif  /* CONFIG_BSD_DISKLABEL */
178
179 #ifdef CONFIG_UNIXWARE_DISKLABEL
180 /*
181  * Unixware slices support by Andrzej Krzysztofowicz <ankry@mif.pg.gda.pl>
182  * and Krzysztof G. Baranowski <kgb@knm.org.pl>
183  */
184
185 #define UNIXWARE_PARTITION     0x63             /* Partition ID, same as */
186                                                 /* GNU_HURD and SCO Unix */
187 #define UNIXWARE_DISKMAGIC     (0xCA5E600DUL)   /* The disk magic number */
188 #define UNIXWARE_DISKMAGIC2    (0x600DDEEEUL)   /* The slice table magic nr */
189 #define UNIXWARE_NUMSLICE      16
190 #define UNIXWARE_FS_UNUSED     0                /* Unused slice entry ID */
191
192 struct unixware_slice {
193         __u16   s_label;        /* label */
194         __u16   s_flags;        /* permission flags */
195         __u32   start_sect;     /* starting sector */
196         __u32   nr_sects;       /* number of sectors in slice */
197 };
198
199 struct unixware_disklabel {
200         __u32   d_type;                 /* drive type */
201         __u32   d_magic;                /* the magic number */
202         __u32   d_version;              /* version number */
203         char    d_serial[12];           /* serial number of the device */
204         __u32   d_ncylinders;           /* # of data cylinders per device */
205         __u32   d_ntracks;              /* # of tracks per cylinder */
206         __u32   d_nsectors;             /* # of data sectors per track */
207         __u32   d_secsize;              /* # of bytes per sector */
208         __u32   d_part_start;           /* # of first sector of this partition */
209         __u32   d_unknown1[12];         /* ? */
210         __u32   d_alt_tbl;              /* byte offset of alternate table */
211         __u32   d_alt_len;              /* byte length of alternate table */
212         __u32   d_phys_cyl;             /* # of physical cylinders per device */
213         __u32   d_phys_trk;             /* # of physical tracks per cylinder */
214         __u32   d_phys_sec;             /* # of physical sectors per track */
215         __u32   d_phys_bytes;           /* # of physical bytes per sector */
216         __u32   d_unknown2;             /* ? */
217         __u32   d_unknown3;             /* ? */
218         __u32   d_pad[8];               /* pad */
219
220         struct unixware_vtoc {
221                 __u32   v_magic;                /* the magic number */
222                 __u32   v_version;              /* version number */
223                 char    v_name[8];              /* volume name */
224                 __u16   v_nslices;              /* # of slices */
225                 __u16   v_unknown1;             /* ? */
226                 __u32   v_reserved[10];         /* reserved */
227                 struct unixware_slice
228                         v_slice[UNIXWARE_NUMSLICE];     /* slice headers */
229         } vtoc;
230
231 };  /* 408 */
232
233 #endif /* CONFIG_UNIXWARE_DISKLABEL */
234
235 #ifdef CONFIG_MINIX_SUBPARTITION
236 #   define MINIX_PARTITION         0x81  /* Minix Partition ID */
237 #   define MINIX_NR_SUBPARTITIONS  4
238 #endif /* CONFIG_MINIX_SUBPARTITION */
239
240 #ifdef __KERNEL__
241
242 char *disk_name (struct gendisk *hd, int minor, char *buf);
243
244 extern void devfs_register_partitions (struct gendisk *dev, int minor,
245                                        int unregister);
246
247
248
249 /*
250  * FIXME: this should use genhd->minor_shift, but that is slow to look up.
251  */
252 static inline unsigned int disk_index (kdev_t dev)
253 {
254         int major = MAJOR(dev);
255         int minor = MINOR(dev);
256         unsigned int index;
257
258         switch (major) {
259                 case DAC960_MAJOR+0:
260                         index = (minor & 0x00f8) >> 3;
261                         break;
262                 case SCSI_DISK0_MAJOR:
263                         index = (minor & 0x00f0) >> 4;
264                         break;
265                 case IDE0_MAJOR:        /* same as HD_MAJOR */
266                 case XT_DISK_MAJOR:
267                         index = (minor & 0x0040) >> 6;
268                         break;
269                 case IDE1_MAJOR:
270                         index = ((minor & 0x0040) >> 6) + 2;
271                         break;
272                 default:
273                         return 0;
274         }
275         return index;
276 }
277
278 #endif
279
280 #endif