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