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