genhd.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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