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 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#ifndef _SYS_DVH_H
#define _SYS_DVH_H
/*
* Format for volume header information
*
* The volume header is a block located at the beginning of all disk
* media (sector 0). It contains information pertaining to physical
* device parameters and logical partition information.
*
* The volume header is manipulated by disk formatters/verifiers,
* partition builders (e.g. fx, dvhtool, and mkfs), and disk drivers.
*
* Previous versions of IRIX wrote a copy of the volume header is
* located at sector 0 of each track of cylinder 0. These copies were
* never used, and reduced the capacity of the volume header to hold large
* files, so this practice was discontinued.
* The volume header is constrained to be less than or equal to 512
* bytes long. A particular copy is assumed valid if no drive errors
* are detected, the magic number is correct, and the 32 bit 2's complement
* of the volume header is correct. The checksum is calculated by initially
* zeroing vh_csum, summing the entire structure and then storing the
* 2's complement of the sum. Thus a checksum to verify the volume header
* should be 0.
*
* The error summary table, bad sector replacement table, and boot blocks are
* located by searching the volume directory within the volume header.
*
* Tables are sized simply by the integral number of table records that
* will fit in the space indicated by the directory entry.
*
* The amount of space allocated to the volume header, replacement blocks,
* and other tables is user defined when the device is formatted.
*/
/*
* device parameters are in the volume header to determine mapping
* from logical block numbers to physical device addresses
*
* Linux doesn't care ...
*/
struct device_parameters {
unsigned char dp_skew; /* spiral addressing skew */
unsigned char dp_gap1; /* words of 0 before header */
unsigned char dp_gap2; /* words of 0 between hdr and data */
unsigned char dp_spares_cyl; /* This is for drives (such as SCSI
that support zone oriented sparing, where the zone is larger
than one track. It gets subracteded from the cylinder size
( dp_trks0 * dp_sec) when doing partition size calculations */
unsigned short dp_cyls; /* number of usable cylinders (i.e.,
doesn't include cylinders reserved by the drive for badblocks,
etc.). For drives with variable geometry, this number may be
decreased so that:
dp_cyls * ((dp_heads * dp_trks0) - dp_spares_cyl) <= actualcapacity
This happens on SCSI drives such as the Wren IV and Toshiba 156
Also see dp_cylshi below */
unsigned short dp_shd0; /* starting head vol 0 */
unsigned short dp_trks0; /* number of tracks / cylinder vol 0*/
unsigned char dp_ctq_depth; /* Depth of CTQ queue */
unsigned char dp_cylshi; /* high byte of 24 bits of cylinder count */
unsigned short dp_unused; /* not used */
unsigned short dp_secs; /* number of sectors/track */
unsigned short dp_secbytes; /* length of sector in bytes */
unsigned short dp_interleave; /* sector interleave */
int dp_flags; /* controller characteristics */
int dp_datarate; /* bytes/sec for kernel stats */
int dp_nretries; /* max num retries on data error */
int dp_mspw; /* ms per word to xfer, for iostat */
unsigned short dp_xgap1; /* Gap 1 for xylogics controllers */
unsigned short dp_xsync; /* sync delay for xylogics controllers */
unsigned short dp_xrdly; /* read delay for xylogics controllers */
unsigned short dp_xgap2; /* gap 2 for xylogics controllers */
unsigned short dp_xrgate; /* read gate for xylogics controllers */
unsigned short dp_xwcont; /* write continuation for xylogics */
};
/*
* Device characterization flags
* (dp_flags)
*/
#define DP_SECTSLIP 0x00000001 /* sector slip to spare sector */
#define DP_SECTFWD 0x00000002 /* forward to replacement sector */
#define DP_TRKFWD 0x00000004 /* forward to replacement track */
#define DP_MULTIVOL 0x00000008 /* multiple volumes per spindle */
#define DP_IGNOREERRORS 0x00000010 /* transfer data regardless of errors */
#define DP_RESEEK 0x00000020 /* recalibrate as last resort */
#define DP_CTQ_EN 0x00000040 /* enable command tag queueing */
/*
* Boot blocks, bad sector tables, and the error summary table, are located
* via the volume_directory.
*/
#define VDNAMESIZE 8
struct volume_directory {
char vd_name[VDNAMESIZE]; /* name */
int vd_lbn; /* logical block number */
int vd_nbytes; /* file length in bytes */
};
/*
* partition table describes logical device partitions
* (device drivers examine this to determine mapping from logical units
* to cylinder groups, device formatters/verifiers examine this to determine
* location of replacement tracks/sectors, etc)
*
* NOTE: pt_firstlbn SHOULD BE CYLINDER ALIGNED
*/
struct partition_table { /* one per logical partition */
int pt_nblks; /* # of logical blks in partition */
int pt_firstlbn; /* first lbn of partition */
int pt_type; /* use of partition */
};
#define PTYPE_VOLHDR 0 /* partition is volume header */
#define PTYPE_TRKREPL 1 /* partition is used for repl trks */
#define PTYPE_SECREPL 2 /* partition is used for repl secs */
#define PTYPE_RAW 3 /* partition is used for data */
#define PTYPE_BSD42 4 /* partition is 4.2BSD file system */
#define PTYPE_BSD 4 /* partition is 4.2BSD file system */
#define PTYPE_SYSV 5 /* partition is SysV file system */
#define PTYPE_VOLUME 6 /* partition is entire volume */
#define PTYPE_EFS 7 /* partition is sgi EFS */
#define PTYPE_LVOL 8 /* partition is part of a logical vol */
#define PTYPE_RLVOL 9 /* part of a "raw" logical vol */
#define PTYPE_XFS 10 /* partition is sgi XFS */
#define PTYPE_XFSLOG 11 /* partition is sgi XFS log */
#define PTYPE_XLV 12 /* partition is part of an XLV vol */
#define PTYPE_XVM 13 /* partition is sgi XVM */
#define PTYPE_LSWAP 0x82 /* partition is Linux swap */
#define PTYPE_LINUX 0x83 /* partition is Linux native */
#define NPTYPES 16
#define VHMAGIC 0xbe5a941 /* randomly chosen value */
#define NPARTAB 16 /* 16 unix partitions */
#define NVDIR 15 /* max of 15 directory entries */
#define BFNAMESIZE 16 /* max 16 chars in boot file name */
/* Partition types for ARCS */
#define NOT_USED 0 /* Not used */
#define FAT_SHORT 1 /* FAT filesystem, 12-bit FAT entries */
#define FAT_LONG 4 /* FAT filesystem, 16-bit FAT entries */
#define EXTENDED 5 /* extended partition */
#define HUGE 6 /* huge partition- MS/DOS 4.0 and later */
/* Active flags for ARCS */
#define BOOTABLE 0x00;
#define NOT_BOOTABLE 0x80;
struct volume_header {
int vh_magic; /* identifies volume header */
short vh_rootpt; /* root partition number */
short vh_swappt; /* swap partition number */
char vh_bootfile[BFNAMESIZE]; /* name of file to boot */
struct device_parameters vh_dp; /* device parameters */
struct volume_directory vh_vd[NVDIR]; /* other vol hdr contents */
struct partition_table vh_pt[NPARTAB]; /* device partition layout */
int vh_csum; /* volume header checksum */
int vh_fill; /* fill out to 512 bytes */
};
#endif /* _SYS_DVH_H */
|