vtoc.h

00001 /*
00002  * File...........: s390-tools/dasdview/vtoc.h
00003  * Author(s)......: Horst Hummel <horst.hummel@de.ibm.com>
00004  * Bugreports.to..: <Linux390@de.ibm.com>
00005  *
00006  * This is a user-space copy of the kernel vtoc,h. 
00007  * 
00008  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2002
00009  *
00010  * History of changes (starts March 2002)
00011  * 2002-03-12 initial
00012  */
00013 
00014 #ifndef VTOC_H
00015 #define VTOC_H
00016 
00017 #include <string.h>
00018 #include <stdlib.h>
00019 #include <stdio.h>
00020 #include <errno.h>
00021 #include <ctype.h>
00022 #include <time.h>
00023 #include <fcntl.h>
00024 #include <unistd.h>
00025 
00026 #include <sys/stat.h>
00027 #include <sys/ioctl.h>
00028 
00029 #define LINE_LENGTH 80
00030 #define VTOC_START_CC 0x0
00031 #define VTOC_START_HH 0x1
00032 #define FIRST_USABLE_CYL 1
00033 #define FIRST_USABLE_TRK 2
00034 
00035 #define DASD_3380_TYPE 13148
00036 #define DASD_3390_TYPE 13200
00037 #define DASD_9345_TYPE 37701
00038 
00039 #define DASD_3380_VALUE 0xbb60
00040 #define DASD_3390_VALUE 0xe5a2
00041 #define DASD_9345_VALUE 0xbc98
00042 
00043 #define VOLSER_LENGTH 6
00044 #define BIG_DISK_SIZE 0x10000
00045 
00046 #define VTOC_ERROR "VTOC error:"
00047 
00048 typedef struct ttr              ttr_t;
00049 typedef struct cchhb            cchhb_t;
00050 typedef struct cchh             cchh_t;
00051 typedef struct labeldate        labeldate_t;
00052 typedef struct volume_label     volume_label_t;
00053 typedef struct extent           extent_t;
00054 typedef struct dev_const        dev_const_t;
00055 typedef struct format1_label    format1_label_t;
00056 typedef struct format4_label    format4_label_t;
00057 typedef struct ds5ext           ds5ext_t;
00058 typedef struct format5_label    format5_label_t;
00059 typedef struct ds7ext           ds7ext_t;
00060 typedef struct format7_label    format7_label_t;
00061 
00062 struct __attribute__ ((packed)) ttr {
00063         u_int16_t tt;
00064         u_int8_t  r;
00065 };
00066 
00067 struct  __attribute__ ((packed)) cchhb {
00068         u_int16_t cc;
00069         u_int16_t hh;
00070         u_int8_t b;
00071 };
00072 
00073 struct __attribute__ ((packed)) cchh {
00074         u_int16_t cc;
00075         u_int16_t hh;
00076 };
00077 
00078 struct __attribute__ ((packed)) labeldate {
00079         u_int8_t  year;
00080         u_int16_t day;
00081 };
00082 
00083 struct __attribute__ ((packed)) volume_label {
00084         char volkey[4];         /* volume key = volume label                 */
00085         char vollbl[4];         /* volume label                              */
00086         char volid[6];          /* volume identifier                         */
00087         u_int8_t security;      /* security byte                             */
00088         cchhb_t vtoc;           /* VTOC address                              */
00089         char res1[5];           /* reserved                                  */
00090         char cisize[4];         /* CI-size for FBA,...                       */
00091                                 /* ...blanks for CKD                         */
00092         char blkperci[4];       /* no of blocks per CI (FBA), blanks for CKD */
00093         char labperci[4];       /* no of labels per CI (FBA), blanks for CKD */
00094         char res2[4];           /* reserved                                  */
00095         char lvtoc[14];         /* owner code for LVTOC                      */
00096         char res3[29];          /* reserved                                  */
00097 };
00098 
00099 struct __attribute__ ((packed)) extent {
00100         u_int8_t  typeind;      /* extent type indicator */
00101         u_int8_t  seqno;        /* extent sequence number */
00102         cchh_t llimit;          /* starting point of this extent */
00103         cchh_t ulimit;          /* ending point of this extent */
00104 };
00105 
00106 struct __attribute__ ((packed)) dev_const {
00107         u_int16_t DS4DSCYL;     /* number of logical cyls */
00108         u_int16_t DS4DSTRK;     /* number of tracks in a logical cylinder  */
00109         u_int16_t DS4DEVTK;     /* device track length */
00110         u_int8_t  DS4DEVI;      /* non-last keyed record overhead */
00111         u_int8_t  DS4DEVL;      /* last keyed record overhead */
00112         u_int8_t  DS4DEVK;      /* non-keyed record overhead differential */
00113         u_int8_t  DS4DEVFG;     /* flag byte */
00114         u_int16_t DS4DEVTL;     /* device tolerance */
00115         u_int8_t  DS4DEVDT;     /* number of DSCB's per track */
00116         u_int8_t  DS4DEVDB;     /* number of directory blocks per track */
00117 };
00118 
00119 struct __attribute__ ((packed)) format1_label {
00120         char  DS1DSNAM[44];     /* data set name                           */
00121         u_int8_t  DS1FMTID;     /* format identifier                       */
00122         char  DS1DSSN[6];       /* data set serial number                  */
00123         u_int16_t DS1VOLSQ;     /* volume sequence number                  */
00124         labeldate_t DS1CREDT;   /* creation date: ydd                      */
00125         labeldate_t DS1EXPDT;   /* expiration date                         */
00126         u_int8_t  DS1NOEPV;     /* number of extents on volume             */
00127         u_int8_t  DS1NOBDB;     /* no. of bytes used in last direction blk */
00128         u_int8_t  DS1FLAG1;     /* flag 1                                  */
00129         char  DS1SYSCD[13];     /* system code                             */
00130         labeldate_t DS1REFD;    /* date last referenced                    */
00131         u_int8_t  DS1SMSFG;     /* system managed storage indicators       */
00132         u_int8_t  DS1SCXTF;     /* sec. space extension flag byte          */
00133         u_int16_t DS1SCXTV;     /* secondary space extension value         */
00134         u_int8_t  DS1DSRG1;     /* data set organisation byte 1            */
00135         u_int8_t  DS1DSRG2;     /* data set organisation byte 2            */
00136         u_int8_t  DS1RECFM;     /* record format                           */
00137         u_int8_t  DS1OPTCD;     /* option code                             */
00138         u_int16_t DS1BLKL;      /* block length                            */
00139         u_int16_t DS1LRECL;     /* record length                           */
00140         u_int8_t  DS1KEYL;      /* key length                              */
00141         u_int16_t DS1RKP;       /* relative key position                   */
00142         u_int8_t  DS1DSIND;     /* data set indicators                     */
00143         u_int8_t  DS1SCAL1;     /* secondary allocation flag byte          */
00144         char DS1SCAL3[3];       /* secondary allocation quantity           */
00145         ttr_t DS1LSTAR;         /* last used track and block on track      */
00146         u_int16_t DS1TRBAL;     /* space remaining on last used track      */
00147         u_int16_t res1;         /* reserved                                */
00148         extent_t DS1EXT1;       /* first extent description                */
00149         extent_t DS1EXT2;       /* second extent description               */
00150         extent_t DS1EXT3;       /* third extent description                */
00151         cchhb_t DS1PTRDS;       /* possible pointer to f2 or f3 DSCB       */
00152 };
00153 
00154 struct __attribute__ ((packed)) format4_label {
00155         char  DS4KEYCD[44];     /* key code for VTOC labels: 44 times 0x04 */
00156         u_int8_t  DS4IDFMT;     /* format identifier                       */
00157         cchhb_t DS4HPCHR;       /* highest address of a format 1 DSCB      */
00158         u_int16_t DS4DSREC;     /* number of available DSCB's              */
00159         cchh_t DS4HCCHH;        /* CCHH of next available alternate track  */
00160         u_int16_t DS4NOATK;     /* number of remaining alternate tracks    */
00161         u_int8_t  DS4VTOCI;     /* VTOC indicators                         */
00162         u_int8_t  DS4NOEXT;     /* number of extents in VTOC               */
00163         u_int8_t  DS4SMSFG;     /* system managed storage indicators       */
00164         u_int8_t  DS4DEVAC;     /* number of alternate cylinders. 
00165                                    Subtract from first two bytes of 
00166                                    DS4DEVSZ to get number of usable
00167                                    cylinders. can be zero. valid
00168                                    only if DS4DEVAV on.                    */
00169         dev_const_t DS4DEVCT;   /* device constants                        */
00170         char DS4AMTIM[8];       /* VSAM time stamp                         */
00171         char DS4AMCAT[3];       /* VSAM catalog indicator                  */
00172         char DS4R2TIM[8];       /* VSAM volume/catalog match time stamp    */
00173         char res1[5];           /* reserved                                */
00174         char DS4F6PTR[5];       /* pointer to first format 6 DSCB          */
00175         extent_t DS4VTOCE;      /* VTOC extent description                 */
00176         char res2[10];          /* reserved                                */
00177         u_int8_t DS4EFLVL;      /* extended free-space management level    */
00178         cchhb_t DS4EFPTR;       /* pointer to extended free-space info     */
00179         char res3[9];           /* reserved                                */
00180 };
00181 
00182 struct __attribute__ ((packed)) ds5ext {
00183         u_int16_t t;            /* RTA of the first track of free extent   */
00184         u_int16_t fc;           /* number of whole cylinders in free ext.  */
00185         u_int8_t  ft;           /* number of remaining free tracks         */
00186 };
00187 
00188 struct __attribute__ ((packed)) format5_label {
00189         char DS5KEYID[4];       /* key identifier                          */
00190         ds5ext_t DS5AVEXT;      /* first available (free-space) extent.    */
00191         ds5ext_t DS5EXTAV[7];   /* seven available extents                 */
00192         u_int8_t DS5FMTID;      /* format identifier                       */
00193         ds5ext_t DS5MAVET[18];  /* eighteen available extents              */
00194         cchhb_t DS5PTRDS;       /* pointer to next format5 DSCB            */
00195 };
00196 
00197 struct __attribute__ ((packed)) ds7ext {
00198         u_int32_t a;            /* starting RTA value                      */
00199         u_int32_t b;            /* ending RTA value + 1                    */
00200 };
00201 
00202 struct __attribute__ ((packed)) format7_label {
00203         char DS7KEYID[4];       /* key identifier                          */
00204         ds7ext_t DS7EXTNT[5];   /* space for 5 extent descriptions         */
00205         u_int8_t DS7FMTID;      /* format identifier                       */
00206         ds7ext_t DS7ADEXT[11];  /* space for 11 extent descriptions        */
00207         char res1[2];           /* reserved                                */
00208         cchhb_t DS7PTRDS;       /* pointer to next FMT7 DSCB               */
00209 };
00210 
00211 char * vtoc_ebcdic_enc (char source[LINE_LENGTH], char target[LINE_LENGTH],
00212                         int l);
00213 char * vtoc_ebcdic_dec (char source[LINE_LENGTH], char target[LINE_LENGTH],
00214                         int l);
00215 void vtoc_set_extent (extent_t * ext, u_int8_t typeind, u_int8_t seqno,
00216                       cchh_t * lower, cchh_t * upper);
00217 void vtoc_set_cchh (cchh_t * addr, u_int16_t cc, u_int16_t hh);
00218 void vtoc_set_cchhb (cchhb_t * addr, u_int16_t cc, u_int16_t hh, u_int8_t b);
00219 void vtoc_set_date (labeldate_t * d, u_int8_t year, u_int16_t day);
00220 
00221 void vtoc_volume_label_init (volume_label_t *vlabel);
00222 
00223 int vtoc_read_volume_label (int fd, unsigned long vlabel_start,
00224                             volume_label_t * vlabel);
00225 
00226 int vtoc_write_volume_label (int fd, unsigned long vlabel_start,
00227                              volume_label_t *vlabel);
00228 
00229 void vtoc_volume_label_set_volser (volume_label_t *vlabel, char *volser);
00230 
00231 char *vtoc_volume_label_get_volser (volume_label_t *vlabel, char *volser);
00232 
00233 void vtoc_volume_label_set_key (volume_label_t *vlabel, char *key);     
00234 
00235 void vtoc_volume_label_set_label (volume_label_t *vlabel, char *lbl);
00236 
00237 char *vtoc_volume_label_get_label (volume_label_t *vlabel, char *lbl);
00238 
00239 void vtoc_read_label (int fd, unsigned long position, format1_label_t *f1,
00240                       format4_label_t *f4, format5_label_t *f5,
00241                       format7_label_t *f7);
00242 
00243 void vtoc_write_label (int fd, unsigned long position, format1_label_t *f1,
00244                        format4_label_t *f4, format5_label_t *f5,
00245                        format7_label_t *f7);
00246 
00247 void vtoc_init_format1_label (char *volid, unsigned int blksize,
00248                               extent_t *part_extent, format1_label_t *f1);
00249 
00250 void vtoc_init_format4_label (format4_label_t *f4lbl,
00251                               unsigned int usable_partitions,
00252                               unsigned int cylinders,
00253                               unsigned int tracks,
00254                               unsigned int blocks,
00255                               unsigned int blksize,
00256                               u_int16_t dev_type);
00257 
00258 void vtoc_update_format4_label (format4_label_t *f4, cchhb_t *highest_f1,
00259                                 u_int16_t unused_update);
00260 
00261 void vtoc_init_format5_label (format5_label_t *f5);
00262 
00263 void vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl,
00264                                     int trk, u_int16_t a, u_int16_t b,
00265                                     u_int8_t c);
00266  
00267 void vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl,
00268                                     int trk, u_int16_t a, u_int16_t b, 
00269                                     u_int8_t c);
00270 
00271 void vtoc_init_format7_label (format7_label_t *f7);
00272 
00273 void vtoc_update_format7_label_add (format7_label_t *f7, int verbose,
00274                                     u_int32_t a, u_int32_t b);
00275 
00276 void vtoc_update_format7_label_del (format7_label_t *f7, int verbose,
00277                                     u_int32_t a, u_int32_t b);
00278 
00279 void vtoc_set_freespace(format4_label_t *f4, format5_label_t *f5,
00280                         format7_label_t *f7, char ch, int verbose,
00281                         u_int32_t start, u_int32_t stop, int cyl, int trk);
00282 
00283 #endif /* VTOC_H */

Generated on Fri May 4 05:15:31 2007 for libparted by  doxygen 1.5.2