From ebb6eef20792a17388da30f1c312ede4b03140fd Mon Sep 17 00:00:00 2001 From: Wang Dong Date: Wed, 26 Oct 2016 04:22:46 +0200 Subject: [PATCH 58/75] libparted/dasd: unify vtoc handling for cdl/ldl Merge volume label cdl and ldl. It is convenient to manipulate the same structure. Also remove unused arguments in the functions. Signed-off-by: Wang Dong Signed-off-by: Hendrik Brueckner Signed-off-by: Brian C. Lane --- include/parted/vtoc.in.h | 34 +++++++++++++++++++--------------- libparted/labels/dasd.c | 8 +++----- libparted/labels/vtoc.c | 38 +++++++++++++++++--------------------- 3 files changed, 39 insertions(+), 41 deletions(-) diff --git a/include/parted/vtoc.in.h b/include/parted/vtoc.in.h index 499c2d3..b9da23a 100644 --- a/include/parted/vtoc.in.h +++ b/include/parted/vtoc.in.h @@ -62,7 +62,6 @@ typedef struct cchh cchh_t; typedef struct labeldate labeldate_t; typedef struct volume_label volume_label_t; typedef struct cms_volume_label cms_volume_label_t; -typedef struct ldl_volume_label ldl_volume_label_t; typedef struct extent extent_t; typedef struct dev_const dev_const_t; typedef struct format1_label format1_label_t; @@ -94,6 +93,19 @@ struct __attribute__ ((packed)) labeldate { u_int16_t day; }; +/* + * The following structure is a merger of the cdl and ldl volume label. + * On an ldl disk there is no key information, so when reading an + * ldl label from disk, the data should be copied at the address of vollbl. + * On the other side, the field ldl_version is reserved in a cdl record + * and the field formatted_blocks exists only for ldl labels. So when + * reading a cdl label from disk, the formatted_blocks field will contain + * arbitrary data. + * This layout may be a bit awkward, but the advantage of having the + * same label type for both disk layout types is bigger than the effort + * for taking a bit of extra care at the fringes. + */ + struct __attribute__ ((packed)) volume_label { char volkey[4]; /* volume key = volume label */ char vollbl[4]; /* volume label ("VOL1" in EBCDIC) */ @@ -107,15 +119,8 @@ struct __attribute__ ((packed)) volume_label { char labperci[4]; /* no of labels per CI (FBA), blanks for CKD */ char res2[4]; /* reserved */ char lvtoc[14]; /* owner code for LVTOC */ - char res3[29]; /* reserved */ - char fudge[4]; /* filler to match length of ldl label */ -}; - -struct __attribute__ ((packed)) ldl_volume_label { - char vollbl[4]; /* Label identifier ("LNX1" in EBCDIC) */ - char volid[6]; /* Volume identifier */ - char res3[69]; /* Reserved field */ - char ldl_version[1]; /* Version number, valid for ldl format */ + char res3[28]; /* reserved */ + char ldl_version; /* version number, valid for ldl format */ u_int64_t formatted_blocks; /* valid when ldl_version >= "2" (in EBCDIC) */ }; @@ -335,11 +340,10 @@ void vtoc_write_label (int fd, unsigned long position, format7_label_t const *f7, format9_label_t const *f9); -void vtoc_init_format1_label (char *volid, unsigned int blksize, +void vtoc_init_format1_label (unsigned int blksize, extent_t *part_extent, format1_label_t *f1); void vtoc_init_format4_label (format4_label_t *f4lbl, - unsigned int usable_partitions, unsigned int compat_cylinders, unsigned int real_cylinders, unsigned int tracks, @@ -352,11 +356,11 @@ void vtoc_update_format4_label (format4_label_t *f4, cchhb_t *highest_f1, void vtoc_init_format5_label (format5_label_t *f5); -void vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl, +void vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int trk, u_int16_t a, u_int16_t b, u_int8_t c); -void vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl, +void vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int trk, u_int16_t a, u_int16_t b, u_int8_t c); @@ -368,7 +372,7 @@ void vtoc_update_format7_label_add (format7_label_t *f7, int verbose, void vtoc_update_format7_label_del (format7_label_t *f7, int verbose, u_int32_t a, u_int32_t b); -void vtoc_init_format8_label (char *volid, unsigned int blksize, +void vtoc_init_format8_label (unsigned int blksize, extent_t *part_extent, format1_label_t *f1); void vtoc_update_format8_label (cchhb_t *associated_f9, format1_label_t *f8); diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c index 4e68512..7594e96 100644 --- a/libparted/labels/dasd.c +++ b/libparted/labels/dasd.c @@ -330,13 +330,12 @@ dasd_read (PedDisk* disk) DasdPartitionData* dasd_data; union vollabel { - volume_label_t unused; - ldl_volume_label_t ldl; + volume_label_t ldl; cms_volume_label_t cms; }; union vollabel *cms_ptr1 = (union vollabel *) anchor.vlabel; cms_volume_label_t *cms_ptr = &cms_ptr1->cms; - ldl_volume_label_t *ldl_ptr = &cms_ptr1->ldl; + volume_label_t *ldl_ptr = &cms_ptr1->ldl; int partition_start_block; disk_specific->format_type = 1; @@ -360,8 +359,7 @@ dasd_read (PedDisk* disk) * (long long) cms_ptr->disk_offset; if (is_ldl) - if (strncmp(ldl_ptr->ldl_version, - vtoc_ebcdic_enc("2", str, 1), 1) >= 0) + if (ldl_ptr->ldl_version >= 0xf2) end = (long long) arch_specific->real_sector_size / (long long) disk->dev->sector_size * (long long) ldl_ptr->formatted_blocks - 1; diff --git a/libparted/labels/vtoc.c b/libparted/labels/vtoc.c index fdfa94f..d47b791 100644 --- a/libparted/labels/vtoc.c +++ b/libparted/labels/vtoc.c @@ -150,7 +150,7 @@ enum failure { unable_to_read }; -static char buffer[89]; +static char buffer[93]; static void vtoc_error (enum failure why, char const *s1, char const *s2) @@ -329,7 +329,7 @@ void vtoc_volume_label_init (volume_label_t *vlabel) { PDEBUG - sprintf(buffer, "%88s", " "); + sprintf(buffer, "%92s", " "); vtoc_ebcdic_enc(buffer, buffer, sizeof *vlabel); memcpy(vlabel, buffer, sizeof *vlabel); } @@ -348,8 +348,8 @@ vtoc_read_volume_label (int f, unsigned long vlabel_start, typedef union vollabel vollabel_t; union __attribute__((packed)) vollabel { + /* cdl and ldl have the same data struct */ volume_label_t cdl; - ldl_volume_label_t ldl; cms_volume_label_t cms; }; @@ -373,9 +373,7 @@ vtoc_read_volume_label (int f, unsigned long vlabel_start, } rc = read(f, vlabel, sizeof(volume_label_t)); - if (rc != sizeof(volume_label_t) && - /* For CDL we ask to read 88 bytes, but only get 84 */ - rc != sizeof(volume_label_t) - 4) { + if (rc != sizeof(volume_label_t)) { vtoc_error(unable_to_read, "vtoc_read_volume_label", _("Could not read volume label.")); return 1; @@ -427,10 +425,8 @@ vtoc_write_volume_label (int f, unsigned long vlabel_start, vtoc_error(unable_to_seek, "vtoc_write_volume_label", _("Could not write volume label.")); - rc = write(f, vlabel, sizeof(volume_label_t) - 4); - /* Subtract 4 to leave off the "fudge" variable when writing. - We only write CDL volume labels, never LDL or CMS. */ - if (rc != sizeof(volume_label_t) - 4) + rc = write(f, vlabel, sizeof(volume_label_t)); + if (rc != sizeof(volume_label_t)) vtoc_error(unable_to_write, "vtoc_write_volume_label", _("Could not write volume label.")); @@ -632,7 +628,7 @@ vtoc_write_label (int f, unsigned long position, * initializes a format4 label */ void -vtoc_init_format4_label (format4_label_t *f4, unsigned int usable_partitions, +vtoc_init_format4_label (format4_label_t *f4, unsigned int compat_cylinders, unsigned int real_cylinders, unsigned int tracks, unsigned int blocks, unsigned int blksize, @@ -740,7 +736,7 @@ vtoc_init_format7_label (format7_label_t *f7) * format1 or format 8 label, all but the field DS1FMTID */ void -vtoc_init_format_1_8_label (char *volid, unsigned int blksize, +vtoc_init_format_1_8_label (unsigned int blksize, extent_t *part_extent, format1_label_t *f1) { PDEBUG @@ -794,18 +790,18 @@ vtoc_init_format_1_8_label (char *volid, unsigned int blksize, } void -vtoc_init_format1_label (char *volid, unsigned int blksize, +vtoc_init_format1_label (unsigned int blksize, extent_t *part_extent, format1_label_t *f1) { - vtoc_init_format_1_8_label(volid, blksize, part_extent, f1); + vtoc_init_format_1_8_label(blksize, part_extent, f1); f1->DS1FMTID = 0xf1; } void -vtoc_init_format8_label (char *volid, unsigned int blksize, +vtoc_init_format8_label (unsigned int blksize, extent_t *part_extent, format1_label_t *f8) { - vtoc_init_format_1_8_label(volid, blksize, part_extent, f8); + vtoc_init_format_1_8_label(blksize, part_extent, f8); f8->DS1FMTID = 0xf8; } @@ -886,7 +882,7 @@ vtoc_reorganize_FMT5_extents (format5_label_t *f5) * add a free space extent description to the VTOC FMT5 DSCB */ void -vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl, +vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int trk, u_int16_t a, u_int16_t b, u_int8_t c) { PDEBUG @@ -974,7 +970,7 @@ vtoc_update_format5_label_add (format5_label_t *f5, int verbose, int cyl, * remove a free space extent description from the VTOC FMT5 DSCB */ void -vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl, +vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int trk, u_int16_t a, u_int16_t b, u_int8_t c) { PDEBUG @@ -1054,7 +1050,7 @@ vtoc_update_format5_label_del (format5_label_t *f5, int verbose, int cyl, ext->ft = (a - ext->t) % trk; vtoc_update_format5_label_add(f5, verbose, - cyl, trk, x, y, z); + trk, x, y, z); if (verbose) puts ("FMT5 del extent: 2 pieces"); @@ -1322,9 +1318,9 @@ vtoc_set_freespace(format4_label_t *f4, format5_label_t *f5, z = (u_int8_t) ((stop - start + 1) % trk); if (ch == '+') - vtoc_update_format5_label_add(f5, verbose, cyl, trk, x, y, z); + vtoc_update_format5_label_add(f5, verbose, trk, x, y, z); else if (ch == '-') - vtoc_update_format5_label_del(f5, verbose, cyl, trk, x, y, z); + vtoc_update_format5_label_del(f5, verbose, trk, x, y, z); else puts ("BUG: syntax error in vtoc_set_freespace call"); -- 2.9.3