[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