* libparted/labels/dos.c(DosDiskData): New struct. * libparted/labels/dos.c(msdos_alloc, msdos_duplicate, msdos_free): Handle per disk DosDiskData. * libparted/labels/dos.c(msdos_disk_set_flag, msdos_disk_get_flag, msdos_disk_is_flag_available): New functions. * libparted/labels/sun.c(sun_disk_set_flag, sun_disk_get_flag, sun_disk_is_flag_available): New functions. --- libparted/labels/dos.c | 73 +++++++++++++++++++++++++++++++++++++++++++++-- libparted/labels/sun.c | 50 ++++++++++++++++++++++++++++++++- 2 files changed, 118 insertions(+), 5 deletions(-)
diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c index cc9e0e3..75e223b 100644 --- a/libparted/labels/dos.c +++ b/libparted/labels/dos.c @@ -143,6 +143,10 @@ typedef struct { } OrigState; typedef struct { + int cylinder_alignment; +} DosDiskData; + +typedef struct { unsigned char system; int boot; int hidden; @@ -224,11 +228,20 @@ static PedDisk* msdos_alloc (const PedDevice* dev) { PedDisk* disk; + DosDiskData *disk_specific; PED_ASSERT (dev != NULL, return NULL); disk = _ped_disk_alloc ((PedDevice*)dev, &msdos_disk_type); - if (disk) - disk->disk_specific = NULL; + if (disk) { + disk_specific = ped_malloc(sizeof(DosDiskData)); + if (!disk_specific) { + free (disk); + return NULL; + } + disk_specific->cylinder_alignment = 1; + disk->disk_specific = disk_specific; + } + return disk; } @@ -240,16 +253,61 @@ msdos_duplicate (const PedDisk* disk) new_disk = ped_disk_new_fresh (disk->dev, &msdos_disk_type); if (!new_disk) return NULL; - new_disk->disk_specific = NULL; + + memcpy(new_disk->disk_specific, disk->disk_specific, + sizeof(DosDiskData)); + return new_disk; } static void msdos_free (PedDisk* disk) { + DosDiskData *disk_specific; + PED_ASSERT (disk != NULL, return); + disk_specific = disk->disk_specific; _ped_disk_free (disk); + free(disk_specific); +} + +static int +msdos_disk_set_flag(PedDisk *disk, PedDiskFlag flag, int state) +{ + DosDiskData *disk_specific = disk->disk_specific; + + switch (flag) { + case PED_DISK_CYLINDER_ALIGNMENT: + disk_specific->cylinder_alignment = !!state; + return 1; + default: + return 0; + } +} + +static int +msdos_disk_get_flag(const PedDisk *disk, PedDiskFlag flag) +{ + DosDiskData *disk_specific = disk->disk_specific; + + switch (flag) { + case PED_DISK_CYLINDER_ALIGNMENT: + return disk_specific->cylinder_alignment; + default: + return 0; + } +} + +static int +msdos_disk_is_flag_available(const PedDisk *disk, PedDiskFlag flag) +{ + switch (flag) { + case PED_DISK_CYLINDER_ALIGNMENT: + return 1; + default: + return 0; + } } #ifndef DISCOVER_ONLY @@ -1973,11 +2031,14 @@ msdos_partition_align (PedPartition* part, const PedConstraint* constraint) { PedCHSGeometry bios_geom; DosPartitionData* dos_data; + DosDiskData *disk_specific; PED_ASSERT (part != NULL, return 0); PED_ASSERT (part->disk_specific != NULL, return 0); dos_data = part->disk_specific; + disk_specific = part->disk->disk_specific; + if (dos_data->system == PARTITION_LDM && dos_data->orig) { PedGeometry *orig_geom = &dos_data->orig->geom; @@ -1997,7 +2058,8 @@ msdos_partition_align (PedPartition* part, const PedConstraint* constraint) partition_probe_bios_geometry (part, &bios_geom); - if (_align (part, &bios_geom, constraint)) + if (disk_specific->cylinder_alignment && + _align(part, &bios_geom, constraint)) return 1; if (_align_no_geom (part, constraint)) return 1; @@ -2305,6 +2367,9 @@ static PedDiskOps msdos_disk_ops = { #else write: NULL, #endif + disk_set_flag: msdos_disk_set_flag, + disk_get_flag: msdos_disk_get_flag, + disk_is_flag_available: msdos_disk_is_flag_available, partition_new: msdos_partition_new, partition_duplicate: msdos_partition_duplicate, diff --git a/libparted/labels/sun.c b/libparted/labels/sun.c index 86e4ef4..e3d3681 100644 --- a/libparted/labels/sun.c +++ b/libparted/labels/sun.c @@ -96,6 +96,7 @@ struct _SunPartitionData { struct _SunDiskData { PedSector length; /* This is based on cyl - alt-cyl */ SunRawLabel raw_label; + int cylinder_alignment; }; static PedDiskType sun_disk_type; @@ -196,6 +197,7 @@ sun_alloc (const PedDevice* dev) PED_ASSERT (bios_geom->cylinders == (PedSector) (dev->length / cyl_size), return NULL); sun_specific->length = ped_round_down_to (dev->length, cyl_size); + sun_specific->cylinder_alignment = 1; label = &sun_specific->raw_label; memset(label, 0, sizeof(SunRawLabel)); @@ -258,6 +260,44 @@ sun_free (PedDisk *disk) } static int +sun_disk_set_flag(PedDisk *disk, PedDiskFlag flag, int state) +{ + SunDiskData *disk_specific = disk->disk_specific; + + switch (flag) { + case PED_DISK_CYLINDER_ALIGNMENT: + disk_specific->cylinder_alignment = !!state; + return 1; + default: + return 0; + } +} + +static int +sun_disk_get_flag(const PedDisk *disk, PedDiskFlag flag) +{ + SunDiskData *disk_specific = disk->disk_specific; + + switch (flag) { + case PED_DISK_CYLINDER_ALIGNMENT: + return disk_specific->cylinder_alignment; + default: + return 0; + } +} + +static int +sun_disk_is_flag_available(const PedDisk *disk, PedDiskFlag flag) +{ + switch (flag) { + case PED_DISK_CYLINDER_ALIGNMENT: + return 1; + default: + return 0; + } +} + +static int _check_geometry_sanity (PedDisk* disk, SunRawLabel* label) { PedDevice* dev = disk->dev; @@ -766,9 +806,14 @@ _get_lax_constraint (PedDisk* disk) static int sun_partition_align (PedPartition* part, const PedConstraint* constraint) { + SunDiskData *disk_specific; + PED_ASSERT (part != NULL, return 0); - if (_ped_partition_attempt_align (part, constraint, + disk_specific = part->disk->disk_specific; + + if (disk_specific->cylinder_alignment && + _ped_partition_attempt_align (part, constraint, _get_strict_constraint (part->disk))) return 1; if (_ped_partition_attempt_align (part, constraint, @@ -897,6 +942,9 @@ static PedDiskOps sun_disk_ops = { #else write: NULL, #endif + disk_set_flag: sun_disk_set_flag, + disk_get_flag: sun_disk_get_flag, + disk_is_flag_available: sun_disk_is_flag_available, partition_new: sun_partition_new, partition_duplicate: sun_partition_duplicate, -- 1.6.5.2 _______________________________________________ bug-parted mailing list bug-parted@gnu.org http://lists.gnu.org/mailman/listinfo/bug-parted