Package: parted
Version: 3.2-18
Severity: wishlist
Tags: patch
User: ubuntu-de...@lists.ubuntu.com
Usertags: origin-ubuntu bionic ubuntu-patch

In Ubuntu, the attached patch was applied to achieve the following:

  * Merge latest fdasd / vtoc code (LP: #1737144), taken from upstream git:
    - libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
    - libparted-dasd-update-and-improve-fdasd-functions.patch
    - libparted-dasd-add-new-fdasd-functions.patch
    - libparted-dasd-add-test-cases-for-the-new-fdasd-func.patch

This updates the dasd code with newer code from s390-utils which probably
fixes some bugs some people are worried about. openSUSE also ships them.

-- System Information:
Debian Release: buster/sid
  APT prefers bionic
  APT policy: (500, 'bionic'), (100, 'bionic-proposed')
Architecture: amd64 (x86_64)

Kernel: Linux 4.14.0-16-generic (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), 
LANGUAGE=en_US:en (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

-- 
debian developer - deb.li/jak | jak-linux.org - free software dev
ubuntu core developer                              i speak de, en
diff -Nru 
parted-3.2/debian/patches/libparted-dasd-add-new-fdasd-functions.patch 
parted-3.2/debian/patches/libparted-dasd-add-new-fdasd-functions.patch
--- parted-3.2/debian/patches/libparted-dasd-add-new-fdasd-functions.patch      
1970-01-01 01:00:00.000000000 +0100
+++ parted-3.2/debian/patches/libparted-dasd-add-new-fdasd-functions.patch      
2018-01-12 10:33:02.000000000 +0100
@@ -0,0 +1,171 @@
+From b9e12819ecef30087753b967bebc9809120593a6 Mon Sep 17 00:00:00 2001
+From: Wang Dong <dongd...@linux.vnet.ibm.com>
+Date: Wed, 26 Oct 2016 04:22:48 +0200
+Subject: [PATCH 3/4] libparted/dasd: add new fdasd functions
+
+Introduce a set of new functions from the fdasd utility of the s390-tools
+to keep the code base in parted and s390-tools in sync.
+
+These new functions are:
+  fdasd_check_volser():  validate the volser input
+  fdasd_get_volser():    get volume serial (volser)
+  fdasd_change_volser(): change volser with string
+  fdasd_reuse_vtoc():    re-create vtoc labels based on the existing vtoc
+
+Signed-off-by: Wang Dong <dongd...@linux.vnet.ibm.com>
+Signed-off-by: Hendrik Brueckner <brueck...@linux.vnet.ibm.com>
+Signed-off-by: Brian C. Lane <b...@redhat.com>
+---
+ include/parted/fdasd.in.h |   4 ++
+ libparted/labels/fdasd.c  | 123 ++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 127 insertions(+)
+
+diff --git a/include/parted/fdasd.in.h b/include/parted/fdasd.in.h
+index 09a35a0..9e5d7d1 100644
+--- a/include/parted/fdasd.in.h
++++ b/include/parted/fdasd.in.h
+@@ -293,5 +293,9 @@ void fdasd_recreate_vtoc(fdasd_anchor_t *anc);
+ partition_info_t * fdasd_add_partition (fdasd_anchor_t *anc,
+                                         unsigned int start, unsigned int 
stop);
+ int fdasd_prepare_labels (fdasd_anchor_t *anc, int fd) ;
++void fdasd_check_volser(char *volser, int devno);
++int fdasd_get_volser(fdasd_anchor_t *anc, char *volser, int fd);
++void fdasd_change_volser(fdasd_anchor_t *anc, char *str);
++void fdasd_reuse_vtoc(fdasd_anchor_t *anc);
+ 
+ #endif /* FDASD_H */
+diff --git a/libparted/labels/fdasd.c b/libparted/labels/fdasd.c
+index e5df5cf..713ed6b 100644
+--- a/libparted/labels/fdasd.c
++++ b/libparted/labels/fdasd.c
+@@ -1320,4 +1320,127 @@ fdasd_add_partition (fdasd_anchor_t *anc, unsigned int 
start,
+       return p;
+ }
+ 
++/*
++ * Check for valid volume serial characters (max. 6) - remove invalid.
++ * If volser is empty, fill with default volser.
++ */
++void fdasd_check_volser (char *volser, int devno)
++{
++      int from, to;
++
++      for (from = 0, to = 0; volser[from] && from < VOLSER_LENGTH; from++) {
++
++                      if ((volser[from] >= 0x23 &&
++                           volser[from] <= 0x25) ||
++                          (volser[from] >= 0x30 &&
++                           volser[from] <= 0x39) ||
++                          (volser[from] >= 0x40 &&
++                           volser[from] <= 0x5a) ||
++                          (volser[from] >= 0x61 &&
++                           volser[from] <= 0x7a))
++                              volser[to++] = toupper(volser[from]);
++      }
++
++      volser[to] = 0x00;
++
++      if (volser[0] == 0x00)
++              sprintf(volser, "0X%04x", devno);
++}
++
++/*
++ * get volser from vtoc
++ */
++int fdasd_get_volser (fdasd_anchor_t *anc, char *volser, int fd)
++{
++      volume_label_t vlabel;
++
++      vtoc_read_volume_label(fd, anc->label_pos, &vlabel);
++      vtoc_volume_label_get_volser(&vlabel, volser);
++      return 0;
++}
++
++/* Changes the volume serial (menu option)
++ *
++ */
++void fdasd_change_volser (fdasd_anchor_t *anc, char *str)
++{
++      fdasd_check_volser(str, anc->devno);
++      vtoc_volume_label_set_volser(anc->vlabel, str);
++
++      vtoc_set_cchhb(&anc->vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01);
++      anc->vlabel_changed++;
++      anc->vtoc_changed++;
++}
++
++/*
++ * re-create all VTOC labels, but use the partition information
++ * from existing VTOC
++ */
++void fdasd_reuse_vtoc (fdasd_anchor_t *anc)
++{
++      partition_info_t *part_info = anc->first;
++      struct fdasd_hd_geometry geo = anc->geo;
++      format1_label_t f1;
++      format4_label_t f4;
++      format5_label_t f5;
++      format7_label_t f7;
++
++      vtoc_init_format4_label(&f4, geo.cylinders, anc->formatted_cylinders,
++                              geo.heads, geo.sectors,
++                              anc->blksize, anc->dev_type);
++
++      /* reuse some FMT4 values */
++      f4.DS4HPCHR = anc->f4->DS4HPCHR;
++      f4.DS4DSREC = anc->f4->DS4DSREC;
++
++      /* re-initialize both free-space labels */
++      vtoc_init_format5_label(&f5);
++      vtoc_init_format7_label(&f7);
++
++      if (anc->fspace_trk > 0)
++              vtoc_set_freespace(&f4, &f5, &f7, '+', anc->verbose,
++                                 FIRST_USABLE_TRK,
++                                 FIRST_USABLE_TRK + anc->fspace_trk - 1,
++                                 anc->formatted_cylinders, geo.heads);
++
++      while (part_info != NULL) {
++              if (part_info->used != 0x01) {
++                      part_info = part_info->next;
++                      continue;
++              }
++
++              if (anc->formatted_cylinders > LV_COMPAT_CYL)
++                      vtoc_init_format8_label(anc->blksize,
++                                              &part_info->f1->DS1EXT1, &f1);
++              else
++                      vtoc_init_format1_label(anc->blksize,
++                                              &part_info->f1->DS1EXT1, &f1);
++
++
++              strncpy(f1.DS1DSNAM, part_info->f1->DS1DSNAM, 44);
++              strncpy((char *)f1.DS1DSSN, (char *)part_info->f1->DS1DSSN, 6);
++              f1.DS1CREDT = part_info->f1->DS1CREDT;
++
++              memcpy(part_info->f1, &f1, sizeof(format1_label_t));
++
++              if (part_info->fspace_trk > 0)
++                      vtoc_set_freespace(&f4, &f5, &f7, '+', anc->verbose,
++                                         part_info->end_trk + 1,
++                                         part_info->end_trk +
++                                         part_info->fspace_trk,
++                                         anc->formatted_cylinders, geo.heads);
++
++              part_info = part_info->next;
++      }
++
++      /* over-write old labels with new ones */
++      memcpy(anc->f4, &f4, sizeof(format4_label_t));
++      memcpy(anc->f5, &f5, sizeof(format5_label_t));
++      memcpy(anc->f7, &f7, sizeof(format7_label_t));
++
++      anc->vtoc_changed++;
++
++      return;
++}
++
+ /* vim:set tabstop=4 shiftwidth=4 softtabstop=4: */
+-- 
+2.15.1
+
diff -Nru 
parted-3.2/debian/patches/libparted-dasd-add-test-cases-for-the-new-fdasd-func.patch
 
parted-3.2/debian/patches/libparted-dasd-add-test-cases-for-the-new-fdasd-func.patch
--- 
parted-3.2/debian/patches/libparted-dasd-add-test-cases-for-the-new-fdasd-func.patch
        1970-01-01 01:00:00.000000000 +0100
+++ 
parted-3.2/debian/patches/libparted-dasd-add-test-cases-for-the-new-fdasd-func.patch
        2018-01-12 10:33:02.000000000 +0100
@@ -0,0 +1,43 @@
+From 571e078406b59e8dcf02db3e8fe28d8eb4d2cef0 Mon Sep 17 00:00:00 2001
+From: Wang Dong <dongd...@linux.vnet.ibm.com>
+Date: Wed, 26 Oct 2016 04:22:49 +0200
+Subject: [PATCH 4/4] libparted/dasd: add test cases for the new fdasd
+ functions
+
+The test case uses a temporary file in libparted/tests under
+Check framwork. It can be issued by "make check" in the test dir.
+
+Signed-off-by: Wang Dong <dongd...@linux.vnet.ibm.com>
+Signed-off-by: Hendrik Brueckner <brueck...@linux.vnet.ibm.com>
+Signed-off-by: Brian C. Lane <b...@redhat.com>
+---
+ libparted/tests/Makefile.am | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/libparted/tests/Makefile.am b/libparted/tests/Makefile.am
+index c7c10a9..9689fb3 100644
+--- a/libparted/tests/Makefile.am
++++ b/libparted/tests/Makefile.am
+@@ -3,9 +3,9 @@
+ #
+ # This file may be modified and/or distributed without restriction.
+ 
+-TESTS = t1000-label.sh t2000-disk.sh t2100-zerolen.sh t3000-symlink.sh
++TESTS = t1000-label.sh t2000-disk.sh t2100-zerolen.sh t3000-symlink.sh 
t4000-volser.sh
+ EXTRA_DIST = $(TESTS)
+-check_PROGRAMS = label disk zerolen symlink
++check_PROGRAMS = label disk zerolen symlink volser
+ AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS)
+ 
+ LDADD = \
+@@ -23,6 +23,7 @@ label_SOURCES = common.h common.c label.c
+ disk_SOURCES  = common.h common.c disk.c
+ zerolen_SOURCES = common.h common.c zerolen.c
+ symlink_SOURCES = common.h common.c symlink.c
++volser_SOURCES = common.h common.c volser.c
+ 
+ # Arrange to symlink to tests/init.sh.
+ CLEANFILES = init.sh
+-- 
+2.15.1
+
diff -Nru 
parted-3.2/debian/patches/libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch 
parted-3.2/debian/patches/libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
--- 
parted-3.2/debian/patches/libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch  
    1970-01-01 01:00:00.000000000 +0100
+++ 
parted-3.2/debian/patches/libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch  
    2018-01-12 10:33:02.000000000 +0100
@@ -0,0 +1,272 @@
+From 4f25d54d4d2bd6ae12d56b5a97ed2b7f60f753e9 Mon Sep 17 00:00:00 2001
+From: Wang Dong <dongd...@linux.vnet.ibm.com>
+Date: Wed, 26 Oct 2016 04:22:46 +0200
+Subject: [PATCH 1/4] 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 <dongd...@linux.vnet.ibm.com>
+Signed-off-by: Hendrik Brueckner <brueck...@linux.vnet.ibm.com>
+Signed-off-by: Brian C. Lane <b...@redhat.com>
+---
+ 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.15.1
+
diff -Nru 
parted-3.2/debian/patches/libparted-dasd-update-and-improve-fdasd-functions.patch
 
parted-3.2/debian/patches/libparted-dasd-update-and-improve-fdasd-functions.patch
--- 
parted-3.2/debian/patches/libparted-dasd-update-and-improve-fdasd-functions.patch
   1970-01-01 01:00:00.000000000 +0100
+++ 
parted-3.2/debian/patches/libparted-dasd-update-and-improve-fdasd-functions.patch
   2018-01-12 10:33:02.000000000 +0100
@@ -0,0 +1,208 @@
+From db37c8c017ebef8f241420dda071940957d4bbe5 Mon Sep 17 00:00:00 2001
+From: Wang Dong <dongd...@linux.vnet.ibm.com>
+Date: Wed, 26 Oct 2016 04:22:47 +0200
+Subject: [PATCH 2/4] libparted/dasd: update and improve fdasd functions
+
+Update the fdasd_anchor_t data structure and the fdasd_cleanup()
+function. Also correct vtoc_changed and vlabel_changed accounting
+because they are important to rewrite vtoc to save the changes.
+
+Wang Dong <dongd...@linux.vnet.ibm.com>
+Hendrik Brueckner <brueck...@linux.vnet.ibm.com>
+
+Signed-off-by: Brian C. Lane <b...@redhat.com>
+---
+ include/parted/fdasd.in.h | 14 +++++-------
+ libparted/labels/fdasd.c  | 56 ++++++++++++++++++++++++-----------------------
+ 2 files changed, 35 insertions(+), 35 deletions(-)
+
+diff --git a/include/parted/fdasd.in.h b/include/parted/fdasd.in.h
+index 4e351c4..09a35a0 100644
+--- a/include/parted/fdasd.in.h
++++ b/include/parted/fdasd.in.h
+@@ -186,6 +186,7 @@ typedef struct format_data_t {
+ /*****************************************************************************
+  * SECTION: Further IOCTL Definitions  (see fs.h)                            *
+  
*****************************************************************************/
++#define BLKROGET   _IO(0x12,94) /* get read-only status (0 = read_write) */
+ /* re-read partition table */
+ #define BLKRRPART  _IO(0x12,95)
+ /* get block device sector size */
+@@ -198,15 +199,14 @@ typedef struct format_data_t {
+ /*****************************************************************************
+  * SECTION: FDASD internal types                                             *
+  
*****************************************************************************/
++#define PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
++#define USABLE_PARTITIONS ((1 << DASD_PARTN_BITS) - 1)
+ 
+ #define DASD_MIN_API_VERSION 0
+ 
+ #define DEFAULT_FDASD_CONF "/etc/fdasd.conf" /* default config file */
+ 
+-#define PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
+-#define USABLE_PARTITIONS ((1 << DASD_PARTN_BITS) - 1)
+-
+-#define FDASD_VERSION "1.05"
++#define FDASD_VERSION "1.32.0"
+ #define DEVICE "device"
+ #define DISC   "disc"
+ #define PART   "part"
+@@ -233,9 +233,6 @@ typedef struct config_data {
+ typedef struct fdasd_anchor {
+       int vlabel_changed;
+       int vtoc_changed;
+-      int devname_specified;
+-      int volid_specified;
+-      int config_specified;
+       int auto_partition;
+       int print_table;
+       int big_disk;
+@@ -282,7 +279,8 @@ enum fdasd_failure {
+       vlabel_corrupted,
+       dsname_corrupted,
+       malloc_failed,
+-      device_verification_failed
++      device_verification_failed,
++      volser_not_found
+ };
+ 
+ void fdasd_cleanup (fdasd_anchor_t *anchor);
+diff --git a/libparted/labels/fdasd.c b/libparted/labels/fdasd.c
+index 968b332..e5df5cf 100644
+--- a/libparted/labels/fdasd.c
++++ b/libparted/labels/fdasd.c
+@@ -106,28 +106,26 @@ fdasd_cleanup (fdasd_anchor_t *anchor)
+ {
+       PDEBUG
+       int i;
+-      partition_info_t *p, *q;
++      partition_info_t *part_info, *next;
+ 
+       if (anchor == NULL)
+               return;
+ 
+-        free(anchor->f4);
+-        free(anchor->f5);
+-        free(anchor->f7);
+-        free(anchor->f9);
+-        free(anchor->vlabel);
+-
+-      p = anchor->first;
+-      if (p == NULL)
+-              return;
+-
+-      for (i=1; i <= USABLE_PARTITIONS; i++) {
+-              if (p == NULL)
+-                      return;
+-              q = p->next;
+-              free(p->f1);
+-              free(p);
+-              p = q;
++      if (anchor->f4 != NULL)
++              free(anchor->f4);
++      if (anchor->f5 != NULL)
++              free(anchor->f5);
++      if (anchor->f7 != NULL)
++              free(anchor->f7);
++      if (anchor->vlabel != NULL)
++              free(anchor->vlabel);
++
++      part_info = anchor->first;
++      for (i = 1; i <= USABLE_PARTITIONS && part_info != NULL; i++) {
++              next = part_info->next;
++              free(part_info->f1);
++              free(part_info);
++              part_info = next;
+       }
+ }
+ 
+@@ -190,6 +188,9 @@ fdasd_error (fdasd_anchor_t *anc, enum fdasd_failure why, 
char const *str)
+                               _("Device verification failed"),
+                               _("The specified device is not a valid DASD 
device"));
+                       break;
++              case volser_not_found:
++                      sprintf(error, "fdasd: %s -- %s\n", _("VOLSER not found 
on device"), str);
++                      break;
+               default:
+                       sprintf(error, "fdasd: %s: %s\n", _("Fatal error"), 
str);
+       }
+@@ -287,7 +288,7 @@ fdasd_write_vtoc_labels (fdasd_anchor_t * anc, int fd)
+       PDEBUG
+       partition_info_t *p;
+       unsigned long b, maxblk;
+-      char dsno[6], s1[7], s2[45], *c1, *c2, *ch;
++      char dsno[6], s1[VOLSER_LENGTH + 1], s2[45], *c1, *c2, *ch;
+       int i = 0, k = 0;
+       cchhb_t f9addr;
+       format1_label_t emptyf1;
+@@ -519,7 +520,6 @@ fdasd_recreate_vtoc (fdasd_anchor_t *anc)
+       int i;
+ 
+       vtoc_init_format4_label(anc->f4,
+-                                                      USABLE_PARTITIONS,
+                                                       anc->geo.cylinders,
+                                               anc->formatted_cylinders,
+                                                       anc->geo.heads,
+@@ -767,7 +767,7 @@ fdasd_invalid_vtoc_pointer(fdasd_anchor_t *anc)
+       anc->formatted_cylinders = anc->hw_cylinders;
+       anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads
+                       - FIRST_USABLE_TRK;
+-      vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
++      vtoc_init_format4_label(anc->f4,
+                       anc->geo.cylinders, anc->formatted_cylinders,
+                       anc->geo.heads, anc->geo.sectors,
+                       anc->blksize, anc->dev_type);
+@@ -781,6 +781,8 @@ fdasd_invalid_vtoc_pointer(fdasd_anchor_t *anc)
+                       anc->formatted_cylinders, anc->geo.heads);
+ 
+       vtoc_set_cchhb(&anc->vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01);
++      anc->vtoc_changed++;
++      anc->vlabel_changed++;
+ }
+ 
+ /*
+@@ -792,7 +794,7 @@ fdasd_process_invalid_vtoc(fdasd_anchor_t *anc)
+       anc->formatted_cylinders = anc->hw_cylinders;
+       anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads
+                       - FIRST_USABLE_TRK;
+-      vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
++      vtoc_init_format4_label(anc->f4,
+                       anc->geo.cylinders, anc->formatted_cylinders,
+                       anc->geo.heads, anc->geo.sectors,
+                       anc->blksize, anc->dev_type);
+@@ -803,6 +805,8 @@ fdasd_process_invalid_vtoc(fdasd_anchor_t *anc)
+                       FIRST_USABLE_TRK,
+                       anc->formatted_cylinders * anc->geo.heads - 1,
+                       anc->formatted_cylinders, anc->geo.heads);
++
++      anc->vtoc_changed++;
+ }
+ 
+ 
+@@ -875,7 +879,7 @@ fdasd_check_volume (fdasd_anchor_t *anc, int fd)
+ 
+               fdasd_init_volume_label(anc, fd);
+ 
+-              vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS,
++              vtoc_init_format4_label(anc->f4,
+                               anc->geo.cylinders, anc->formatted_cylinders,
+                               anc->geo.heads, anc->geo.sectors,
+                               anc->blksize, anc->dev_type);
+@@ -1286,12 +1290,10 @@ fdasd_add_partition (fdasd_anchor_t *anc, unsigned int 
start,
+               return 0;
+ 
+       if (anc->formatted_cylinders > LV_COMPAT_CYL) {
+-              vtoc_init_format8_label(anc->vlabel->volid, anc->blksize, &ext,
+-                                      p->f1);
++              vtoc_init_format8_label(anc->blksize, &ext, p->f1);
+       } else {
+               PDEBUG;
+-              vtoc_init_format1_label(anc->vlabel->volid, anc->blksize, &ext,
+-                                      p->f1);
++              vtoc_init_format1_label(anc->blksize, &ext, p->f1);
+       }
+ 
+       PDEBUG;
+-- 
+2.15.1
+
diff -Nru parted-3.2/debian/patches/series parted-3.2/debian/patches/series
--- parted-3.2/debian/patches/series    2017-10-11 14:02:37.000000000 +0200
+++ parted-3.2/debian/patches/series    2018-01-12 10:36:21.000000000 +0100
@@ -20,3 +20,7 @@
 fdasd-check-geometry.patch
 tests-move-get-sector-size.patch
 atari.patch
+libparted-dasd-unify-vtoc-handling-for-cdl-ldl.patch
+libparted-dasd-update-and-improve-fdasd-functions.patch
+libparted-dasd-add-new-fdasd-functions.patch
+libparted-dasd-add-test-cases-for-the-new-fdasd-func.patch

Reply via email to