Subject: [PATCH] libparted: Fixed bug in initializing and re-reading partition table of FBA devices
From: Nageswara R Sastry <[email protected]> Fixed Block Access (FBA) DASDs are mainframe-specific disk devices that are layred out as a sequence of 512-byte sectors. In contrast to ECKD DASDs, these disks do not require formatting and resemble the LBA layout of non-mainframe disks. Despite this resemblance, the Linux kernel applies special handling during partition detection for FBA DASDs, resulting in a single, immutable partition being reported. While actual FBA DASD hardware is no longer available, the z/VM hypervisor can simulate FBA DASD disks, backed by either ECKD or SCSI devices. This patch fixes the initialization of FBA DASD. For re-reading of FBA partitions used the old BLKRRPART IOCTL. With the current blk_pg IOCTL more hacking is required to re-read partitions from FBA devices. * libparted/arch/linux.c (_disk_sync_part_table): For FBA devices added BLKRRPART IOCTL to re-read kernel partition * libparted/labels/dasd.c (dasd_alloc): For FBA devices corrected the initialization. Signed-off-by: Nageswara R Sastry <[email protected]> --- libparted/arch/linux.c | 31 +++++++++++++++++++++++++++++++ libparted/labels/dasd.c | 16 +++++++++++++--- 2 files changed, 44 insertions(+), 3 deletions(-) --- a/libparted/arch/linux.c +++ b/libparted/arch/linux.c @@ -2669,6 +2669,37 @@ _disk_sync_part_table (PedDisk* disk) ret = 1; free (bad_part_list); } + /* For FBA kind of devices it is required to re-read the partitions + when this is not done the implicit partition is not identified by + the kernel and device node is not created. */ + + #if defined __s390__ || defined __s390x__ + LinuxSpecific* arch_specific = LINUX_SPECIFIC (disk->dev); + int retry_count = 5; + + if (disk->dev->type == PED_DEVICE_DASD && lpn == 1) { + sync(); + while (ioctl (arch_specific->fd, BLKRRPART)) { + retry_count--; + sync(); + if (!retry_count) { + ped_exception_throw ( + PED_EXCEPTION_WARNING, + PED_EXCEPTION_IGNORE, + _("WARNING: the kernel failed to re-read the " + "partition table on %s (%s). As a result, it" + " may not reflect all of your changes until " + "after reboot."), + disk->dev->path, strerror (errno)); + ret = 0; + goto cleanup; + + } + } + ret = 1; + } + #endif + cleanup: free (errnums); free (ok); --- a/libparted/labels/dasd.c +++ b/libparted/labels/dasd.c @@ -150,9 +150,19 @@ dasd_alloc (const PedDevice* dev) return NULL; } - /* CDL format, newer */ - disk_specific->format_type = 2; - disk_specific->label_block = 2; + /* Correct assignment is required to pass the correct values + according to the disk type. For FBA disk values are '1' + and for CDL formatted disk values are '2'*/ + struct fdasd_anchor anchor; + fdasd_initialize_anchor(&anchor); + fdasd_get_geometry(disk->dev, &anchor, arch_specific->fd); + if (anchor.FBA_layout == 1) { + disk_specific->format_type = 1; + disk_specific->label_block = 1; + }else{ + disk_specific->label_block = 2; + disk_specific->format_type = 2; + } /* Setup volume label (for fresh disks) */ snprintf(volser, sizeof(volser), "0X%04X", arch_specific->devno);

