On Fri, Feb 19, 2010 at 05:20:21PM +0100, Jim Meyering wrote:
> Would you please add a NEWS entry?
> If it's not too much to ask, would you also add a test

 Fixed, see below.

> Good timing, by the way.
> I'm expecting to make the parted-2.2 release early next week.

 Sorry for delay, I was busy with some other work.

    Karel


>From e43fa1aefae8f466ba8d4bb89392dca7e2f88ecf Mon Sep 17 00:00:00 2001
From: Karel Zak <k...@redhat.com>
Date: Fri, 19 Feb 2010 16:12:52 +0100
Subject: [PATCH] sun: initialize basic label fields

libparted completely ignores basic fields (version, nparts and sanity)
in the sun VTOC, then for example fdisk prints warnings for such
labels:

        # fdisk -lu /dev/sdb
        Detected sun disklabel with wrong version [0x00000000].
        Detected sun disklabel with wrong sanity [0x00000000].
        Detected sun disklabel with wrong num_partitions [0].

It seems that the current libparted sun support follows old Linux
kernel code, but the code was changed 3 years ago (see kernel commit
3961bae0ac030a70ae2e0578270203889021f1a1).

Note that the number of partitions (nparts) is optional for Linux
kernel, but fdisk(8) strictly requires SUN_DISK_MAXPARTITIONS (=8)
there. This patch sets nparts to SUN_DISK_MAXPARTITIONS rather then
use a real number of partitions.

The patch includes a new regression test for Sun label.

Signed-off-by: Karel Zak <k...@redhat.com>
---
 NEWS                    |    6 +++++
 libparted/labels/sun.c  |   20 ++++++++++++++++-
 tests/t4001-sun-vtoc.sh |   52 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 76 insertions(+), 2 deletions(-)
 create mode 100755 tests/t4001-sun-vtoc.sh

diff --git a/NEWS b/NEWS
index 30ca181..97b27d5 100644
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,12 @@ GNU parted NEWS                                    -*- 
outline -*-
   found to be corrupt.
   [bug introduced prior to parted-1.8.0]
 
+  sun: the version, sanity and nparts VTOC fields were ignored by libparted.
+  Those fields are properly initialized now. The nparts (number of partitions)
+  field is initialized to 8 (max. number of sun partitions) rather that to a
+  real number of partitions. This solution is compatible with Linux kernel 
+  and Linux fdisk.
+
   "make install" no longer installs tests programs named disk and label
 
   libparted: try harder to inform kernel of partition changes.
diff --git a/libparted/labels/sun.c b/libparted/labels/sun.c
index 9aeddcf..177a47c 100644
--- a/libparted/labels/sun.c
+++ b/libparted/labels/sun.c
@@ -44,6 +44,9 @@
 #define SUN_DISK_MAGIC         0xDABE  /* Disk magic number */
 #define SUN_DISK_MAXPARTITIONS 8
 
+#define SUN_VTOC_VERSION       1
+#define SUN_VTOC_SANITY                0x600DDEEE
+
 #define WHOLE_DISK_ID          0x05
 #define WHOLE_DISK_PART                2       /* as in 0, 1, 2 (3rd 
partition) */
 #define LINUX_SWAP_ID          0x82
@@ -68,9 +71,18 @@ struct __attribute__ ((packed)) _SunPartitionInfo {
 
 struct __attribute__ ((packed)) _SunRawLabel {
        char            info[128];      /* Informative text string */
-       u_int8_t        spare0[14];
+       u_int32_t       version;        /* Layout version */
+       u_int8_t        volume[8];      /* Volume name */
+       u_int16_t       nparts;         /* Number of partitions */
        SunPartitionInfo infos[SUN_DISK_MAXPARTITIONS];
-       u_int8_t        spare1[246];    /* Boot information etc. */
+       u_int16_t       padding;        /* Alignment padding */
+       u_int32_t       bootinfo[3];    /* Info needed by mboot */
+       u_int32_t       sanity;         /* To verify vtoc sanity */
+       u_int32_t       reserved[10];   /* Free space */
+       u_int32_t       timestamp[8];   /* Partition timestamp */
+       u_int32_t       write_reinstruct; /* sectors to skip, writes */
+       u_int32_t       read_reinstruct; /* sectors to skip, reads */
+       u_int8_t        spare1[148];    /* Padding */
        u_int16_t       rspeed;         /* Disk rotational speed */
        u_int16_t       pcylcount;      /* Physical cylinder count */
        u_int16_t       sparecyl;       /* extra sects per cylinder */
@@ -195,6 +207,10 @@ sun_alloc (const PedDevice* dev)
        label->nsect    = PED_CPU_TO_BE16 (bios_geom->sectors);
        label->ncyl     = PED_CPU_TO_BE16 (dev->length / cyl_size);
 
+       label->sanity   = PED_CPU_TO_BE32 (SUN_VTOC_SANITY);
+       label->version  = PED_CPU_TO_BE32 (SUN_VTOC_VERSION);
+       label->nparts   = PED_CPU_TO_BE16 (SUN_DISK_MAXPARTITIONS);
+
        /* Add a whole disk partition at a minimum */
        label->infos[WHOLE_DISK_PART].id = WHOLE_DISK_ID;
        label->partitions[WHOLE_DISK_PART].start_cylinder = 0;
diff --git a/tests/t4001-sun-vtoc.sh b/tests/t4001-sun-vtoc.sh
new file mode 100755
index 0000000..ca92c3f
--- /dev/null
+++ b/tests/t4001-sun-vtoc.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# Ensure that Sun VTOC is properly initialized.
+
+# Copyright (C) 2009-2010 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Written by Karel Zak <k...@redhat.com>
+
+test_description='test Sun VTOC initialization'
+
+: ${srcdir=.}
+. $srcdir/test-lib.sh
+
+N=2M
+dev=loop-file
+test_expect_success \
+    'create a file to simulate the underlying device' \
+    'dd if=/dev/null of=$dev bs=1 seek=$N 2> /dev/null'
+
+test_expect_success \
+    'label the test disk' \
+    'parted -s $dev mklabel sun > out 2>&1'
+test_expect_success 'expect no output' 'compare out /dev/null'
+
+test_expect_success \
+    'extract version' \
+    'od -t x1 -An -j128 -N4 $dev > out && echo " 00 00 00 01" > exp'
+test_expect_success 'expect it to be 00 00 00 01, not 00 00 00 00' 'compare 
out exp'
+
+test_expect_success \
+    'extract nparts' \
+    'od -t x1 -An -j140 -N2 $dev > out && echo " 00 08" > exp'
+test_expect_success 'expect it to be 00 08, not 00 00' 'compare out exp'
+
+test_expect_success \
+    'extract sanity magic' \
+    'od -t x1 -An -j188 -N4 $dev > out && echo " 60 0d de ee" > exp'
+test_expect_success 'expect it to be 60 0d de ee, not 00 00 00 00' 'compare 
out exp'
+
+test_done
-- 
1.6.6


_______________________________________________
parted-devel mailing list
parted-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/mailman/listinfo/parted-devel

Reply via email to