File: /usr/src/linux/include/asm-s390/vtoc.h
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 enum failure {unable_to_open,
43 unable_to_seek,
44 unable_to_write,
45 unable_to_read};
46
47 unsigned char ASCtoEBC[256] =
48 {
49 /*00 NL SH SX EX ET NQ AK BL */
50 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
51 /*08 BS HT LF VT FF CR SO SI */
52 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
53 /*10 DL D1 D2 D3 D4 NK SN EB */
54 0x10, 0x11, 0x12, 0x13, 0x3C, 0x15, 0x32, 0x26,
55 /*18 CN EM SB EC FS GS RS US */
56 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
57 /*20 SP ! " # $ % & ' */
58 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
59 /*28 ( ) * + , - . / */
60 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
61 /*30 0 1 2 3 4 5 6 7 */
62 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
63 /*38 8 9 : ; < = > ? */
64 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
65 /*40 @ A B C D E F G */
66 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
67 /*48 H I J K L M N O */
68 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
69 /*50 P Q R S T U V W */
70 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
71 /*58 X Y Z [ \ ] ^ _ */
72 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
73 /*60 ` a b c d e f g */
74 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
75 /*68 h i j k l m n o */
76 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
77 /*70 p q r s t u v w */
78 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
79 /*78 x y z { | } ~ DL */
80 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
81 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
82 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
83 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
84 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
85 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
86 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
87 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
88 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
89 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
90 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
91 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
92 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
93 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
94 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
95 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
96 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF
97 };
98
99
100 unsigned char EBCtoASC[256] =
101 {
102 /* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */
103 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F,
104 /* 0x08 -GE -SPS -RPT VT FF CR SO SI */
105 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
106 /* 0x10 DLE DC1 DC2 DC3 -RES -NL BS -POC
107 -ENP ->LF */
108 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07,
109 /* 0x18 CAN EM -UBS -CU1 -IFS -IGS -IRS -ITB
110 -IUS */
111 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
112 /* 0x20 -DS -SOS FS -WUS -BYP LF ETB ESC
113 -INP */
114 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B,
115 /* 0x28 -SA -SFE -SM -CSP -MFA ENQ ACK BEL
116 -SW */
117 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07,
118 /* 0x30 ---- ---- SYN -IR -PP -TRN -NBS EOT */
119 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04,
120 /* 0x38 -SBS -IT -RFF -CU3 DC4 NAK ---- SUB */
121 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A,
122 /* 0x40 SP RSP ä ---- */
123 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86,
124 /* 0x48 . < ( + | */
125 0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
126 /* 0x50 & ---- */
127 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07,
128 /* 0x58 ß ! $ * ) ; */
129 0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA,
130 /* 0x60 - / ---- Ä ---- ---- ---- */
131 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F,
132 /* 0x68 ---- , % _ > ? */
133 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
134 /* 0x70 ---- ---- ---- ---- ---- ---- ---- */
135 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
136 /* 0x78 * ` : # @ ' = " */
137 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
138 /* 0x80 * a b c d e f g */
139 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
140 /* 0x88 h i ---- ---- ---- */
141 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1,
142 /* 0x90 ° j k l m n o p */
143 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
144 /* 0x98 q r ---- ---- */
145 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07,
146 /* 0xA0 ~ s t u v w x */
147 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
148 /* 0xA8 y z ---- ---- ---- ---- */
149 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07,
150 /* 0xB0 ^ ---- § ---- */
151 0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC,
152 /* 0xB8 ---- [ ] ---- ---- ---- ---- */
153 0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07,
154 /* 0xC0 { A B C D E F G */
155 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
156 /* 0xC8 H I ---- ö ---- */
157 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07,
158 /* 0xD0 } J K L M N O P */
159 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
160 /* 0xD8 Q R ---- ü */
161 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98,
162 /* 0xE0 \ S T U V W X */
163 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
164 /* 0xE8 Y Z ---- Ö ---- ---- ---- */
165 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07,
166 /* 0xF0 0 1 2 3 4 5 6 7 */
167 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
168 /* 0xF8 8 9 ---- ---- Ü ---- ---- ---- */
169 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07
170 };
171
172 typedef struct ttr
173 {
174 __u16 tt;
175 __u8 r;
176 } __attribute__ ((packed)) ttr_t;
177
178 typedef struct cchhb
179 {
180 __u16 cc;
181 __u16 hh;
182 __u8 b;
183 } __attribute__ ((packed)) cchhb_t;
184
185 typedef struct cchh
186 {
187 __u16 cc;
188 __u16 hh;
189 } __attribute__ ((packed)) cchh_t;
190
191 typedef struct labeldate
192 {
193 __u8 year;
194 __u16 day;
195 } __attribute__ ((packed)) labeldate_t;
196
197
198 typedef struct volume_label
199 {
200 char volkey[4]; /* volume key = volume label */
201 char vollbl[4]; /* volume label */
202 char volid[6]; /* volume identifier */
203 __u8 security; /* security byte */
204 cchhb_t vtoc; /* VTOC address */
205 char res1[5]; /* reserved */
206 char cisize[4]; /* CI-size for FBA,... */
207 /* ...blanks for CKD */
208 char blkperci[4]; /* no of blocks per CI (FBA), blanks for CKD */
209 char labperci[4]; /* no of labels per CI (FBA), blanks for CKD */
210 char res2[4]; /* reserved */
211 char lvtoc[14]; /* owner code for LVTOC */
212 char res3[29]; /* reserved */
213 } __attribute__ ((packed)) volume_label_t;
214
215
216 typedef struct extent
217 {
218 __u8 typeind; /* extent type indicator */
219 __u8 seqno; /* extent sequence number */
220 cchh_t llimit; /* starting point of this extent */
221 cchh_t ulimit; /* ending point of this extent */
222 } __attribute__ ((packed)) extent_t;
223
224
225 typedef struct dev_const
226 {
227 __u16 DS4DSCYL; /* number of logical cyls */
228 __u16 DS4DSTRK; /* number of tracks in a logical cylinder */
229 __u16 DS4DEVTK; /* device track length */
230 __u8 DS4DEVI; /* non-last keyed record overhead */
231 __u8 DS4DEVL; /* last keyed record overhead */
232 __u8 DS4DEVK; /* non-keyed record overhead differential */
233 __u8 DS4DEVFG; /* flag byte */
234 __u16 DS4DEVTL; /* device tolerance */
235 __u8 DS4DEVDT; /* number of DSCB's per track */
236 __u8 DS4DEVDB; /* number of directory blocks per track */
237 } __attribute__ ((packed)) dev_const_t;
238
239
240 typedef struct format1_label
241 {
242 char DS1DSNAM[44]; /* data set name */
243 __u8 DS1FMTID; /* format identifier */
244 char DS1DSSN[6]; /* data set serial number */
245 __u16 DS1VOLSQ; /* volume sequence number */
246 labeldate_t DS1CREDT; /* creation date: ydd */
247 labeldate_t DS1EXPDT; /* expiration date */
248 __u8 DS1NOEPV; /* number of extents on volume */
249 __u8 DS1NOBDB; /* no. of bytes used in last direction blk */
250 __u8 DS1FLAG1; /* flag 1 */
251 char DS1SYSCD[13]; /* system code */
252 labeldate_t DS1REFD; /* date last referenced */
253 __u8 DS1SMSFG; /* system managed storage indicators */
254 __u8 DS1SCXTF; /* sec. space extension flag byte */
255 __u16 DS1SCXTV; /* secondary space extension value */
256 __u8 DS1DSRG1; /* data set organisation byte 1 */
257 __u8 DS1DSRG2; /* data set organisation byte 2 */
258 __u8 DS1RECFM; /* record format */
259 __u8 DS1OPTCD; /* option code */
260 __u16 DS1BLKL; /* block length */
261 __u16 DS1LRECL; /* record length */
262 __u8 DS1KEYL; /* key length */
263 __u16 DS1RKP; /* relative key position */
264 __u8 DS1DSIND; /* data set indicators */
265 __u8 DS1SCAL1; /* secondary allocation flag byte */
266 char DS1SCAL3[3]; /* secondary allocation quantity */
267 ttr_t DS1LSTAR; /* last used track and block on track */
268 __u16 DS1TRBAL; /* space remaining on last used track */
269 __u16 res1; /* reserved */
270 extent_t DS1EXT1; /* first extent description */
271 extent_t DS1EXT2; /* second extent description */
272 extent_t DS1EXT3; /* third extent description */
273 cchhb_t DS1PTRDS; /* possible pointer to f2 or f3 DSCB */
274 } __attribute__ ((packed)) format1_label_t;
275
276
277 typedef struct format4_label
278 {
279 char DS4KEYCD[44]; /* key code for VTOC labels: 44 times 0x04 */
280 __u8 DS4IDFMT; /* format identifier */
281 cchhb_t DS4HPCHR; /* highest address of a format 1 DSCB */
282 __u16 DS4DSREC; /* number of available DSCB's */
283 cchh_t DS4HCCHH; /* CCHH of next available alternate track */
284 __u16 DS4NOATK; /* number of remaining alternate tracks */
285 __u8 DS4VTOCI; /* VTOC indicators */
286 __u8 DS4NOEXT; /* number of extents in VTOC */
287 __u8 DS4SMSFG; /* system managed storage indicators */
288 __u8 DS4DEVAC; /* number of alternate cylinders.
289 Subtract from first two bytes of
290 DS4DEVSZ to get number of usable
291 cylinders. can be zero. valid
292 only if DS4DEVAV on. */
293 dev_const_t DS4DEVCT; /* device constants */
294 char DS4AMTIM[8]; /* VSAM time stamp */
295 char DS4AMCAT[3]; /* VSAM catalog indicator */
296 char DS4R2TIM[8]; /* VSAM volume/catalog match time stamp */
297 char res1[5]; /* reserved */
298 char DS4F6PTR[5]; /* pointer to first format 6 DSCB */
299 extent_t DS4VTOCE; /* VTOC extent description */
300 char res2[10]; /* reserved */
301 __u8 DS4EFLVL; /* extended free-space management level */
302 cchhb_t DS4EFPTR; /* pointer to extended free-space info */
303 char res3[9]; /* reserved */
304 } __attribute__ ((packed)) format4_label_t;
305
306
307 typedef struct ds5ext
308 {
309 __u16 t; /* RTA of the first track of free extent */
310 __u16 fc; /* number of whole cylinders in free ext. */
311 __u8 ft; /* number of remaining free tracks */
312 } __attribute__ ((packed)) ds5ext_t;
313
314
315 typedef struct format5_label
316 {
317 char DS5KEYID[4]; /* key identifier */
318 ds5ext_t DS5AVEXT; /* first available (free-space) extent. */
319 ds5ext_t DS5EXTAV[7]; /* seven available extents */
320 __u8 DS5FMTID; /* format identifier */
321 ds5ext_t DS5MAVET[18]; /* eighteen available extents */
322 cchhb_t DS5PTRDS[5]; /* pointer to next format5 DSCB */
323 } __attribute__ ((packed)) format5_label_t;
324
325
326 typedef struct ds7ext
327 {
328 __u32 a; /* starting RTA value */
329 __u32 b; /* ending RTA value + 1 */
330 } __attribute__ ((packed)) ds7ext_t;
331
332
333 typedef struct format7_label
334 {
335 char DS7KEYID[4]; /* key identifier */
336 ds7ext_t DS7EXTNT[5]; /* space for 5 extent descriptions */
337 __u8 DS7FMTID; /* format identifier */
338 ds7ext_t DS7ADEXT[11]; /* space for 11 extent descriptions */
339 char res1[2]; /* reserved */
340 cchhb_t DS7PTRDS; /* pointer to next FMT7 DSCB */
341 } __attribute__ ((packed)) format7_label_t;
342
343
344 char * vtoc_ebcdic_enc (
345 unsigned char source[LINE_LENGTH],
346 unsigned char target[LINE_LENGTH],
347 int l);
348 char * vtoc_ebcdic_dec (
349 unsigned char source[LINE_LENGTH],
350 unsigned char target[LINE_LENGTH],
351 int l);
352 void vtoc_set_extent (
353 extent_t * ext,
354 __u8 typeind,
355 __u8 seqno,
356 cchh_t * lower,
357 cchh_t * upper);
358 void vtoc_set_cchh (
359 cchh_t * addr,
360 __u16 cc,
361 __u16 hh);
362 void vtoc_set_cchhb (
363 cchhb_t * addr,
364 __u16 cc,
365 __u16 hh,
366 __u8 b);
367 void vtoc_set_date (
368 labeldate_t * d,
369 __u8 year,
370 __u16 day);
371
372 void vtoc_volume_label_init (
373 volume_label_t *vlabel);
374
375 int vtoc_read_volume_label (
376 char * device,
377 unsigned long vlabel_start,
378 volume_label_t * vlabel);
379
380 int vtoc_write_volume_label (
381 char *device,
382 unsigned long vlabel_start,
383 volume_label_t *vlabel);
384
385 void vtoc_volume_label_set_volser (
386 volume_label_t *vlabel,
387 char *volser);
388
389 char *vtoc_volume_label_get_volser (
390 volume_label_t *vlabel,
391 char *volser);
392
393 void vtoc_volume_label_set_key (
394 volume_label_t *vlabel,
395 char *key);
396
397 void vtoc_volume_label_set_label (
398 volume_label_t *vlabel,
399 char *lbl);
400
401 char *vtoc_volume_label_get_label (
402 volume_label_t *vlabel,
403 char *lbl);
404
405 void vtoc_read_label (
406 char *device,
407 unsigned long position,
408 format1_label_t *f1,
409 format4_label_t *f4,
410 format5_label_t *f5,
411 format7_label_t *f7);
412
413 void vtoc_write_label (
414 char *device,
415 unsigned long position,
416 format1_label_t *f1,
417 format4_label_t *f4,
418 format5_label_t *f5,
419 format7_label_t *f7);
420
421
422 void vtoc_init_format1_label (
423 char *volid,
424 unsigned int blksize,
425 extent_t *part_extent,
426 format1_label_t *f1);
427
428
429 void vtoc_init_format4_label (
430 format4_label_t *f4lbl,
431 unsigned int usable_partitions,
432 unsigned int cylinders,
433 unsigned int tracks,
434 unsigned int blocks,
435 unsigned int blksize,
436 __u16 dev_type);
437
438 void vtoc_update_format4_label (
439 format4_label_t *f4,
440 cchhb_t *highest_f1,
441 __u16 unused_update);
442
443
444 void vtoc_init_format5_label (
445 format5_label_t *f5);
446
447 void vtoc_update_format5_label_add (
448 format5_label_t *f5,
449 int verbose,
450 int cyl,
451 int trk,
452 __u16 a,
453 __u16 b,
454 __u8 c);
455
456 void vtoc_update_format5_label_del (
457 format5_label_t *f5,
458 int verbose,
459 int cyl,
460 int trk,
461 __u16 a,
462 __u16 b,
463 __u8 c);
464
465
466 void vtoc_init_format7_label (
467 format7_label_t *f7);
468
469 void vtoc_update_format7_label_add (
470 format7_label_t *f7,
471 int verbose,
472 __u32 a,
473 __u32 b);
474
475 void vtoc_update_format7_label_del (
476 format7_label_t *f7,
477 int verbose,
478 __u32 a,
479 __u32 b);
480
481
482 void vtoc_set_freespace(
483 format4_label_t *f4,
484 format5_label_t *f5,
485 format7_label_t *f7,
486 char ch,
487 int verbose,
488 __u32 start,
489 __u32 stop,
490 int cyl,
491 int trk);
492
493
494
495
496
497
498
499
500
501
502
503
504