From: Petr Uzel Subject: libparted: dasd: Add an implicit partition disk flag Patch-mainline: no, custom SUSE patch --- include/parted/disk.in.h | 4 +++- libparted/disk.c | 2 ++ libparted/labels/dasd.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) Index: parted-3.3/include/parted/disk.in.h =================================================================== --- parted-3.3.orig/include/parted/disk.in.h +++ parted-3.3/include/parted/disk.in.h @@ -38,10 +38,12 @@ enum _PedDiskFlag { PED_DISK_CYLINDER_ALIGNMENT=1, /* This flag controls whether the boot flag of a GPT PMBR is set */ PED_DISK_GPT_PMBR_BOOT=2, + /* This flag indicates that there is an implicit (aka fake) partition on the DASD disk */ + PED_DISK_DASD_IMPLICIT_PARTITION=3, }; // NOTE: DO NOT define using enums #define PED_DISK_FIRST_FLAG 1 // PED_DISK_CYLINDER_ALIGNMENT -#define PED_DISK_LAST_FLAG 2 // PED_DISK_GPT_PMBR_BOOT +#define PED_DISK_LAST_FLAG 3 // PED_DISK_DASD_IMPLICIT_PARTITION /** * Partition types Index: parted-3.3/libparted/disk.c =================================================================== --- parted-3.3.orig/libparted/disk.c +++ parted-3.3/libparted/disk.c @@ -841,6 +841,8 @@ ped_disk_flag_get_name(PedDiskFlag flag) return N_("cylinder_alignment"); case PED_DISK_GPT_PMBR_BOOT: return N_("pmbr_boot"); + case PED_DISK_DASD_IMPLICIT_PARTITION: + return N_("implicit_partition_table"); default: ped_exception_throw ( PED_EXCEPTION_BUG, Index: parted-3.3/libparted/labels/dasd.c =================================================================== --- parted-3.3.orig/libparted/labels/dasd.c +++ parted-3.3/libparted/labels/dasd.c @@ -73,6 +73,7 @@ typedef struct { unsigned int format_type; unsigned int label_block; volume_label_t vlabel; + unsigned int has_implicit_partition; } DasdDiskSpecific; static int dasd_probe (const PedDevice *dev); @@ -107,6 +108,10 @@ static int dasd_partition_set_system (Pe const PedFileSystemType* fs_type); static int dasd_alloc_metadata (PedDisk* disk); +static int dasd_disk_set_flag (PedDisk *disk, PedDiskFlag flag, int state); +static int dasd_disk_is_flag_available(const PedDisk *disk, PedDiskFlag flag); +static int dasd_disk_get_flag (const PedDisk *disk, PedDiskFlag flag); + #include "pt-common.h" PT_define_limit_functions (dasd) @@ -122,6 +122,9 @@ partition_get_type_id: NULL, partition_set_type_uuid: NULL, partition_get_type_uuid: NULL, + disk_set_flag: dasd_disk_set_flag, + disk_get_flag: dasd_disk_get_flag, + disk_is_flag_available: dasd_disk_is_flag_available, get_partition_alignment: dasd_get_partition_alignment, @@ -150,6 +158,8 @@ dasd_alloc (const PedDevice* dev) return NULL; } + disk_specific->has_implicit_partition = 0; + /* CDL format, newer */ disk_specific->format_type = 2; disk_specific->label_block = 2; @@ -289,6 +299,7 @@ dasd_read (PedDisk* disk) goto error_close_dev; disk_specific->format_type = 1; + disk_specific->has_implicit_partition = 1; /* Register implicit partition */ ped_disk_delete_all (disk); @@ -922,6 +933,40 @@ dasd_partition_enumerate (PedPartition* } static int +dasd_disk_set_flag (PedDisk *disk, PedDiskFlag flag, int state) +{ + /* PED_DISK_DASD_IMPLICIT_PARTITION is immutable */ + return 0; +} + +static int +dasd_disk_is_flag_available(const PedDisk *disk, PedDiskFlag flag) +{ + switch (flag) + { + case PED_DISK_DASD_IMPLICIT_PARTITION: + return 1; + default: + return 0; + } +} + +static int +dasd_disk_get_flag (const PedDisk *disk, PedDiskFlag flag) +{ + DasdDiskSpecific* disk_specific = disk->disk_specific; + + switch (flag) + { + case PED_DISK_DASD_IMPLICIT_PARTITION: + return disk_specific->has_implicit_partition; + break; + default: + return 0; + } +} + +static int dasd_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type) {