[Parted-commits] GNU Parted Official Repository: Changes to 'master'

Jim Meyering meyering at alioth.debian.org
Thu Nov 12 14:39:22 UTC 2009


 NEWS                     |   18 ++++++++++++++++++
 include/parted/vtoc.h    |   34 +++++++++++++++++-----------------
 libparted/arch/linux.c   |   16 +++++++++++-----
 libparted/arch/linux.h   |    1 +
 libparted/labels/dasd.c  |   20 ++++++++++++++++----
 libparted/labels/fdasd.c |    2 +-
 libparted/labels/vtoc.c  |   29 ++++++++++++++---------------
 7 files changed, 78 insertions(+), 42 deletions(-)

New commits:
commit a654f9c93f0dd5339d4afe50f5822d3e2b239ff7
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Tue Nov 10 09:26:15 2009 +0100

    NEWS: mention recent changes

diff --git a/NEWS b/NEWS
index c8c5724..9c68d7c 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,18 @@ GNU parted NEWS                                    -*- outline -*-
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Improvements
+
+  Add functions to libparted to get minimal and optimal alignment
+  information from devices:
+  ped_device_get_minimal_aligned_constraint()
+  ped_device_get_optimal_aligned_constraint()
+  ped_device_get_minimum_alignment()
+  ped_device_get_optimum_alignment()
+
+  Add ped_disk_get_partition_alignment() function to libparted to get
+  information about alignment enforced by the disk type.
+
 ** Bug fixes
 
   improved >512-byte sector support: for example, printing a table on a
@@ -12,6 +24,12 @@ GNU parted NEWS                                    -*- outline -*-
   were not checked, and we would mistakenly use the AlternateLBA member of a
   known-corrupt primary table.
 
+  improved dasd disk support, in previous versions calling
+  ped_disk_new_fresh() or ped_disk_duplicate() on a dasd type PedDisk
+  would fail.  This is fixed now.
+
+  handle device nodes created by lvm build with udev synchronisation enabled
+  properly.
 
 * Noteworthy changes in release 2.0 (2009-10-06) [beta]
 

commit bbe1e481866da5a1cd6f560309007eb343c62e4a
Author: Jim Meyering <meyering at redhat.com>
Date:   Tue Nov 10 13:32:30 2009 +0100

    maint: more const-correctness fixes

diff --git a/include/parted/vtoc.h b/include/parted/vtoc.h
index 613b706..6b41584 100644
--- a/include/parted/vtoc.h
+++ b/include/parted/vtoc.h
@@ -209,27 +209,27 @@ struct __attribute__ ((packed)) format7_label {
 
 char *vtoc_ebcdic_enc (char const *source, char *target, int l);
 char *vtoc_ebcdic_dec (char const *source, char *target, int l);
-void vtoc_set_extent (extent_t * ext, u_int8_t typeind, u_int8_t seqno,
-                      cchh_t * lower, cchh_t * upper);
-void vtoc_set_cchh (cchh_t * addr, u_int16_t cc, u_int16_t hh);
-void vtoc_set_cchhb (cchhb_t * addr, u_int16_t cc, u_int16_t hh, u_int8_t b);
-void vtoc_set_date (labeldate_t * d, u_int8_t year, u_int16_t day);
+void vtoc_set_extent (extent_t *ext, u_int8_t typeind, u_int8_t seqno,
+                      cchh_t *lower, cchh_t *upper);
+void vtoc_set_cchh (cchh_t *addr, u_int16_t cc, u_int16_t hh);
+void vtoc_set_cchhb (cchhb_t *addr, u_int16_t cc, u_int16_t hh, u_int8_t b);
+void vtoc_set_date (labeldate_t *d, u_int8_t year, u_int16_t day);
 
 void vtoc_volume_label_init (volume_label_t *vlabel);
 
 int vtoc_read_volume_label (int fd, unsigned long vlabel_start,
-                            volume_label_t * vlabel);
+                            volume_label_t *vlabel);
 
 int vtoc_write_volume_label (int fd, unsigned long vlabel_start,
-                             volume_label_t *vlabel);
+                             volume_label_t const *vlabel);
 
-void vtoc_volume_label_set_volser (volume_label_t *vlabel, char *volser);
+void vtoc_volume_label_set_volser (volume_label_t *vlabel, char const *volser);
 
 char *vtoc_volume_label_get_volser (volume_label_t *vlabel, char *volser);
 
-void vtoc_volume_label_set_key (volume_label_t *vlabel, char *key);
+void vtoc_volume_label_set_key (volume_label_t *vlabel, char const *key);
 
