Attaching a slightly modified patch which applies cleanly to the 
parted in unstable (1.8.8.git.2009.07.19-5).
-- 
Jurij Smakov                                           ju...@wooyd.org
Key: http://www.wooyd.org/pgpkey/                      KeyID: C99E03CC
#! /bin/sh /usr/share/dpatch/dpatch-run
## sparc-new-label.dpatch by  <ju...@debian>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: No description.

@DPATCH@
diff -urNad parted-1.8.8.git.2009.07.19~/libparted/labels/sun.c 
parted-1.8.8.git.2009.07.19/libparted/labels/sun.c
--- parted-1.8.8.git.2009.07.19~/libparted/labels/sun.c 2009-07-19 
16:58:51.000000000 +0100
+++ parted-1.8.8.git.2009.07.19/libparted/labels/sun.c  2010-02-14 
12:45:39.000000000 +0000
@@ -41,12 +41,30 @@
 #define SUN_DISK_MAGIC         0xDABE  /* Disk magic number */
 #define SUN_DISK_MAXPARTITIONS 8
 
-#define WHOLE_DISK_ID          0x05
+#define SUN_TAG_UNASSIGNED     0x00    /* Unassigned partition */
+#define SUN_TAG_BOOT           0x01    /* Boot partition       */
+#define SUN_TAG_ROOT           0x02    /* Root filesystem      */
+#define SUN_TAG_SWAP           0x03    /* Swap partition       */
+#define SUN_TAG_USR            0x04    /* /usr filesystem      */
+#define SUN_TAG_BACKUP         0x05    /* Full-disk slice      */
+#define SUN_TAG_STAND          0x06    /* Stand partition      */
+#define SUN_TAG_VAR            0x07    /* /var filesystem      */
+#define SUN_TAG_HOME           0x08    /* /home filesystem     */
+#define SUN_TAG_ALTSCTR                0x09    /* Alt sector partition */
+#define SUN_TAG_CACHE          0x0a    /* Cachefs partition    */
+#define SUN_TAG_RESERVED       0x0b    /* SMI reserved data    */
+#define SUN_TAG_LINUX_SWAP     0x82    /* Linux SWAP           */
+#define SUN_TAG_LINUX_NATIVE   0x83    /* Linux filesystem     */
+#define SUN_TAG_LINUX_LVM      0x8e    /* Linux LVM            */
+#define SUN_TAG_LINUX_RAID     0xfd    /* LInux RAID           */
+
+#define SUN_FLAG_UNMNT         0x01    /* Unmountable partition*/
+#define SUN_FLAG_RONLY         0x10    /* Read only            */
+
 #define WHOLE_DISK_PART                2       /* as in 0, 1, 2 (3rd 
partition) */
-#define LINUX_SWAP_ID          0x82
 
 typedef struct _SunRawPartition     SunRawPartition;
-typedef struct _SunPartitionInfo    SunPartitionInfo;
+typedef struct _SunPartInfo         SunPartInfo;
 typedef struct _SunRawLabel         SunRawLabel;
 typedef struct _SunPartitionData    SunPartitionData;
 typedef struct _SunDiskData         SunDiskData;
@@ -56,18 +74,31 @@
        u_int32_t       num_sectors;    /* ...and it's length */
 };
 
