487 lines
14 KiB
Diff
487 lines
14 KiB
Diff
diff -ur parted-1.9.0.orig/libparted/arch/linux.c parted-1.9.0/libparted/arch/linux.c
|
|
--- parted-1.9.0.orig/libparted/arch/linux.c 2009-11-03 11:35:00.000000000 +0100
|
|
+++ parted-1.9.0/libparted/arch/linux.c 2009-11-03 11:45:48.000000000 +0100
|
|
@@ -646,10 +646,14 @@
|
|
#if USE_BLKID
|
|
get_blkid_topology(arch_specific);
|
|
#endif
|
|
+
|
|
+#if defined __s390__ || defined __s390x__
|
|
/* Return PED_SECTOR_SIZE_DEFAULT for DASDs. */
|
|
if (dev->type == PED_DEVICE_DASD) {
|
|
+ arch_specific->real_sector_size = dev->sector_size;
|
|
dev->sector_size = PED_SECTOR_SIZE_DEFAULT;
|
|
}
|
|
+#endif
|
|
|
|
if (dev->sector_size != PED_SECTOR_SIZE_DEFAULT) {
|
|
ped_exception_throw (
|
|
@@ -1069,6 +1073,7 @@
|
|
return 0;
|
|
}
|
|
|
|
+#if defined __s390__ || defined __s390x__
|
|
static int
|
|
init_dasd (PedDevice* dev, const char* model_name)
|
|
{
|
|
@@ -1124,6 +1129,7 @@
|
|
error:
|
|
return 0;
|
|
}
|
|
+#endif
|
|
|
|
static int
|
|
init_generic (PedDevice* dev, const char* model_name)
|
|
@@ -1270,10 +1276,12 @@
|
|
goto error_free_arch_specific;
|
|
break;
|
|
|
|
+#if defined __s390__ || defined __s390x__
|
|
case PED_DEVICE_DASD:
|
|
if (!init_dasd (dev, _("IBM S390 DASD drive")))
|
|
goto error_free_arch_specific;
|
|
break;
|
|
+#endif
|
|
|
|
case PED_DEVICE_VIODASD:
|
|
if (!init_generic (dev, _("IBM iSeries Virtual DASD")))
|
|
Only in parted-1.9.0/libparted/arch: linux.c.orig
|
|
Only in parted-1.9.0/libparted/arch: linux.c.rej
|
|
Only in parted-1.9.0/libparted/arch: linux.c~
|
|
diff -ur parted-1.9.0.orig/libparted/arch/linux.h parted-1.9.0/libparted/arch/linux.h
|
|
--- parted-1.9.0.orig/libparted/arch/linux.h 2009-11-03 11:35:00.000000000 +0100
|
|
+++ parted-1.9.0/libparted/arch/linux.h 2009-11-03 11:44:40.000000000 +0100
|
|
@@ -18,10 +18,6 @@
|
|
#ifndef PED_ARCH_LINUX_H_INCLUDED
|
|
#define PED_ARCH_LINUX_H_INCLUDED
|
|
|
|
-#if defined(__s390__) || defined(__s390x__)
|
|
-# include <parted/fdasd.h>
|
|
-#endif
|
|
-
|
|
#if HAVE_BLKID_BLKID_H
|
|
# include <blkid/blkid.h>
|
|
#endif
|
|
@@ -35,8 +31,6 @@
|
|
char* dmtype; /**< device map target type */
|
|
#if defined(__s390__) || defined(__s390x__)
|
|
unsigned int real_sector_size;
|
|
- /* IBM internal dasd structure (i guess ;), required. */
|
|
- struct fdasd_anchor *anchor;
|
|
#endif
|
|
#if HAVE_BLKID_BLKID_H
|
|
blkid_probe probe;
|
|
Only in parted-1.9.0/libparted/arch: linux.h.orig
|
|
Only in parted-1.9.0/libparted/arch: linux.h.rej
|
|
Only in parted-1.9.0/libparted/arch: linux.h~
|
|
diff -ur parted-1.9.0.orig/libparted/labels/dasd.c parted-1.9.0/libparted/labels/dasd.c
|
|
--- parted-1.9.0.orig/libparted/labels/dasd.c 2009-11-03 11:35:00.000000000 +0100
|
|
+++ parted-1.9.0/libparted/labels/dasd.c 2009-11-03 11:48:17.000000000 +0100
|
|
@@ -66,14 +66,10 @@
|
|
int system;
|
|
int raid;
|
|
int lvm;
|
|
- void *part_info;
|
|
} DasdPartitionData;
|
|
|
|
typedef struct {
|
|
- unsigned int real_sector_size;
|
|
unsigned int format_type;
|
|
- /* IBM internal dasd structure (i guess ;), required. */
|
|
- struct fdasd_anchor *anchor;
|
|
} DasdDiskSpecific;
|
|
|
|
static PedDiskType dasd_disk_type;
|
|
@@ -98,17 +94,8 @@
|
|
return NULL;
|
|
}
|
|
|
|
- /* because we lie to parted we have to compensate with the
|
|
- real sector size. Record that now. */
|
|
- if (ioctl(arch_specific->fd, BLKSSZGET,
|
|
- &disk_specific->real_sector_size) == -1) {
|
|
- ped_exception_throw(PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
|
|
- _("Unable to determine the block "
|
|
- "size of this dasd"));
|
|
- free(disk_specific);
|
|
- free(disk);
|
|
- return NULL;
|
|
- }
|
|
+ /* CDL format, newer */
|
|
+ disk_specific->format_type = 2;
|
|
|
|
return disk;
|
|
}
|
|
@@ -123,7 +110,8 @@
|
|
if (!new_disk)
|
|
return NULL;
|
|
|
|
- new_disk->disk_specific = NULL;
|
|
+ memcpy(new_disk->disk_specific, disk->disk_specific,
|
|
+ sizeof(DasdDiskSpecific));
|
|
|
|
return new_disk;
|
|
}
|
|
@@ -187,6 +175,8 @@
|
|
fdasd_recreate_vtoc(&anchor);
|
|
fdasd_write_labels(&anchor, arch_specific->fd);
|
|
|
|
+ fdasd_cleanup(&anchor);
|
|
+
|
|
return 1;
|
|
}
|
|
|
|
@@ -203,6 +193,7 @@
|
|
partition_info_t *p;
|
|
LinuxSpecific* arch_specific;
|
|
DasdDiskSpecific* disk_specific;
|
|
+ struct fdasd_anchor anchor;
|
|
|
|
PDEBUG;
|
|
|
|
@@ -216,35 +207,32 @@
|
|
arch_specific = LINUX_SPECIFIC(dev);
|
|
disk_specific = disk->disk_specific;
|
|
|
|
- disk_specific->anchor = ped_malloc(sizeof(fdasd_anchor_t));
|
|
-
|
|
PDEBUG;
|
|
|
|
- fdasd_initialize_anchor(disk_specific->anchor);
|
|
+ fdasd_initialize_anchor(&anchor);
|
|
|
|
- fdasd_get_geometry(disk_specific->anchor, arch_specific->fd);
|
|
+ fdasd_get_geometry(&anchor, arch_specific->fd);
|
|
|
|
/* check dasd for labels and vtoc */
|
|
- if (fdasd_check_volume(disk_specific->anchor, arch_specific->fd))
|
|
+ if (fdasd_check_volume(&anchor, arch_specific->fd))
|
|
goto error_close_dev;
|
|
|
|
- if ((disk_specific->anchor->geo.cylinders
|
|
- * disk_specific->anchor->geo.heads) > BIG_DISK_SIZE)
|
|
- disk_specific->anchor->big_disk++;
|
|
+ if ((anchor.geo.cylinders * anchor.geo.heads) > BIG_DISK_SIZE)
|
|
+ anchor.big_disk++;
|
|
|
|
ped_disk_delete_all (disk);
|
|
|
|
- if (strncmp(disk_specific->anchor->vlabel->volkey,
|
|
+ if (strncmp(anchor.vlabel->volkey,
|
|
vtoc_ebcdic_enc ("LNX1", str, 4), 4) == 0) {
|
|
DasdPartitionData* dasd_data;
|
|
|
|
/* LDL format, old one */
|
|
disk_specific->format_type = 1;
|
|
start = 24;
|
|
- end = (long long)(long long) disk_specific->anchor->geo.cylinders
|
|
- * (long long)disk_specific->anchor->geo.heads
|
|
+ end = (long long)(long long) anchor.geo.cylinders
|
|
+ * (long long)anchor.geo.heads
|
|
* (long long)disk->dev->hw_geom.sectors
|
|
- * (long long)disk_specific->real_sector_size
|
|
+ * (long long)arch_specific->real_sector_size
|
|
/ (long long)disk->dev->sector_size - 1;
|
|
part = ped_partition_new (disk, PED_PARTITION_PROTECTED, NULL, start, end);
|
|
if (!part)
|
|
@@ -260,13 +248,15 @@
|
|
if (!ped_disk_add_partition (disk, part, NULL))
|
|
goto error_close_dev;
|
|
|
|
+ fdasd_cleanup(&anchor);
|
|
+
|
|
return 1;
|
|
}
|
|
|
|
/* CDL format, newer */
|
|
disk_specific->format_type = 2;
|
|
|
|
- p = disk_specific->anchor->first;
|
|
+ p = anchor.first;
|
|
PDEBUG;
|
|
|
|
for (i = 1 ; i <= USABLE_PARTITIONS; i++) {
|
|
@@ -281,11 +271,11 @@
|
|
|
|
start = (long long)(long long) p->start_trk
|
|
* (long long) disk->dev->hw_geom.sectors
|
|
- * (long long) disk_specific->real_sector_size
|
|
+ * (long long) arch_specific->real_sector_size
|
|
/ (long long) disk->dev->sector_size;
|
|
end = (long long)((long long) p->end_trk + 1)
|
|
* (long long) disk->dev->hw_geom.sectors
|
|
- * (long long) disk_specific->real_sector_size
|
|
+ * (long long) arch_specific->real_sector_size
|
|
/ (long long) disk->dev->sector_size - 1;
|
|
part = ped_partition_new(disk, PED_PARTITION_NORMAL, NULL,
|
|
start, end);
|
|
@@ -331,24 +321,25 @@
|
|
|
|
vtoc_ebcdic_enc(p->f1->DS1DSNAM, p->f1->DS1DSNAM, 44);
|
|
|
|
- dasd_data->part_info = (void *) p;
|
|
dasd_data->type = 0;
|
|
|
|
constraint_exact = ped_constraint_exact (&part->geom);
|
|
if (!constraint_exact)
|
|
goto error_close_dev;
|
|
- if (!ped_disk_add_partition(disk, part, constraint_exact))
|
|
+ if (!ped_disk_add_partition(disk, part, constraint_exact)) {
|
|
+ ped_constraint_destroy(constraint_exact);
|
|
goto error_close_dev;
|
|
+ }
|
|
ped_constraint_destroy(constraint_exact);
|
|
|
|
if (p->fspace_trk > 0) {
|
|
start = (long long)((long long) p->end_trk + 1)
|
|
* (long long) disk->dev->hw_geom.sectors
|
|
- * (long long) disk_specific->real_sector_size
|
|
+ * (long long) arch_specific->real_sector_size
|
|
/ (long long) disk->dev->sector_size;
|
|
end = (long long)((long long) p->end_trk + 1 + p->fspace_trk)
|
|
* (long long) disk->dev->hw_geom.sectors
|
|
- * (long long) disk_specific->real_sector_size
|
|
+ * (long long) arch_specific->real_sector_size
|
|
/ (long long) disk->dev->sector_size - 1;
|
|
part = ped_partition_new (disk, PED_PARTITION_NORMAL,
|
|
NULL, start, end);
|
|
@@ -361,8 +352,10 @@
|
|
|
|
if (!constraint_exact)
|
|
goto error_close_dev;
|
|
- if (!ped_disk_add_partition(disk, part, constraint_exact))
|
|
+ if (!ped_disk_add_partition(disk, part, constraint_exact)) {
|
|
+ ped_constraint_destroy(constraint_exact);
|
|
goto error_close_dev;
|
|
+ }
|
|
|
|
ped_constraint_destroy (constraint_exact);
|
|
}
|
|
@@ -371,16 +364,20 @@
|
|
}
|
|
|
|
PDEBUG;
|
|
+ fdasd_cleanup(&anchor);
|
|
return 1;
|
|
|
|
error_close_dev:
|
|
PDEBUG;
|
|
+ fdasd_cleanup(&anchor);
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
-dasd_update_type (const PedDisk* disk)
|
|
+dasd_update_type (const PedDisk* disk, struct fdasd_anchor *anchor,
|
|
+ partition_info_t *part_info[USABLE_PARTITIONS])
|
|
{
|
|
+ int i;
|
|
PedPartition* part;
|
|
LinuxSpecific* arch_specific;
|
|
DasdDiskSpecific* disk_specific;
|
|
@@ -390,22 +387,21 @@
|
|
|
|
PDEBUG;
|
|
|
|
- for (part = ped_disk_next_partition(disk, NULL); part;
|
|
- part = ped_disk_next_partition(disk, part)) {
|
|
+ for (i = 1; i <= USABLE_PARTITIONS; i++) {
|
|
partition_info_t *p;
|
|
char *ch = NULL;
|
|
DasdPartitionData* dasd_data;
|
|
|
|
PDEBUG;
|
|
|
|
- if (part->type & PED_PARTITION_FREESPACE
|
|
- || part->type & PED_PARTITION_METADATA)
|
|
+ part = ped_disk_get_partition(disk, i);
|
|
+ if (!part)
|
|
continue;
|
|
|
|
PDEBUG;
|
|
|
|
dasd_data = part->disk_specific;
|
|
- p = dasd_data->part_info;
|
|
+ p = part_info[i - 1];
|
|
|
|
if (!p ) {
|
|
PDEBUG;
|
|
@@ -447,7 +443,7 @@
|
|
break;
|
|
}
|
|
|
|
- disk_specific->anchor->vtoc_changed++;
|
|
+ anchor->vtoc_changed++;
|
|
vtoc_ebcdic_enc(p->f1->DS1DSNAM, p->f1->DS1DSNAM, 44);
|
|
}
|
|
|
|
@@ -463,6 +459,9 @@
|
|
partition_info_t *p;
|
|
LinuxSpecific* arch_specific;
|
|
DasdDiskSpecific* disk_specific;
|
|
+ struct fdasd_anchor anchor;
|
|
+ partition_info_t *part_info[USABLE_PARTITIONS];
|
|
+
|
|
PED_ASSERT(disk != NULL, return 0);
|
|
PED_ASSERT(disk->dev != NULL, return 0);
|
|
|
|
@@ -475,23 +474,21 @@
|
|
if (disk_specific->format_type == 1)
|
|
return 1;
|
|
|
|
- /* XXX re-initialize anchor? */
|
|
- fdasd_initialize_anchor(disk_specific->anchor);
|
|
- fdasd_get_geometry(disk_specific->anchor, arch_specific->fd);
|
|
+ /* initialize the anchor */
|
|
+ fdasd_initialize_anchor(&anchor);
|
|
+ fdasd_get_geometry(&anchor, arch_specific->fd);
|
|
|
|
/* check dasd for labels and vtoc */
|
|
- if (fdasd_check_volume(disk_specific->anchor, arch_specific->fd))
|
|
+ if (fdasd_check_volume(&anchor, arch_specific->fd))
|
|
goto error;
|
|
|
|
- if ((disk_specific->anchor->geo.cylinders
|
|
- * disk_specific->anchor->geo.heads) > BIG_DISK_SIZE)
|
|
- disk_specific->anchor->big_disk++;
|
|
+ if ((anchor.geo.cylinders * anchor.geo.heads) > BIG_DISK_SIZE)
|
|
+ anchor.big_disk++;
|
|
|
|
- fdasd_recreate_vtoc(disk_specific->anchor);
|
|
+ fdasd_recreate_vtoc(&anchor);
|
|
|
|
for (i = 1; i <= USABLE_PARTITIONS; i++) {
|
|
unsigned int start, stop;
|
|
- int type;
|
|
|
|
PDEBUG;
|
|
part = ped_disk_get_partition(disk, i);
|
|
@@ -501,41 +498,40 @@
|
|
PDEBUG;
|
|
|
|
start = part->geom.start * disk->dev->sector_size
|
|
- / disk_specific->real_sector_size / disk->dev->hw_geom.sectors;
|
|
+ / arch_specific->real_sector_size / disk->dev->hw_geom.sectors;
|
|
stop = (part->geom.end + 1)
|
|
- * disk->dev->sector_size / disk_specific->real_sector_size
|
|
+ * disk->dev->sector_size / arch_specific->real_sector_size
|
|
/ disk->dev->hw_geom.sectors - 1;
|
|
|
|
PDEBUG;
|
|
dasd_data = part->disk_specific;
|
|
|
|
- type = dasd_data->type;
|
|
- PDEBUG;
|
|
-
|
|
- p = fdasd_add_partition(disk_specific->anchor, start, stop);
|
|
+ p = fdasd_add_partition(&anchor, start, stop);
|
|
if (!p) {
|
|
PDEBUG;
|
|
- return 0;
|
|
+ goto error;
|
|
}
|
|
- dasd_data->part_info = (void *) p;
|
|
+ part_info[i - 1] = p;
|
|
p->type = dasd_data->system;
|
|
}
|
|
|
|
PDEBUG;
|
|
|
|
- if (!fdasd_prepare_labels(disk_specific->anchor, arch_specific->fd))
|
|
- return 0;
|
|
+ if (!fdasd_prepare_labels(&anchor, arch_specific->fd))
|
|
+ goto error;
|
|
|
|
- dasd_update_type(disk);
|
|
+ dasd_update_type(disk, &anchor, part_info);
|
|
PDEBUG;
|
|
|
|
- if (!fdasd_write_labels(disk_specific->anchor, arch_specific->fd))
|
|
- return 0;
|
|
+ if (!fdasd_write_labels(&anchor, arch_specific->fd))
|
|
+ goto error;
|
|
|
|
+ fdasd_cleanup(&anchor);
|
|
return 1;
|
|
|
|
error:
|
|
PDEBUG;
|
|
+ fdasd_cleanup(&anchor);
|
|
return 0;
|
|
}
|
|
|
|
@@ -557,6 +553,23 @@
|
|
return 0;
|
|
}
|
|
|
|
+static PedPartition*
|
|
+dasd_partition_duplicate (const PedPartition *part)
|
|
+{
|
|
+ PedPartition *new_part;
|
|
+
|
|
+ new_part = ped_partition_new (part->disk, part->type, part->fs_type,
|
|
+ part->geom.start, part->geom.end);
|
|
+ if (!new_part)
|
|
+ return NULL;
|
|
+ new_part->num = part->num;
|
|
+
|
|
+ memcpy(new_part->disk_specific, part->disk_specific,
|
|
+ sizeof(DasdPartitionData));
|
|
+
|
|
+ return new_part;
|
|
+}
|
|
+
|
|
static void
|
|
dasd_partition_destroy (PedPartition* part)
|
|
{
|
|
@@ -650,9 +662,9 @@
|
|
static PedAlignment*
|
|
dasd_get_partition_alignment(const PedDisk *disk)
|
|
{
|
|
- DasdDiskSpecific* disk_specific = disk->disk_specific;
|
|
+ LinuxSpecific *arch_specific = LINUX_SPECIFIC(disk->dev);
|
|
PedSector sector_size =
|
|
- disk_specific->real_sector_size / disk->dev->sector_size;
|
|
+ arch_specific->real_sector_size / disk->dev->sector_size;
|
|
|
|
return ped_alignment_new(0, disk->dev->hw_geom.sectors * sector_size);
|
|
}
|
|
@@ -670,7 +683,7 @@
|
|
|
|
arch_specific = LINUX_SPECIFIC (disk->dev);
|
|
disk_specific = disk->disk_specific;
|
|
- sector_size = disk_specific->real_sector_size / disk->dev->sector_size;
|
|
+ sector_size = arch_specific->real_sector_size / disk->dev->sector_size;
|
|
|
|
if (!ped_alignment_init (&start_align, 0,
|
|
disk->dev->hw_geom.sectors * sector_size))
|
|
@@ -796,7 +809,7 @@
|
|
else
|
|
/* Mark the start of the disk as metadata. */
|
|
vtoc_end = (FIRST_USABLE_TRK * (long long) disk->dev->hw_geom.sectors
|
|
- * (long long) disk_specific->real_sector_size
|
|
+ * (long long) arch_specific->real_sector_size
|
|
/ (long long) disk->dev->sector_size) - 1;
|
|
|
|
new_part = ped_partition_new (disk,PED_PARTITION_METADATA,NULL,0,vtoc_end);
|
|
@@ -828,6 +841,7 @@
|
|
partition_set_system: dasd_partition_set_system,
|
|
|
|
partition_new: dasd_partition_new,
|
|
+ partition_duplicate: dasd_partition_duplicate,
|
|
partition_destroy: dasd_partition_destroy,
|
|
partition_set_flag: dasd_partition_set_flag,
|
|
partition_get_flag: dasd_partition_get_flag,
|
|
@@ -841,8 +855,6 @@
|
|
get_max_primary_partition_count: dasd_get_max_primary_partition_count,
|
|
get_max_supported_partition_count: dasd_get_max_supported_partition_count,
|
|
get_partition_alignment: dasd_get_partition_alignment,
|
|
-
|
|
- partition_duplicate: NULL
|
|
};
|
|
|
|
static PedDiskType dasd_disk_type = {
|
|
Only in parted-1.9.0/libparted/labels: dasd.c.orig
|
|
Only in parted-1.9.0/libparted/labels: dasd.c.rej
|
|
Only in parted-1.9.0/libparted/labels: dasd.c~
|