From 68bb9e0f50b412907950d8553baccde7e225c32c Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 31 Oct 2011 14:56:09 -0700 Subject: [PATCH] - Fix ped_disk_duplicate on GPT so that it copies the partition flags (#747947) - Add new test to check ped_disk_duplicate on msdos, gpt, bsd disk labels - Add e2fsprogs and dosfstools so that skipped tests will be run --- ...lags-when-duplicating-GPT-partitions.patch | 53 +++++ ...new-test-to-check-ped_disk_duplicate.patch | 210 ++++++++++++++++++ parted.spec | 12 +- 3 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 parted-3.0-libparted-copy-flags-when-duplicating-GPT-partitions.patch create mode 100644 parted-3.0-tests-add-new-test-to-check-ped_disk_duplicate.patch diff --git a/parted-3.0-libparted-copy-flags-when-duplicating-GPT-partitions.patch b/parted-3.0-libparted-copy-flags-when-duplicating-GPT-partitions.patch new file mode 100644 index 0000000..4ab8b6f --- /dev/null +++ b/parted-3.0-libparted-copy-flags-when-duplicating-GPT-partitions.patch @@ -0,0 +1,53 @@ +From e356e46263c93f0ffdcd830d9f4d051fc961067e Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Thu, 27 Oct 2011 16:29:15 -0700 +Subject: [PATCH 1/2] libparted: copy flags when duplicating GPT partitions + + * libparted/labels/gpt.c (gpt_partition_duplicate): copy flags to new + partition. + * NEWS: Mention this fix. +--- + NEWS | 3 +++ + libparted/labels/gpt.c | 12 ++++++++++++ + 2 files changed, 15 insertions(+), 0 deletions(-) + +diff --git a/NEWS b/NEWS +index b7fb56b..915b5ff 100644 +--- a/NEWS ++++ b/NEWS +@@ -8,6 +8,9 @@ GNU parted NEWS -*- outline -*- + + ** Bug fixes + ++ libparted: gpt_disk_duplicate now copies the flags over to the new ++ disk object. Previously the flags would be undefined. ++ + libparted: no longer aborts (failed assertion) due to a nilfs2_probe bug + [bug introduced in parted-2.4 with the addition of nilfs2 support] + +diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c +index 8c9816f..7b4e014 100644 +--- a/libparted/labels/gpt.c ++++ b/libparted/labels/gpt.c +@@ -1365,6 +1365,18 @@ gpt_partition_duplicate (const PedPartition *part) + result_data->type = part_data->type; + result_data->uuid = part_data->uuid; + strcpy (result_data->name, part_data->name); ++ ++ /* Copy over all the flags */ ++ result_data->lvm = part_data->lvm; ++ result_data->raid = part_data->raid; ++ result_data->boot = part_data->boot; ++ result_data->bios_grub = part_data->bios_grub; ++ result_data->hp_service = part_data->hp_service; ++ result_data->hidden = part_data->hidden; ++ result_data->msftres = part_data->msftres; ++ result_data->atvrecv = part_data->atvrecv; ++ result_data->msftrecv = part_data->msftrecv; ++ result_data->legacy_boot = part_data->legacy_boot; + return result; + + error_free_part: +-- +1.7.6.4 + diff --git a/parted-3.0-tests-add-new-test-to-check-ped_disk_duplicate.patch b/parted-3.0-tests-add-new-test-to-check-ped_disk_duplicate.patch new file mode 100644 index 0000000..00c05e4 --- /dev/null +++ b/parted-3.0-tests-add-new-test-to-check-ped_disk_duplicate.patch @@ -0,0 +1,210 @@ +From 1fad3afd9587de566b2f3b451ed4de2fc409ad21 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Mon, 31 Oct 2011 14:30:12 -0700 +Subject: [PATCH 2/2] tests: add new test to check ped_disk_duplicate + + * tests/duplicate.c: New test + * tests/t0501-duplicate.sh: New test program + * tests/Makefile.am (TEST): Add new test + (check_PROGRAMS): Add new test program +--- + tests/Makefile.am | 3 +- + tests/duplicate.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++ + tests/t0501-duplicate.sh | 28 ++++++++++ + 3 files changed, 159 insertions(+), 1 deletions(-) + create mode 100644 tests/duplicate.c + create mode 100644 tests/t0501-duplicate.sh + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 5a8a539..ae4c5f4 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -24,6 +24,7 @@ TESTS = \ + t0300-dos-on-gpt.sh \ + t0400-loop-clobber-infloop.sh \ + t0500-dup-clobber.sh \ ++ t0501-duplicate.sh \ + t1100-busy-label.sh \ + t1101-busy-partition.sh \ + t1700-probe-fs.sh \ +@@ -62,7 +63,7 @@ EXTRA_DIST = \ + $(TESTS) lvm-utils.sh t-local.sh t-lvm.sh \ + init.cfg init.sh t-lib-helpers.sh + +-check_PROGRAMS = print-align print-max dup-clobber ++check_PROGRAMS = print-align print-max dup-clobber duplicate + LDADD = \ + $(top_builddir)/libparted/libparted.la + AM_CPPFLAGS = \ +diff --git a/tests/duplicate.c b/tests/duplicate.c +new file mode 100644 +index 0000000..5af8543 +--- /dev/null ++++ b/tests/duplicate.c +@@ -0,0 +1,129 @@ ++/* Demonstrate that ped_disk_duplicate is working correctly. ++*/ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "closeout.h" ++#include "progname.h" ++ ++int ++main (int argc, char **argv) ++{ ++ atexit (close_stdout); ++ set_program_name (argv[0]); ++ ++ if (argc != 2) ++ return EXIT_FAILURE; ++ ++ char const *dev_name = "dev-file"; ++ ++ /* Create a file. */ ++ int fd = open (dev_name, O_CREAT|O_TRUNC|O_WRONLY, 0644); ++ assert (0 <= fd); ++ off_t size = 8 * 1024 * 1024; ++ assert (ftruncate (fd, size) == 0); ++ assert (close (fd) == 0); ++ ++ PedDevice *dev = ped_device_get (dev_name); ++ assert (dev); ++ ++ PedDisk *disk = ped_disk_new_fresh (dev, ped_disk_type_get (argv[1])); ++ assert (disk); ++ assert (ped_disk_commit(disk)); ++ ped_disk_destroy (disk); ++ ++ /* re-open the disk */ ++ disk = ped_disk_new (dev); ++ assert (disk); ++ ++ /* Create a partition */ ++ const PedFileSystemType *fs_type = ped_file_system_type_get ("ext2"); ++ assert (fs_type); ++ PedPartitionType part_type = PED_PARTITION_NORMAL; ++ const PedGeometry *geometry = ped_geometry_new (dev, 34, 1024); ++ assert (geometry); ++ PedPartition *part = ped_partition_new (disk, part_type, fs_type, geometry->start, geometry->end); ++ assert (part); ++ PedConstraint *constraint = ped_constraint_exact (geometry); ++ assert (constraint); ++ ++ if (ped_partition_is_flag_available (part, PED_PARTITION_BOOT)) ++ assert (ped_partition_set_flag (part, PED_PARTITION_BOOT, 1)); ++ ++ assert (ped_disk_add_partition (disk, part, constraint)); ++ ped_constraint_destroy (constraint); ++ ++ assert (ped_partition_set_system (part, fs_type)); ++ if (ped_partition_is_flag_available (part, PED_PARTITION_LBA)) ++ ped_partition_set_flag (part, PED_PARTITION_LBA, 1); ++ ++ assert (ped_disk_commit(disk)); ++ ++ /* Duplicate it */ ++ PedDisk *copy = ped_disk_duplicate (disk); ++ assert (ped_disk_commit(copy)); ++ ++ /* Compare the two copies */ ++ ++ /* Check the device */ ++ assert (strcmp (disk->dev->model, copy->dev->model) == 0); ++ assert (strcmp (disk->dev->path, copy->dev->path) == 0); ++ assert (disk->dev->sector_size == copy->dev->sector_size); ++ assert (disk->dev->phys_sector_size == copy->dev->phys_sector_size); ++ assert (disk->dev->length == copy->dev->length); ++ ++ /* Check the type */ ++ assert (strcmp (disk->type->name, copy->type->name) == 0); ++ assert (disk->type->features == copy->type->features); ++ ++ /* Check the flags */ ++ for (PedDiskFlag flag = PED_DISK_FIRST_FLAG; flag <= PED_DISK_LAST_FLAG; flag++) { ++ if (!ped_disk_is_flag_available(disk, flag)) ++ continue; ++ assert (ped_disk_get_flag (disk, flag) == ped_disk_get_flag (copy, flag)); ++ } ++ ++ /* Check the partitions */ ++ PedPartition *disk_part, *copy_part; ++ for ( disk_part = disk->part_list, copy_part = copy->part_list; ++ disk_part && copy_part; ++ disk_part = disk_part->next, copy_part = copy_part->next) ++ { ++ /* Only active partitions are duplicated */ ++ if (!ped_partition_is_active (disk_part)) ++ continue; ++ ++ assert (disk_part->geom.start == copy_part->geom.start); ++ assert (disk_part->geom.end == copy_part->geom.end); ++ assert (disk_part->geom.length == copy_part->geom.length); ++ assert (disk_part->num == copy_part->num); ++ assert (disk_part->type == copy_part->type); ++ ++ if (disk_part->fs_type && disk_part->fs_type->name) { ++ assert (strcmp (disk_part->fs_type->name, copy_part->fs_type->name) == 0); ++ } ++ ++ /* Check the flags */ ++ for (PedPartitionFlag flag = PED_PARTITION_FIRST_FLAG; flag <= PED_PARTITION_LAST_FLAG; flag++) { ++ if (!ped_partition_is_flag_available(disk_part, flag)) ++ continue; ++ fprintf (stderr, "Checking partition flag %d\n", flag); ++ fprintf (stderr, "%d ? %d\n", ped_partition_get_flag (disk_part, flag), ped_partition_get_flag (copy_part, flag)); ++ assert (ped_partition_get_flag (disk_part, flag) == ped_partition_get_flag (copy_part, flag)); ++ } ++ } ++ ++ /* Cleanup the mess */ ++ ped_disk_destroy (copy); ++ ped_disk_destroy (disk); ++ ped_device_destroy (dev); ++ ++ return EXIT_SUCCESS; ++} +diff --git a/tests/t0501-duplicate.sh b/tests/t0501-duplicate.sh +new file mode 100644 +index 0000000..0585a95 +--- /dev/null ++++ b/tests/t0501-duplicate.sh +@@ -0,0 +1,28 @@ ++#!/bin/sh ++# Drive the dup-clobber program. ++ ++# Copyright (C) 2011 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 . ++ ++. "${srcdir=.}/init.sh"; path_prepend_ ../parted ++ ++PATH="..:$PATH" ++export PATH ++ ++for t in msdos gpt bsd; do ++ duplicate $t || fail=1 ++done ++ ++Exit $fail +-- +1.7.6.4 + diff --git a/parted.spec b/parted.spec index efddf4a..59abb90 100644 --- a/parted.spec +++ b/parted.spec @@ -4,7 +4,7 @@ Summary: The GNU disk partition manipulation program Name: parted Version: 3.0 -Release: 3%{?dist} +Release: 4%{?dist} License: GPLv3+ Group: Applications/System URL: http://www.gnu.org/software/parted @@ -30,6 +30,9 @@ Patch9: parted-3.0-tests-test-for-the-nilfs2-bug.patch Patch10: parted-3.0-libparted-Fix-a-bug-in-the-hfs-probe-functions-71475.patch Patch11: parted-3.0-libparted-make-pc98-detection-depend-on-signatures.patch Patch12: parted-3.0-tests-add-tests-for-new-pc98-signatures-646053.patch +Patch13: parted-3.0-libparted-copy-flags-when-duplicating-GPT-partitions.patch +Patch14: parted-3.0-tests-add-new-test-to-check-ped_disk_duplicate.patch + Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: e2fsprogs-devel @@ -44,6 +47,8 @@ BuildRequires: libblkid-devel >= 2.17 BuildRequires: gnupg BuildRequires: git BuildRequires: autoconf automake +BuildRequires: e2fsprogs +BuildRequires: dosfstools Requires(post): /sbin/ldconfig Requires(post): /sbin/install-info @@ -158,6 +163,11 @@ fi %changelog +* Mon Oct 31 2011 Brian C. Lane - 3.0-4 +- Fix ped_disk_duplicate on GPT so that it copies the partition flags (#747947) +- Add new test to check ped_disk_duplicate on msdos, gpt, bsd disk labels +- Add e2fsprogs and dosfstools so that skipped tests will be run + * Fri Oct 07 2011 Brian C. Lane - 3.0-3 - Fix handling of zero-length gpt partitions (#728949) - Fix bug in nilfs2 probe with short partitions (#728949)