-struct __attribute__ ((packed)) _SunPartitionInfo {
-       u_int8_t        spare1;
-       u_int8_t        id;             /* Partition type */
-       u_int8_t        spare2;
-       u_int8_t        flags;          /* Partition flags */
+struct __attribute__ ((packed)) _SunPartInfo {
+       u_int16_t       tag;            /* Tagged type */
+       u_int16_t       flags;          /* Partition flags */
 };
 
+#define SUN_LABEL_ID_SIZE      128
+#define SUN_VOLUME_ID_SIZE     8
+
+#define SUN_LABEL_VERSION      0x00000001
+#define SUN_LABEL_SANE         0x600ddeee
+
 struct __attribute__ ((packed)) _SunRawLabel {
-       char            info[128];      /* Informative text string */
-       u_int8_t        spare0[14];
-       SunPartitionInfo infos[SUN_DISK_MAXPARTITIONS];
-       u_int8_t        spare1[246];    /* Boot information etc. */
+       char            label_id[SUN_LABEL_ID_SIZE];    /* Informative text 
string */
+       u_int32_t       version;
+       char            volume_id[SUN_VOLUME_ID_SIZE];
+       u_int16_t       num_part;
+       SunPartInfo     infos[SUN_DISK_MAXPARTITIONS];
+       u_int16_t       pad1;
+       u_int32_t       bootinfo[3];
+       u_int32_t       sanity;
+       u_int32_t       resv[10];
+       u_int32_t       part_timestamps[SUN_DISK_MAXPARTITIONS];
+       u_int32_t       write_reinstruct;
+       u_int32_t       read_reinstruct;
+       u_int8_t        pad2[148];
        u_int16_t       rspeed;         /* Disk rotational speed */
        u_int16_t       pcylcount;      /* Physical cylinder count */
        u_int16_t       sparecyl;       /* extra sects per cylinder */
@@ -196,6 +227,9 @@
 
        /* #gentoo-sparc people agree that nacyl = 0 is the best option */
        label->magic    = PED_CPU_TO_BE16 (SUN_DISK_MAGIC);
+       label->version  = PED_CPU_TO_BE32 (SUN_LABEL_VERSION);
+       label->num_part = PED_CPU_TO_BE16 (SUN_DISK_MAXPARTITIONS);
+       label->sanity   = PED_CPU_TO_BE32 (SUN_LABEL_SANE);
        label->nacyl    = 0;
        label->pcylcount        = PED_CPU_TO_BE16 (bios_geom->cylinders);
        label->rspeed   = PED_CPU_TO_BE16 (5400);
@@ -206,13 +240,13 @@
        label->ncyl     = PED_CPU_TO_BE16 (bios_geom->cylinders - 0);
 
        /* Add a whole disk partition at a minimum */
-       label->infos[WHOLE_DISK_PART].id = WHOLE_DISK_ID;
+       label->infos[WHOLE_DISK_PART].tag = PED_CPU_TO_BE16 (SUN_TAG_BACKUP);
        label->partitions[WHOLE_DISK_PART].start_cylinder = 0;
        label->partitions[WHOLE_DISK_PART].num_sectors =
                PED_CPU_TO_BE32(bios_geom->cylinders * cyl_size);
 
        /* Now a neato string to describe this label */
-       snprintf(label->info, sizeof(label->info) - 1,
+       snprintf(label->label_id, sizeof(label->label_id) - 1,
                 "GNU Parted Custom cyl %d alt %d hd %d sec %d",
                 PED_BE16_TO_CPU(label->ncyl),
                 PED_BE16_TO_CPU(label->nacyl),
@@ -329,9 +363,9 @@
        for (i = 0; i < SUN_DISK_MAXPARTITIONS; i++) {
                if (!PED_BE32_TO_CPU(label->partitions[i].num_sectors))
                        continue;
-               if (!label->infos[i].id)
+               if (!label->infos[i].tag)
                        continue;
-               if (label->infos[i].id == WHOLE_DISK_ID)
+               if (label->infos[i].tag == PED_CPU_TO_BE16 (SUN_TAG_BACKUP))
                        continue;
 
                start = PED_BE32_TO_CPU(label->partitions[i].start_cylinder)
@@ -345,11 +379,11 @@
                        goto error;
 
                sun_data = part->disk_specific;
-               sun_data->type = label->infos[i].id;
-               sun_data->is_boot = sun_data->type == 0x1;
-               sun_data->is_root = sun_data->type == 0x2;
-               sun_data->is_lvm = sun_data->type == 0x8e;
-               sun_data->is_raid = sun_data->type == 0xfd;
+               sun_data->type = PED_BE16_TO_CPU (label->infos[i].tag);
+               sun_data->is_boot = sun_data->type == SUN_TAG_BOOT;
+               sun_data->is_root = sun_data->type == SUN_TAG_ROOT;
+               sun_data->is_lvm = sun_data->type == SUN_TAG_LINUX_LVM;
+               sun_data->is_raid = sun_data->type == SUN_TAG_LINUX_RAID;
 
                part->num = i + 1;
                part->fs_type = ped_file_system_probe (&part->geom);
@@ -377,7 +411,7 @@
 
        if (!ped_device_read (disk->dev, &old_label, 0, 1))
                return;
-       if (old_label.info [0]
+       if (old_label.label_id [0]
            && PED_BE16_TO_CPU (old_label.magic) == SUN_DISK_MAGIC)
                memcpy (&sun_specific->raw_label, &old_label, 512);
 }
@@ -402,7 +436,7 @@
        memset (label->partitions, 0,
                sizeof (SunRawPartition) * SUN_DISK_MAXPARTITIONS);
        memset (label->infos, 0,
-               sizeof (SunPartitionInfo) * SUN_DISK_MAXPARTITIONS);
+               sizeof (SunPartInfo) * SUN_DISK_MAXPARTITIONS);
 
        for (i = 0; i < SUN_DISK_MAXPARTITIONS; i++) {
                part = ped_disk_get_partition (disk, i + 1);
@@ -412,7 +446,7 @@
                           partition, so let's put it there for safety
                           sake.  */
 
-                       label->infos[i].id = WHOLE_DISK_ID;
+                       label->infos[i].tag = PED_CPU_TO_BE16 (SUN_TAG_BACKUP);
                        label->partitions[i].start_cylinder = 0;
                        label->partitions[i].num_sectors =
                                PED_CPU_TO_BE32(disk_data->length);
@@ -422,7 +456,7 @@
                        continue;
 
                sun_data = part->disk_specific;
-               label->infos[i].id = sun_data->type;
+               label->infos[i].tag = PED_CPU_TO_BE16 (sun_data->type);
                label->partitions[i].start_cylinder
                        = PED_CPU_TO_BE32 (part->geom.start
                                / (disk->dev->bios_geom.sectors
@@ -541,28 +575,28 @@
        part->fs_type = fs_type;
 
        if (sun_data->is_boot) {
-               sun_data->type = 0x1;
+               sun_data->type = SUN_TAG_BOOT;
                return 1;
        }
        if (sun_data->is_root) {
-               sun_data->type = 0x2;
+               sun_data->type = SUN_TAG_ROOT;
                return 1;
        }
        if (sun_data->is_lvm) {
-               sun_data->type = 0x8e;
+               sun_data->type = SUN_TAG_LINUX_LVM;
                return 1;
        }
        if (sun_data->is_raid) {
-               sun_data->type = 0xfd;
+               sun_data->type = SUN_TAG_LINUX_RAID;
                return 1;
        }
 
-       sun_data->type = 0x83;
+       sun_data->type = SUN_TAG_LINUX_NATIVE;
        if (fs_type) {
                if (is_linux_swap (fs_type->name))
-                       sun_data->type = 0x82;
+                       sun_data->type = SUN_TAG_LINUX_SWAP;
                else if (!strcmp (fs_type->name, "ufs"))
-                       sun_data->type = 0x6;
+                       sun_data->type = SUN_TAG_STAND;
        }
 
        return 1;

Reply via email to