dasd_alloc was doing an ioctl to get the real sector size for the dasd device (we are faking 512 bytes sectors), but when called directly from ped_disk_new_fresh(), the device is not open causing this to fail.
This patch fixes things by caching the real_sector_size in the linux arch_specific data and making the dasd label handling use this. libparted/arch/linux.c(_device_set_sector_size): Cache real sector size. (_device_set_sector_size, init_dasd, linux_new): Only compile dasd code on s390 and s390x. --- libparted/arch/linux.c | 7 +++++++ libparted/labels/dasd.c | 34 +++++++++++----------------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c index a87f7e2..d5d3597 100644 --- a/libparted/arch/linux.c +++ b/libparted/arch/linux.c @@ -654,10 +654,13 @@ _device_set_sector_size (PedDevice* dev) } #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 ( @@ -1081,6 +1084,7 @@ error: return 0; } +#if defined __s390__ || defined __s390x__ static int init_dasd (PedDevice* dev, const char* model_name) { @@ -1136,6 +1140,7 @@ error_close_dev: error: return 0; } +#endif static int init_generic (PedDevice* dev, const char* model_name) @@ -1282,10 +1287,12 @@ linux_new (const char* path) 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"))) diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c index a7df859..37b1f1d 100644 --- a/libparted/labels/dasd.c +++ b/libparted/labels/dasd.c @@ -69,7 +69,6 @@ typedef struct { } DasdPartitionData; typedef struct { - unsigned int real_sector_size; unsigned int format_type; } DasdDiskSpecific; @@ -161,18 +160,6 @@ dasd_alloc (const PedDevice* dev) 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; - } - return disk; } @@ -320,7 +307,7 @@ dasd_read (PedDisk* disk) 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) @@ -359,11 +346,11 @@ dasd_read (PedDisk* disk) 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); @@ -423,11 +410,11 @@ dasd_read (PedDisk* disk) 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); @@ -586,9 +573,9 @@ dasd_write (const PedDisk* disk) 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; @@ -734,8 +721,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); } @@ -754,7 +742,7 @@ _primary_constraint (PedDisk* disk) 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)) @@ -880,7 +868,7 @@ dasd_alloc_metadata (PedDisk* disk) 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); -- 1.6.5.1 _______________________________________________ bug-parted mailing list bug-parted@gnu.org http://lists.gnu.org/mailman/listinfo/bug-parted