From 5c7b01233effe036e9cded5c95306450f5a8a498 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Fri, 3 Aug 2012 16:50:43 -0700 Subject: [PATCH] - use dm_udev_wait to synchronize with udev - use largest_partnum in dm_reread_part_table (#803108) - preserve the uuid on dm partitions (#832145) --- ....1-libparted-use-dm_udev_wait-698121.patch | 86 +++++++++++++++++ ...d-preserve-the-uuid-on-dm-partitions.patch | 71 ++++++++++++++ ...rgest_partnum-in-dm_reread_part_tabl.patch | 41 ++++++++ ...creating-20-device-mapper-partitions.patch | 94 +++++++++++++++++++ ...ts-Make-sure-dm-UUIDs-are-not-erased.patch | 92 ++++++++++++++++++ parted.spec | 12 ++- 6 files changed, 395 insertions(+), 1 deletion(-) create mode 100644 parted-2.1-libparted-use-dm_udev_wait-698121.patch create mode 100644 parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch create mode 100644 parted-3.1-libparted-use-largest_partnum-in-dm_reread_part_tabl.patch create mode 100644 parted-3.1-test-creating-20-device-mapper-partitions.patch create mode 100644 parted-3.1-tests-Make-sure-dm-UUIDs-are-not-erased.patch diff --git a/parted-2.1-libparted-use-dm_udev_wait-698121.patch b/parted-2.1-libparted-use-dm_udev_wait-698121.patch new file mode 100644 index 0000000..e60a7a2 --- /dev/null +++ b/parted-2.1-libparted-use-dm_udev_wait-698121.patch @@ -0,0 +1,86 @@ +From e3f74af78b774b235123b9d5fa40fead3b003bb2 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Fri, 20 Jan 2012 15:31:43 -0800 +Subject: [PATCH] libparted: use dm_udev_wait (#698121) + +This applies Peter Rajnoha's patch to use dm_udev_wait to +synchronize with udev. + +This requires libdevmapper v1.02.39 and higher. + +Patch is from: +https://lists.gnu.org/archive/html/bug-parted/2010-09/msg00007.html + +Resolves: rhbz#698121 +--- + libparted/arch/linux.c | 16 +++++++++++++++- + 1 files changed, 15 insertions(+), 1 deletions(-) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index e2c4139..1fcbcad 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -1319,6 +1319,10 @@ linux_new (const char* path) + dev->dirty = 0; + dev->boot_dirty = 0; + ++#ifdef ENABLE_DEVICE_MAPPER ++ dm_udev_set_sync_support(1); ++#endif ++ + if (!_device_probe_type (dev)) + goto error_free_arch_specific; + +@@ -2676,16 +2680,21 @@ static int + _dm_remove_map_name(char *name) + { + struct dm_task *task = NULL; +- int rc; ++ int rc = 0; ++ uint32_t cookie = 0; + + task = dm_task_create(DM_DEVICE_REMOVE); + if (!task) + return 1; + + dm_task_set_name (task, name); ++ if (!dm_task_set_cookie(task, &cookie, 0)) ++ goto err; + + rc = dm_task_run(task); ++ dm_udev_wait(cookie); + dm_task_update_nodes(); ++err: + dm_task_destroy(task); + if (!rc) + return 1; +@@ -2796,6 +2805,7 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + const char* dev_name = NULL; + char* params = NULL; + LinuxSpecific* arch_specific = LINUX_SPECIFIC (disk->dev); ++ uint32_t cookie = 0; + + /* Get map name from devicemapper */ + struct dm_task *task = dm_task_create (DM_DEVICE_INFO); +@@ -2832,14 +2842,18 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + dm_task_set_name (task, vol_name); + dm_task_add_target (task, 0, part->geom.length, + "linear", params); ++ if (!dm_task_set_cookie(task, &cookie, 0)) ++ goto err; + if (dm_task_run (task)) { + //printf("0 %ld linear %s\n", part->geom.length, params); ++ dm_udev_wait(cookie); + dm_task_update_nodes(); + dm_task_destroy(task); + free(params); + free(vol_name); + return 1; + } else { ++ dm_udev_wait(cookie); + _dm_remove_map_name(vol_name); + } + err: +-- +1.7.7.6 + diff --git a/parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch b/parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch new file mode 100644 index 0000000..805ee07 --- /dev/null +++ b/parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch @@ -0,0 +1,71 @@ +From 399cfc2a9cfc60a46ab9094b4c999bb11a36033e Mon Sep 17 00:00:00 2001 +From: Fedora Ninjas +Date: Fri, 3 Aug 2012 17:03:50 -0700 +Subject: [PATCH] libparted: preserve the uuid on dm partitions (#832145) + +* libparted/arch/linux.c (_dm_add_partition): Set the uuid if there was + one. +--- + libparted/arch/linux.c | 11 +++++++++++ + 1 files changed, 11 insertions(+), 0 deletions(-) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 37ddb5f..9f0434a 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -2803,6 +2803,8 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + { + char* vol_name = NULL; + const char* dev_name = NULL; ++ char* vol_uuid = NULL; ++ const char* dev_uuid = NULL; + char* params = NULL; + LinuxSpecific* arch_specific = LINUX_SPECIFIC (disk->dev); + uint32_t cookie = 0; +@@ -2820,6 +2822,7 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + goto err; + + dev_name = dm_task_get_name (task); ++ dev_uuid = dm_task_get_uuid (task); + + if (isdigit (dev_name[strlen (dev_name) - 1])) { + if ( ! (vol_name = zasprintf ("%sp%d", dev_name, part->num))) +@@ -2827,6 +2830,10 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + } else if ( ! (vol_name = zasprintf ("%s%d", dev_name, part->num))) + goto err; + ++ if ( dev_uuid && (strlen(dev_uuid) > 0) \ ++ && ! (vol_uuid = zasprintf ("%sp%d", dev_uuid, part->num))) ++ goto err; ++ + /* Caution: dm_task_destroy frees dev_name. */ + dm_task_destroy (task); + task = NULL; +@@ -2840,6 +2847,8 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + goto err; + + dm_task_set_name (task, vol_name); ++ if (vol_uuid) ++ dm_task_set_uuid (task, vol_uuid); + dm_task_add_target (task, 0, part->geom.length, + "linear", params); + if (!dm_task_set_cookie(task, &cookie, 0)) +@@ -2850,6 +2859,7 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + dm_task_update_nodes(); + dm_task_destroy(task); + free(params); ++ free(vol_uuid); + free(vol_name); + return 1; + } else { +@@ -2861,6 +2871,7 @@ err: + if (task) + dm_task_destroy (task); + free (params); ++ free (vol_uuid); + free (vol_name); + return 0; + } +-- +1.7.7.6 + diff --git a/parted-3.1-libparted-use-largest_partnum-in-dm_reread_part_tabl.patch b/parted-3.1-libparted-use-largest_partnum-in-dm_reread_part_tabl.patch new file mode 100644 index 0000000..2302751 --- /dev/null +++ b/parted-3.1-libparted-use-largest_partnum-in-dm_reread_part_tabl.patch @@ -0,0 +1,41 @@ +From 26fbffe8389e732be29225bd649adfdd5588b131 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 21 Mar 2012 15:34:20 -0700 +Subject: [PATCH] libparted: use largest_partnum in dm_reread_part_table + (#803108) + +DM devices can have more than 16 partitions, notify the kernel about +all of them. + +Resolves: rhbz#803108 + +* libparted/arch/linux.c (dm_reread_part_table): Use largest_partnum + +fixup +--- + libparted/arch/linux.c | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 7dd664e..ed14f50 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -2516,14 +2516,13 @@ _dm_reread_part_table (PedDisk* disk) + return 1; + + int rc = 1; +- int last = PED_MIN (largest_partnum, 16); + int i; + + sync(); + if (!_dm_remove_parts(disk->dev)) + rc = 0; + +- for (i = 1; i <= last; i++) { ++ for (i = 1; i <= largest_partnum; i++) { + PedPartition* part; + + part = ped_disk_get_partition (disk, i); +-- +1.7.7.6 + diff --git a/parted-3.1-test-creating-20-device-mapper-partitions.patch b/parted-3.1-test-creating-20-device-mapper-partitions.patch new file mode 100644 index 0000000..8a860e7 --- /dev/null +++ b/parted-3.1-test-creating-20-device-mapper-partitions.patch @@ -0,0 +1,94 @@ +From 166491bd870df6877e04831c9da593e2f8e77ca8 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Thu, 19 Apr 2012 17:11:09 -0700 +Subject: [PATCH] tests: test creating 20 device-mapper partitions (#803108) + +* tests/t6002-dm-many-partitions.sh: Make sure > 17 partitions appear in + device mapper. +--- + tests/Makefile.am | 1 + + tests/t6002-dm-many-partitions.sh | 60 +++++++++++++++++++++++++++++++++++++ + 2 files changed, 61 insertions(+), 0 deletions(-) + create mode 100755 tests/t6002-dm-many-partitions.sh + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 1b37fd9..57771be 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -55,6 +55,7 @@ TESTS = \ + t5000-tags.sh \ + t6000-dm.sh \ + t6001-psep.sh \ ++ t6002-dm-many-partitions.sh \ + t6100-mdraid-partitions.sh \ + t7000-scripting.sh \ + t8000-loop.sh \ +diff --git a/tests/t6002-dm-many-partitions.sh b/tests/t6002-dm-many-partitions.sh +new file mode 100755 +index 0000000..4d08e72 +--- /dev/null ++++ b/tests/t6002-dm-many-partitions.sh +@@ -0,0 +1,60 @@ ++#!/bin/sh ++# device-mapper: create many partitions ++# This would not create partitions > 16 when using device-mapper ++ ++# Copyright (C) 2012 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 ++ ++require_root_ ++(dmsetup --help) > /dev/null 2>&1 || skip_test_ "No dmsetup installed" ++ ++ss=$sector_size_ ++ns=300 ++n_partitions=20 ++start_sector=34 ++loop_file=loop-file-$$ ++dm_name=dm-test-$$ ++ ++cleanup_() { ++ dmsetup remove $dm_name ++ test -n "$dev" && losetup -d "$dev" ++ rm -f $loop_file; ++} ++ ++# create a file large enough to hold a GPT partition table ++dd if=/dev/null of=$loop_file bs=$ss seek=$ns || framework_failure ++dev=$(losetup --show -f $loop_file) || framework_failure ++dmsetup create $dm_name --table "0 $ns linear $dev 0" || framework_failure ++ ++cmd= ++for ((i=1; i<=$n_partitions; i+=1)); do ++ s=$((start_sector + i - 1)) ++ cmd="$cmd mkpart p$i ${s}s ${s}s" ++done ++parted -m -a min -s /dev/mapper/$dm_name mklabel gpt $cmd > /dev/null 2>&1 || fail=1 ++ ++# Make sure all the partitions appeared under /dev/mapper/ ++for ((i=1; i<=$n_partitions; i+=1)); do ++ if [ ! -e "/dev/mapper/${dm_name}p$i" ]; then ++ fail=1 ++ break ++ fi ++ # remove the partitions as we go, otherwise cleanup won't work. ++ dmsetup remove /dev/mapper/${dm_name}p$i ++done ++ ++Exit $fail +-- +1.7.7.6 + diff --git a/parted-3.1-tests-Make-sure-dm-UUIDs-are-not-erased.patch b/parted-3.1-tests-Make-sure-dm-UUIDs-are-not-erased.patch new file mode 100644 index 0000000..342225d --- /dev/null +++ b/parted-3.1-tests-Make-sure-dm-UUIDs-are-not-erased.patch @@ -0,0 +1,92 @@ +From cc96f793bb4fb088123a40fb9d802e7db1fdbffb Mon Sep 17 00:00:00 2001 +From: Fedora Ninjas +Date: Tue, 7 Aug 2012 10:14:03 -0700 +Subject: [PATCH] tests: Make sure dm UUIDs are not erased + +* tests/t6003-dm-uuid.sh: Make sure dm UUIDs are not erased +--- + tests/Makefile.am | 1 + + tests/t6003-dm-uuid.sh | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 60 insertions(+), 0 deletions(-) + create mode 100755 tests/t6003-dm-uuid.sh + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 57771be..98310f2 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -56,6 +56,7 @@ TESTS = \ + t6000-dm.sh \ + t6001-psep.sh \ + t6002-dm-many-partitions.sh \ ++ t6003-dm-uuid.sh \ + t6100-mdraid-partitions.sh \ + t7000-scripting.sh \ + t8000-loop.sh \ +diff --git a/tests/t6003-dm-uuid.sh b/tests/t6003-dm-uuid.sh +new file mode 100755 +index 0000000..1751cb4 +--- /dev/null ++++ b/tests/t6003-dm-uuid.sh +@@ -0,0 +1,59 @@ ++#!/bin/sh ++# device-mapper: preserve uuid ++# The dm's partitions uuid would be removed when creating new partitions ++ ++# Copyright (C) 2012 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 ++ ++require_root_ ++(dmsetup --help) > /dev/null 2>&1 || skip_test_ "No dmsetup installed" ++ ++ss=$sector_size_ ++ns=300 ++n_partitions=3 ++start_sector=34 ++loop_file=loop-file-$$ ++dm_name=dm-test-$$ ++ ++cleanup_() { ++ dmsetup remove $dm_name ++ test -n "$dev" && losetup -d "$dev" ++ rm -f $loop_file; ++} ++ ++# create a file large enough to hold a GPT partition table ++dd if=/dev/null of=$loop_file bs=$ss seek=$ns || framework_failure ++dev=$(losetup --show -f $loop_file) || framework_failure ++dmsetup create $dm_name --table "0 $ns linear $dev 0" || framework_failure ++dmsetup rename $dm_name --setuuid f139317b-f98a-45d7-ab3b-9b4e0a336872 || framework_failure ++ ++cmd= ++for ((i=1; i<=$n_partitions; i+=1)); do ++ s=$((start_sector + i - 1)) ++ cmd="$cmd mkpart p$i ${s}s ${s}s" ++done ++parted -m -a min -s /dev/mapper/$dm_name mklabel gpt $cmd > /dev/null 2>&1 || fail=1 ++ ++# Make sure all the partitions have UUIDs ++for ((i=1; i<=$n_partitions; i+=1)); do ++ dmsetup info /dev/mapper/${dm_name}p$i | grep UUID || fail=1 ++ ++ # remove the partitions as we go, otherwise cleanup won't work. ++ dmsetup remove /dev/mapper/${dm_name}p$i ++done ++ ++Exit $fail +-- +1.7.7.6 + diff --git a/parted.spec b/parted.spec index 7a1aef9..a9cb6b2 100644 --- a/parted.spec +++ b/parted.spec @@ -4,7 +4,7 @@ Summary: The GNU disk partition manipulation program Name: parted Version: 3.1 -Release: 5%{?dist} +Release: 6%{?dist} License: GPLv3+ Group: Applications/System URL: http://www.gnu.org/software/parted @@ -17,6 +17,11 @@ Patch0: parted-3.0-libparted-copy-pmbr_boot-when-duplicating-GPT-disk.patch Patch1: parted-3.1-libparted-check-PMBR-before-GPT-partition-table-8052.patch Patch2: parted-3.1-tests-add-t0301-overwrite-gpt-pmbr.sh.patch Patch3: parted-3.1-libparted-Fix-endian-error-with-FirstUsableLBA.patch +Patch4: parted-2.1-libparted-use-dm_udev_wait-698121.patch +Patch5: parted-3.1-libparted-use-largest_partnum-in-dm_reread_part_tabl.patch +patch6: parted-3.1-test-creating-20-device-mapper-partitions.patch +Patch7: parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch +Patch8: parted-3.1-tests-Make-sure-dm-UUIDs-are-not-erased.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: e2fsprogs-devel @@ -152,6 +157,11 @@ fi %changelog +* Fri Aug 03 2012 Brian C. Lane 3.1-6 +- Use dm_udev_wait for dm operations (#844257) (bcl) +- use largest_partnum in _dm_reread_part_table (bcl) +- set uuid on dm partitions (#832145) (bcl) + * Fri Jul 20 2012 Fedora Release Engineering - 3.1-5 - Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild