1#ifndef __KERNEL__ 2#include <string.h> 3#include <stdlib.h> 4#include <stdio.h> 5#include <errno.h> 6#include <ctype.h> 7#include <time.h> 8#include <fcntl.h> 9#include <unistd.h> 10 11#include <sys/stat.h> 12#include <sys/ioctl.h> 13 14#include <linux/fs.h> 15#include <linux/types.h> 16#include <linux/hdreg.h> 17#include <linux/version.h> 18#include <asm/dasd.h> 19#endif 20 21#define DASD_API_VERSION 0 22 23#define LINE_LENGTH 80 24#define VTOC_START_CC 0x0 25#define VTOC_START_HH 0x1 26#define FIRST_USABLE_CYL 1 27#define FIRST_USABLE_TRK 2 28 29#define DASD_3380_TYPE 13148 30#define DASD_3390_TYPE 13200 31#define DASD_9345_TYPE 37701 32 33#define DASD_3380_VALUE 0xbb60 34#define DASD_3390_VALUE 0xe5a2 35#define DASD_9345_VALUE 0xbc98 36 37#define VOLSER_LENGTH 6 38#define BIG_DISK_SIZE 0x10000 39 40#define VTOC_ERROR "VTOC error:" 41 42 43typedef struct ttr 44{ 45 __u16 tt; 46 __u8 r; 47} __attribute__ ((packed)) ttr_t; 48 49typedef struct cchhb 50{ 51 __u16 cc; 52 __u16 hh; 53 __u8 b; 54} __attribute__ ((packed)) cchhb_t; 55 56typedef struct cchh 57{ 58 __u16 cc; 59 __u16 hh; 60} __attribute__ ((packed)) cchh_t; 61 62typedef struct labeldate 63{ 64 __u8 year; 65 __u16 day; 66} __attribute__ ((packed)) labeldate_t; 67 68 69typedef struct volume_label 70{ 71 char volkey[4]; /* volume key = volume label */ 72 char vollbl[4]; /* volume label */ 73 char volid[6]; /* volume identifier */ 74 __u8 security; /* security byte */ 75 cchhb_t vtoc; /* VTOC address */ 76 char res1[5]; /* reserved */ 77 char cisize[4]; /* CI-size for FBA,... */ 78 /* ...blanks for CKD */ 79 char blkperci[4]; /* no of blocks per CI (FBA), blanks for CKD */ 80 char labperci[4]; /* no of labels per CI (FBA), blanks for CKD */ 81 char res2[4]; /* reserved */ 82 char lvtoc[14]; /* owner code for LVTOC */ 83 char res3[29]; /* reserved */ 84} __attribute__ ((packed)) volume_label_t; 85 86 87typedef struct extent 88{ 89 __u8 typeind; /* extent type indicator */ 90 __u8 seqno; /* extent sequence number */ 91 cchh_t llimit; /* starting point of this extent */ 92 cchh_t ulimit; /* ending point of this extent */ 93} __attribute__ ((packed)) extent_t; 94 95 96typedef struct dev_const 97{ 98 __u16 DS4DSCYL; /* number of logical cyls */ 99 __u16 DS4DSTRK; /* number of tracks in a logical cylinder */ 100 __u16 DS4DEVTK; /* device track length */ 101 __u8 DS4DEVI; /* non-last keyed record overhead */ 102 __u8 DS4DEVL; /* last keyed record overhead */ 103 __u8 DS4DEVK; /* non-keyed record overhead differential */ 104 __u8 DS4DEVFG; /* flag byte */ 105 __u16 DS4DEVTL; /* device tolerance */ 106 __u8 DS4DEVDT; /* number of DSCB's per track */ 107 __u8 DS4DEVDB; /* number of directory blocks per track */ 108} __attribute__ ((packed)) dev_const_t; 109 110 111typedef struct format1_label 112{ 113 char DS1DSNAM[44]; /* data set name */ 114 __u8 DS1FMTID; /* format identifier */ 115 char DS1DSSN[6]; /* data set serial number */ 116 __u16 DS1VOLSQ; /* volume sequence number */ 117 labeldate_t DS1CREDT; /* creation date: ydd */ 118 labeldate_t DS1EXPDT; /* expiration date */ 119 __u8 DS1NOEPV; /* number of extents on volume */ 120 __u8 DS1NOBDB; /* no. of bytes used in last direction blk */ 121 __u8 DS1FLAG1; /* flag 1 */ 122 char DS1SYSCD[13]; /* system code */ 123 labeldate_t DS1REFD; /* date last referenced */ 124 __u8 DS1SMSFG; /* system managed storage indicators */ 125 __u8 DS1SCXTF; /* sec. space extension flag byte */ 126 __u16 DS1SCXTV; /* secondary space extension value */ 127 __u8 DS1DSRG1; /* data set organisation byte 1 */ 128 __u8 DS1DSRG2; /* data set organisation byte 2 */ 129 __u8 DS1RECFM; /* record format */ 130 __u8 DS1OPTCD; /* option code */ 131 __u16 DS1BLKL; /* block length */ 132 __u16 DS1LRECL; /* record length */ 133 __u8 DS1KEYL; /* key length */ 134 __u16 DS1RKP; /* relative key position */ 135 __u8 DS1DSIND; /* data set indicators */ 136 __u8 DS1SCAL1; /* secondary allocation flag byte */ 137 char DS1SCAL3[3]; /* secondary allocation quantity */ 138 ttr_t DS1LSTAR; /* last used track and block on track */ 139 __u16 DS1TRBAL; /* space remaining on last used track */ 140 __u16 res1; /* reserved */ 141 extent_t DS1EXT1; /* first extent description */ 142 extent_t DS1EXT2; /* second extent description */ 143 extent_t DS1EXT3; /* third extent description */ 144 cchhb_t DS1PTRDS; /* possible pointer to f2 or f3 DSCB */ 145} __attribute__ ((packed)) format1_label_t; 146 147 148typedef struct format4_label 149{ 150 char DS4KEYCD[44]; /* key code for VTOC labels: 44 times 0x04 */ 151 __u8 DS4IDFMT; /* format identifier */ 152 cchhb_t DS4HPCHR; /* highest address of a format 1 DSCB */ 153 __u16 DS4DSREC; /* number of available DSCB's */ 154 cchh_t DS4HCCHH; /* CCHH of next available alternate track */ 155 __u16 DS4NOATK; /* number of remaining alternate tracks */ 156 __u8 DS4VTOCI; /* VTOC indicators */ 157 __u8 DS4NOEXT; /* number of extents in VTOC */ 158 __u8 DS4SMSFG; /* system managed storage indicators */ 159 __u8 DS4DEVAC; /* number of alternate cylinders. 160 Subtract from first two bytes of 161 DS4DEVSZ to get number of usable 162 cylinders. can be zero. valid 163 only if DS4DEVAV on. */ 164 dev_const_t DS4DEVCT; /* device constants */ 165 char DS4AMTIM[8]; /* VSAM time stamp */ 166 char DS4AMCAT[3]; /* VSAM catalog indicator */ 167 char DS4R2TIM[8]; /* VSAM volume/catalog match time stamp */ 168 char res1[5]; /* reserved */ 169 char DS4F6PTR[5]; /* pointer to first format 6 DSCB */ 170 extent_t DS4VTOCE; /* VTOC extent description */ 171 char res2[10]; /* reserved */ 172 __u8 DS4EFLVL; /* extended free-space management level */ 173 cchhb_t DS4EFPTR; /* pointer to extended free-space info */ 174 char res3[9]; /* reserved */ 175} __attribute__ ((packed)) format4_label_t; 176 177 178typedef struct ds5ext 179{ 180 __u16 t; /* RTA of the first track of free extent */ 181 __u16 fc; /* number of whole cylinders in free ext. */ 182 __u8 ft; /* number of remaining free tracks */ 183} __attribute__ ((packed)) ds5ext_t; 184 185 186typedef struct format5_label 187{ 188 char DS5KEYID[4]; /* key identifier */ 189 ds5ext_t DS5AVEXT; /* first available (free-space) extent. */ 190 ds5ext_t DS5EXTAV[7]; /* seven available extents */ 191 __u8 DS5FMTID; /* format identifier */ 192 ds5ext_t DS5MAVET[18]; /* eighteen available extents */ 193 cchhb_t DS5PTRDS; /* pointer to next format5 DSCB */ 194} __attribute__ ((packed)) format5_label_t; 195 196 197typedef struct ds7ext 198{ 199 __u32 a; /* starting RTA value */ 200 __u32 b; /* ending RTA value + 1 */ 201} __attribute__ ((packed)) ds7ext_t; 202 203 204typedef struct format7_label 205{ 206 char DS7KEYID[4]; /* key identifier */ 207 ds7ext_t DS7EXTNT[5]; /* space for 5 extent descriptions */ 208 __u8 DS7FMTID; /* format identifier */ 209 ds7ext_t DS7ADEXT[11]; /* space for 11 extent descriptions */ 210 char res1[2]; /* reserved */ 211 cchhb_t DS7PTRDS; /* pointer to next FMT7 DSCB */ 212} __attribute__ ((packed)) format7_label_t; 213 214 215char * vtoc_ebcdic_enc ( 216 unsigned char source[LINE_LENGTH], 217 unsigned char target[LINE_LENGTH], 218 int l); 219char * vtoc_ebcdic_dec ( 220 unsigned char source[LINE_LENGTH], 221 unsigned char target[LINE_LENGTH], 222 int l); 223void vtoc_set_extent ( 224 extent_t * ext, 225 __u8 typeind, 226 __u8 seqno, 227 cchh_t * lower, 228 cchh_t * upper); 229void vtoc_set_cchh ( 230 cchh_t * addr, 231 __u16 cc, 232 __u16 hh); 233void vtoc_set_cchhb ( 234 cchhb_t * addr, 235 __u16 cc, 236 __u16 hh, 237 __u8 b); 238void vtoc_set_date ( 239 labeldate_t * d, 240 __u8 year, 241 __u16 day); 242 243void vtoc_volume_label_init ( 244 volume_label_t *vlabel); 245 246int vtoc_read_volume_label ( 247 char * device, 248 unsigned long vlabel_start, 249 volume_label_t * vlabel); 250 251int vtoc_write_volume_label ( 252 char *device, 253 unsigned long vlabel_start, 254 volume_label_t *vlabel); 255 256void vtoc_volume_label_set_volser ( 257 volume_label_t *vlabel, 258 char *volser); 259 260char *vtoc_volume_label_get_volser ( 261 volume_label_t *vlabel, 262 char *volser); 263 264void vtoc_volume_label_set_key ( 265 volume_label_t *vlabel, 266 char *key); 267 268void vtoc_volume_label_set_label ( 269 volume_label_t *vlabel, 270 char *lbl); 271 272char *vtoc_volume_label_get_label ( 273 volume_label_t *vlabel, 274 char *lbl); 275 276void vtoc_read_label ( 277 char *device, 278 unsigned long position, 279 format1_label_t *f1, 280 format4_label_t *f4, 281 format5_label_t *f5, 282 format7_label_t *f7); 283 284void vtoc_write_label ( 285 char *device, 286 unsigned long position, 287 format1_label_t *f1, 288 format4_label_t *f4, 289 format5_label_t *f5, 290 format7_label_t *f7); 291 292 293void vtoc_init_format1_label ( 294 char *volid, 295 unsigned int blksize, 296 extent_t *part_extent, 297 format1_label_t *f1); 298 299 300void vtoc_init_format4_label ( 301 format4_label_t *f4lbl, 302 unsigned int usable_partitions, 303 unsigned int cylinders, 304 unsigned int tracks, 305 unsigned int blocks, 306 unsigned int blksize, 307 __u16 dev_type); 308 309void vtoc_update_format4_label ( 310 format4_label_t *f4, 311 cchhb_t *highest_f1, 312 __u16 unused_update); 313 314 315void vtoc_init_format5_label ( 316 format5_label_t *f5); 317 318void vtoc_update_format5_label_add ( 319 format5_label_t *f5, 320 int verbose, 321 int cyl, 322 int trk, 323 __u16 a, 324 __u16 b, 325 __u8 c); 326 327void vtoc_update_format5_label_del ( 328 format5_label_t *f5, 329 int verbose, 330 int cyl, 331 int trk, 332 __u16 a, 333 __u16 b, 334 __u8 c); 335 336 337void vtoc_init_format7_label ( 338 format7_label_t *f7); 339 340void vtoc_update_format7_label_add ( 341 format7_label_t *f7, 342 int verbose, 343 __u32 a, 344 __u32 b); 345 346void vtoc_update_format7_label_del ( 347 format7_label_t *f7, 348 int verbose, 349 __u32 a, 350 __u32 b); 351 352 353void vtoc_set_freespace( 354 format4_label_t *f4, 355 format5_label_t *f5, 356 format7_label_t *f7, 357 char ch, 358 int verbose, 359 __u32 start, 360 __u32 stop, 361 int cyl, 362 int trk); 363 364 365 366 367 368 369 370 371 372 373 374 375