[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH parted 2/3] msdos, sun: Implement disk flag operations
From: |
Hans de Goede |
Subject: |
[PATCH parted 2/3] msdos, sun: Implement disk flag operations |
Date: |
Wed, 9 Dec 2009 15:38:01 +0100 |
* 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