-void vtoc_volume_label_set_label (volume_label_t *vlabel, char *lbl);
+void vtoc_volume_label_set_label (volume_label_t *vlabel, char const *lbl);
 
 char *vtoc_volume_label_get_label (volume_label_t *vlabel, char *lbl);
 
@@ -237,9 +237,11 @@ void vtoc_read_label (int fd, unsigned long position, format1_label_t *f1,
                       format4_label_t *f4, format5_label_t *f5,
                       format7_label_t *f7);
 
-void vtoc_write_label (int fd, unsigned long position, format1_label_t *f1,
-                       format4_label_t *f4, format5_label_t *f5,
-                       format7_label_t *f7);
+void vtoc_write_label (int fd, unsigned long position,
+		       format1_label_t const *f1,
+                       format4_label_t const *f4,
+		       format5_label_t const *f5,
+                       format7_label_t const *f7);
 
 void vtoc_init_format1_label (char *volid, unsigned int blksize,
                               extent_t *part_extent, format1_label_t *f1);
diff --git a/libparted/labels/vtoc.c b/libparted/labels/vtoc.c
index 41fb22a..3742160 100644
--- a/libparted/labels/vtoc.c
+++ b/libparted/labels/vtoc.c
@@ -293,7 +293,7 @@ vtoc_read_volume_label (int f, unsigned long vlabel_start,
  */
 int
 vtoc_write_volume_label (int f, unsigned long vlabel_start,
-                         volume_label_t *vlabel)
+                         volume_label_t const *vlabel)
 {
 	PDEBUG
 	int rc;
@@ -316,7 +316,7 @@ vtoc_write_volume_label (int f, unsigned long vlabel_start,
  * as volume serial to the volume label
  */
 void
-vtoc_volume_label_set_volser (volume_label_t *vlabel, char *volser)
+vtoc_volume_label_set_volser (volume_label_t *vlabel, char const *volser)
 {
 	PDEBUG
 	int j, i = strlen(volser);
@@ -358,7 +358,7 @@ vtoc_volume_label_get_volser (volume_label_t *vlabel, char *volser)
  * it has been translated to EBCDIC
  */
 void
-vtoc_volume_label_set_key (volume_label_t *vlabel, char *key)
+vtoc_volume_label_set_key (volume_label_t *vlabel, char const *key)
 {
 	PDEBUG
 	char s[4];
@@ -374,7 +374,7 @@ vtoc_volume_label_set_key (volume_label_t *vlabel, char *key)
  * after it has been translated to EBCDIC
  */
 void
-vtoc_volume_label_set_label (volume_label_t *vlabel, char *lbl)
+vtoc_volume_label_set_label (volume_label_t *vlabel, char const *lbl)
 {
 	PDEBUG
 	char s[4];
@@ -447,8 +447,11 @@ vtoc_read_label (int f, unsigned long position, format1_label_t *f1,
  * to the specified position
  */
 void
-vtoc_write_label (int f, unsigned long position, format1_label_t *f1,
-                  format4_label_t *f4, format5_label_t *f5, format7_label_t *f7)
+vtoc_write_label (int f, unsigned long position,
+		  format1_label_t const *f1,
+                  format4_label_t const *f4,
+		  format5_label_t const *f5,
+		  format7_label_t const *f7)
 {
 	PDEBUG
 	int t;

commit 91170c1ba20c7c296f7b2dc8d4dadf0587ccd0b0
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Mon Nov 9 18:26:55 2009 +0100

    dasd: fix ped_disk_new_fresh to not read old data from disk
    
    dasd_write(), was reading the volume label from the disk (trough
    fdasd_check_volume()) and later writing it back again, this is fine for
    existing dasd labels, but when creating a fresh label, this would
    also cause the old volume label to be re-used, and if the old label
    was corrupt, it would cause fdasd_check_volume() and thus dasd_write()
    to fail.  Reported here: http://bugzilla.redhat.com/533808
    
    * libparted/arch/linux.c: include fdasd.h.
    (init_dasd): Do BIODASDINFO ioctl, and store the dasd devno in
    arch_specific.
    (init_dasd): Remove dead (never reached) code.
    * libparted/arch/linux.h (struct _LinuxSpecific): Add devno member.
    * libparted/labels/dasd.c (DasdDiskSpecific): add vlabel member.
    (dasd_alloc): Init DasdDiskSpecific.vlabel for fresh disks
    (dasd_read): Store read vlabel in DasdDiskSpecific.vlabel.
    (dasd_write): Write DasdDiskSpecific.vlabel instead of on disk vlabel.

diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index bf050c4..744f854 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -22,6 +22,9 @@
 
 #include <parted/parted.h>
 #include <parted/debug.h>
+#if defined __s390__ || defined __s390x__
+#include <parted/fdasd.h>
+#endif
 
 #include <ctype.h>
 #include <errno.h>
@@ -1103,7 +1106,7 @@ init_dasd (PedDevice* dev, const char* model_name)
 {
         struct stat             dev_stat;
         struct hd_geometry      geo;
-        char *errstr = 0;
+        dasd_information_t dasd_info;
 
         if (!_device_stat (dev, &dev_stat))
                 goto error;
@@ -1139,15 +1142,18 @@ init_dasd (PedDevice* dev, const char* model_name)
                 dev->hw_geom = dev->bios_geom;
         }
 
+        if (!ioctl(arch_specific->fd, BIODASDINFO, &dasd_info)) {
+                arch_specific->devno = dasd_info.devno;
+        } else {
+                arch_specific->devno = arch_specific->major * 256 +
+                                       arch_specific->minor;
+        }
+
         dev->model = strdup (model_name);
 
         ped_device_close (dev);
         return 1;
 
-        ped_exception_throw ( PED_EXCEPTION_ERROR,
-                              PED_EXCEPTION_IGNORE_CANCEL,
-                              errstr );
-
 error_close_dev:
         ped_device_close (dev);
 error:
diff --git a/libparted/arch/linux.h b/libparted/arch/linux.h
index 7036886..dc4e076 100644
--- a/libparted/arch/linux.h
+++ b/libparted/arch/linux.h
@@ -33,6 +33,7 @@ struct _LinuxSpecific {
 	char*	dmtype;         /**< device map target type */
 #if defined __s390__ || defined __s390x__
 	unsigned int real_sector_size;
+	unsigned int devno;
 #endif
 #if USE_BLKID
         blkid_probe probe;
diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c
index 6bf0a06..3f8147d 100644
--- a/libparted/labels/dasd.c
+++ b/libparted/labels/dasd.c
@@ -70,6 +70,7 @@ typedef struct {
 
 typedef struct {
 	unsigned int format_type;
+	volume_label_t vlabel;
 } DasdDiskSpecific;
 
 static int dasd_probe (const PedDevice *dev);
@@ -146,6 +147,7 @@ dasd_alloc (const PedDevice* dev)
 	PedDisk* disk;
 	LinuxSpecific* arch_specific;
 	DasdDiskSpecific *disk_specific;
+	char volser[7];
 
 	PED_ASSERT (dev != NULL, return NULL);
 
@@ -163,6 +165,15 @@ dasd_alloc (const PedDevice* dev)
 	/* CDL format, newer */
 	disk_specific->format_type = 2;
 
+	/* Setup volume label (for fresh disks) */
+	snprintf(volser, sizeof(volser), "0X%04X", arch_specific->devno);
+	vtoc_volume_label_init(&disk_specific->vlabel);
+	vtoc_volume_label_set_key(&disk_specific->vlabel, "VOL1");
+	vtoc_volume_label_set_label(&disk_specific->vlabel, "VOL1");
+	vtoc_volume_label_set_volser(&disk_specific->vlabel, volser);
+	vtoc_set_cchhb(&disk_specific->vlabel.vtoc,
+		       VTOC_START_CC, VTOC_START_HH, 0x01);
+
 	return disk;
 }
 
@@ -296,6 +307,9 @@ dasd_read (PedDisk* disk)
 	if (fdasd_check_volume(&anchor, arch_specific->fd))
 		goto error_close_dev;
 
+	/* Save volume label (read by fdasd_check_volume) for writing */
+	memcpy(&disk_specific->vlabel, anchor.vlabel, sizeof(volume_label_t));
+
 	if ((anchor.geo.cylinders * anchor.geo.heads) > BIG_DISK_SIZE)
 		anchor.big_disk++;
 
@@ -556,10 +570,8 @@ dasd_write (const PedDisk* disk)
 	/* initialize the anchor */
 	fdasd_initialize_anchor(&anchor);
 	fdasd_get_geometry(&anchor, arch_specific->fd);
-
-	/* check dasd for labels and vtoc */
-	if (fdasd_check_volume(&anchor, arch_specific->fd))
-		goto error;
+	memcpy(anchor.vlabel, &disk_specific->vlabel, sizeof(volume_label_t));
+	anchor.vlabel_changed++;
 
 	if ((anchor.geo.cylinders * anchor.geo.heads) > BIG_DISK_SIZE)
 		anchor.big_disk++;

commit 574a13671f8659f5ba4217a1748f6ccd893b2feb
Author: Jim Meyering <meyering at redhat.com>
Date:   Tue Nov 10 13:06:39 2009 +0100

    build: avoid s390-specific compilation failiure
    
    * libparted/labels/vtoc.c (vtoc_volume_label_init): Don't use
    strncpy to copy 84 bytes into a 4-byte field.  Instead, use
    memcpy to copy "sizeof *vlabel" bytes into the "vlabel".

diff --git a/libparted/labels/vtoc.c b/libparted/labels/vtoc.c
index b54dc3f..41fb22a 100644
--- a/libparted/labels/vtoc.c
+++ b/libparted/labels/vtoc.c
@@ -258,8 +258,8 @@ vtoc_volume_label_init (volume_label_t *vlabel)
 {
 	PDEBUG
 	sprintf(buffer, "%84s", " ");
-	vtoc_ebcdic_enc(buffer, buffer, 84);
-	strncpy(vlabel->volkey, buffer, 84);
+	vtoc_ebcdic_enc(buffer, buffer, sizeof *vlabel);
+	memcpy(vlabel, buffer, sizeof *vlabel);
 }
 
 /*

commit bd368af10871344e11bd9fd75554261fde08edf2
Author: Jim Meyering <meyering at redhat.com>
Date:   Tue Nov 10 12:19:26 2009 +0100

    maint: fix s390-specific const correctness problems
    
    * libparted/labels/vtoc.c (vtoc_error, vtoc_ebcdic_enc):
    (vtoc_ebcdic_dec): Declare parameters to be const, as required.
    * libparted/labels/fdasd.c (fdasd_error): Likewise.
    * include/parted/vtoc.h (vtoc_ebcdic_enc, vtoc_ebcdic_enc): Update
    prototypes.

diff --git a/include/parted/vtoc.h b/include/parted/vtoc.h
index 93ee162..613b706 100644
--- a/include/parted/vtoc.h
+++ b/include/parted/vtoc.h
@@ -207,10 +207,8 @@ struct __attribute__ ((packed)) format7_label {
 	cchhb_t DS7PTRDS;       /* pointer to next FMT7 DSCB               */
 };
 
-char * vtoc_ebcdic_enc (char source[LINE_LENGTH], char target[LINE_LENGTH],
-                        int l);
-char * vtoc_ebcdic_dec (char source[LINE_LENGTH], char target[LINE_LENGTH],
-                        int l);
+char *vtoc_ebcdic_enc (char const *source, char *target, int l);
+char *vtoc_ebcdic_dec (char const *source, char *target, int l);
 void vtoc_set_extent (extent_t * ext, u_int8_t typeind, u_int8_t seqno,
                       cchh_t * lower, cchh_t * upper);
 void vtoc_set_cchh (cchh_t * addr, u_int16_t cc, u_int16_t hh);
diff --git a/libparted/labels/fdasd.c b/libparted/labels/fdasd.c
index cb9404e..b116a69 100644
--- a/libparted/labels/fdasd.c
+++ b/libparted/labels/fdasd.c
@@ -87,7 +87,7 @@ fdasd_cleanup (fdasd_anchor_t *anchor)
 }
 
 static void
-fdasd_error (fdasd_anchor_t *anc, enum fdasd_failure why, char * str)
+fdasd_error (fdasd_anchor_t *anc, enum fdasd_failure why, char const *str)
 {
 	PDEBUG
 	char error[2*LINE_LENGTH], *message = error;
diff --git a/libparted/labels/vtoc.c b/libparted/labels/vtoc.c
index 35b26e1..b54dc3f 100644
--- a/libparted/labels/vtoc.c
+++ b/libparted/labels/vtoc.c
@@ -153,7 +153,7 @@ enum failure {
 static char buffer[85];
 
 static void
-vtoc_error (enum failure why, char *s1, char *s2)
+vtoc_error (enum failure why, char const *s1, char const *s2)
 {
 	PDEBUG
 	char error[8192];
@@ -183,9 +183,7 @@ vtoc_error (enum failure why, char *s1, char *s2)
 }
 
 char *
-vtoc_ebcdic_enc (char source[LINE_LENGTH],
-                 char target[LINE_LENGTH],
-                 int l)
+vtoc_ebcdic_enc (char const *source, char *target, int l)
 {
 	PDEBUG
 	int i;
@@ -197,9 +195,7 @@ vtoc_ebcdic_enc (char source[LINE_LENGTH],
 }
 
 char *
-vtoc_ebcdic_dec (char source[LINE_LENGTH],
-                 char target[LINE_LENGTH],
-                 int l)
+vtoc_ebcdic_dec (char const *source, char *target, int l)
 {
 	PDEBUG
 	int i;



More information about the Parted-commits mailing list