From 13386670d031a92365c5ae975a527750c0aa0029 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 14 Jul 2014 14:44:27 -0700 Subject: [PATCH] - Rebase on parted master commit 081ed98 - libparted: Add support for partition resize - parted: add resizepart command --- ...parted-Fix-part-dupe-with-empty-name.patch | 6 +- 0124-tests-check-name-when-duplicating.patch | 6 +- ...python-test-scripts-for-distribution.patch | 6 +- 0126-parted-add-resizepart-command.patch | 146 ++++++++ 0127-tests-excersise-resize-command.patch | 122 +++++++ ...ted-Add-support-for-partition-resize.patch | 331 ++++++++++++++++++ ...tition_warn_busy-actually-a-warning-.patch | 105 ++++++ 0130-parted-Allow-undocumented-commands.patch | 28 ++ ...resize-command-for-backward-compatib.patch | 50 +++ 0132-Document-resizepart-command.patch | 62 ++++ 0133-tests-fix-t9020-alignment.sh.patch | 28 ++ ...int-correct-a-POT-file-updating-rule.patch | 26 ++ parted.spec | 16 +- 13 files changed, 922 insertions(+), 10 deletions(-) create mode 100644 0126-parted-add-resizepart-command.patch create mode 100644 0127-tests-excersise-resize-command.patch create mode 100644 0128-libparted-Add-support-for-partition-resize.patch create mode 100644 0129-parted-make-_partition_warn_busy-actually-a-warning-.patch create mode 100644 0130-parted-Allow-undocumented-commands.patch create mode 100644 0131-parted-Add-stub-resize-command-for-backward-compatib.patch create mode 100644 0132-Document-resizepart-command.patch create mode 100644 0133-tests-fix-t9020-alignment.sh.patch create mode 100644 0134-maint-correct-a-POT-file-updating-rule.patch diff --git a/0123-libparted-Fix-part-dupe-with-empty-name.patch b/0123-libparted-Fix-part-dupe-with-empty-name.patch index cf34bfe..5174042 100644 --- a/0123-libparted-Fix-part-dupe-with-empty-name.patch +++ b/0123-libparted-Fix-part-dupe-with-empty-name.patch @@ -1,7 +1,7 @@ -From f688c5a7910e1e5f81e8bd0e48a9ed64ec6b2a47 Mon Sep 17 00:00:00 2001 +From 06241515a818dcf62e7c5728a8328cf165e3a793 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" -Date: Wed, 16 Apr 2014 18:18:38 -0700 -Subject: [PATCH 123/125] libparted: Fix part dupe with empty name +Date: Wed, 11 Jun 2014 12:13:48 -0700 +Subject: [PATCH 123/134] libparted: Fix part dupe with empty name It was setting the original translated_name to 0, not the new copy. diff --git a/0124-tests-check-name-when-duplicating.patch b/0124-tests-check-name-when-duplicating.patch index d66da4e..084241d 100644 --- a/0124-tests-check-name-when-duplicating.patch +++ b/0124-tests-check-name-when-duplicating.patch @@ -1,7 +1,7 @@ -From d285d03becdcd96bdc6062224273e297fb12707e Mon Sep 17 00:00:00 2001 +From 8d2c819b9ec89ca7c29c061eb2fd438c3876d6f8 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" -Date: Wed, 16 Apr 2014 16:51:18 -0700 -Subject: [PATCH 124/125] tests: check name when duplicating +Date: Wed, 11 Jun 2014 12:13:49 -0700 +Subject: [PATCH 124/134] tests: check name when duplicating Create a second partition with a name when supported by the disk label. Check to make sure that the duplicate has copied over the name. The goal diff --git a/0125-Fix-python-test-scripts-for-distribution.patch b/0125-Fix-python-test-scripts-for-distribution.patch index db285ff..0370535 100644 --- a/0125-Fix-python-test-scripts-for-distribution.patch +++ b/0125-Fix-python-test-scripts-for-distribution.patch @@ -1,7 +1,7 @@ -From 78ba2fe96dc7f39e585c508bfbc3549cc50aefff Mon Sep 17 00:00:00 2001 +From e8078b3a7b7652aa5f9ee6e09f3c6b21d2810b07 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" -Date: Wed, 11 Jun 2014 11:00:39 -0700 -Subject: [PATCH 125/125] Fix python test scripts for distribution +Date: Wed, 11 Jun 2014 12:13:50 -0700 +Subject: [PATCH 125/134] Fix python test scripts for distribution make distcheck was failing because these scripts were not being included. diff --git a/0126-parted-add-resizepart-command.patch b/0126-parted-add-resizepart-command.patch new file mode 100644 index 0000000..150441e --- /dev/null +++ b/0126-parted-add-resizepart-command.patch @@ -0,0 +1,146 @@ +From 21c58e17c473ea8ef31a18d03348eb2381c0f36c Mon Sep 17 00:00:00 2001 +From: Petr Uzel +Date: Mon, 26 Sep 2011 17:21:01 +0200 +Subject: [PATCH 126/134] parted: add resizepart command + +Add resizepart command to resize ( change the end position ) an existing +partition. Note that it does nothing to a filesystem in the partition. +--- + NEWS | 2 ++ + parted/parted.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 88 insertions(+) + +diff --git a/NEWS b/NEWS +index 3de5dde..7069020 100644 +--- a/NEWS ++++ b/NEWS +@@ -4,6 +4,8 @@ GNU parted NEWS -*- outline -*- + + ** New Features + ++ Add resizepart command to resize a partition ++ + Add support for EAV DASD partitions, which are ECKD's with more than + 65520 cylinders. + +diff --git a/parted/parted.c b/parted/parted.c +index 3bf03ea..a36ca28 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -153,6 +153,9 @@ static const char* fs_type_msg_start = N_("FS-TYPE is one of: "); + static const char* start_end_msg = N_("START and END are disk locations, such as " + "4GB or 10%. Negative values count from the end of the disk. " + "For example, -1s specifies exactly the last sector.\n"); ++static const char* end_msg = N_("END is disk location, such as " ++ "4GB or 10%. Negative value counts from the end of the disk. " ++ "For example, -1s specifies exactly the last sector.\n"); + static const char* state_msg = N_("STATE is one of: on, off\n"); + static const char* device_msg = N_("DEVICE is usually /dev/hda or /dev/sda\n"); + static const char* name_msg = N_("NAME is any word you want\n"); +@@ -437,6 +440,21 @@ constraint_from_start_end (PedDevice* dev, PedGeometry* range_start, + range_start, range_end, 1, dev->length); + } + ++ ++static PedConstraint* ++constraint_from_start_end_fixed_start (PedDevice* dev, PedSector start_sector, ++ PedGeometry* range_end) ++{ ++ PedGeometry range_start; ++ range_start.dev = dev; ++ range_start.start = start_sector; ++ range_start.end = start_sector; ++ range_start.length = 1; ++ ++ return ped_constraint_new (ped_alignment_any, ped_alignment_any, ++ &range_start, range_end, 1, dev->length); ++} ++ + void + help_on (char* topic) + { +@@ -1484,6 +1502,66 @@ error: + } + + static int ++do_resizepart (PedDevice** dev, PedDisk** diskp) ++{ ++ PedDisk *disk = *diskp; ++ PedPartition *part = NULL; ++ PedSector start, end, oldend; ++ PedGeometry *range_end = NULL; ++ PedConstraint* constraint; ++ int rc = 0; ++ ++ if (!disk) { ++ disk = ped_disk_new (*dev); ++ *diskp = disk; ++ } ++ if (!disk) ++ goto error; ++ ++ if (ped_disk_is_flag_available(disk, PED_DISK_CYLINDER_ALIGNMENT)) ++ if (!ped_disk_set_flag(disk, PED_DISK_CYLINDER_ALIGNMENT, ++ alignment == ALIGNMENT_CYLINDER)) ++ goto error; ++ ++ if (!command_line_get_partition (_("Partition number?"), disk, &part)) ++ goto error; ++ if (!_partition_warn_busy (part)) ++ goto error; ++ ++ start = part->geom.start; ++ end = oldend = part->geom.end; ++ if (!command_line_get_sector (_("End?"), *dev, &end, &range_end, NULL)) ++ goto error; ++ /* Do not move start of the partition */ ++ constraint = constraint_from_start_end_fixed_start (*dev, start, range_end); ++ if (!ped_disk_set_partition_geom (disk, part, constraint, ++ start, end)) ++ goto error_destroy_constraint; ++ /* warn when shrinking partition - might lose data */ ++ if (part->geom.end < oldend) ++ if (ped_exception_throw ( ++ PED_EXCEPTION_WARNING, ++ PED_EXCEPTION_YES_NO, ++ _("Shrinking a partition can cause data loss, " \ ++ "are you sure you want to continue?")) != PED_EXCEPTION_YES) ++ goto error_destroy_constraint; ++ ped_disk_commit (disk); ++ ++ if ((*dev)->type != PED_DEVICE_FILE) ++ disk_is_modified = 1; ++ ++ rc = 1; ++ ++error_destroy_constraint: ++ ped_constraint_destroy (constraint); ++error: ++ if (range_end != NULL) ++ ped_geometry_destroy (range_end); ++ return rc; ++} ++ ++ ++static int + do_rm (PedDevice** dev, PedDisk** diskp) + { + PedPartition* part = NULL; +@@ -1906,6 +1984,14 @@ NULL), + str_list_create (_(start_end_msg), NULL), 1)); + + command_register (commands, command_create ( ++ str_list_create_unique ("resizepart", _("resizepart"), NULL), ++ do_resizepart, ++ str_list_create ( ++_("resizepart NUMBER END resize partition NUMBER"), ++NULL), ++ str_list_create (_(number_msg), _(end_msg), NULL), 1)); ++ ++command_register (commands, command_create ( + str_list_create_unique ("rm", _("rm"), NULL), + do_rm, + str_list_create ( +-- +1.9.3 + diff --git a/0127-tests-excersise-resize-command.patch b/0127-tests-excersise-resize-command.patch new file mode 100644 index 0000000..1cee9aa --- /dev/null +++ b/0127-tests-excersise-resize-command.patch @@ -0,0 +1,122 @@ +From 33fd692cb14045fdc13306cd57cfe2040328daa8 Mon Sep 17 00:00:00 2001 +From: Petr Uzel +Date: Tue, 27 Sep 2011 09:11:29 +0200 +Subject: [PATCH 127/134] tests: excersise resize command + +a lot of TODOs +--- + tests/Makefile.am | 1 + + tests/t3200-resize-partition.sh | 89 +++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 90 insertions(+) + create mode 100755 tests/t3200-resize-partition.sh + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 0b5b1b6..b726366 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -50,6 +50,7 @@ TESTS = \ + t2400-dos-hfs-partition-type.sh \ + t2500-probe-corrupt-hfs.sh \ + t3000-resize-fs.sh \ ++ t3200-resize-partition.sh \ + t3200-type-change.sh \ + t3300-palo-prep.sh \ + t3310-flags.sh \ +diff --git a/tests/t3200-resize-partition.sh b/tests/t3200-resize-partition.sh +new file mode 100755 +index 0000000..251b545 +--- /dev/null ++++ b/tests/t3200-resize-partition.sh +@@ -0,0 +1,89 @@ ++#!/bin/sh ++# exercise the resize sub-command ++# based on t3000-resize-fs.sh test ++ ++# Copyright (C) 2009-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 ++ ++require_root_ ++require_scsi_debug_module_ ++ ++ss=$sector_size_ ++ ++default_start=1024s ++default_end=2048s ++ ++# create memory-backed device ++scsi_debug_setup_ dev_size_mb=5 > dev-name || ++ skip_ 'failed to create scsi_debug device' ++dev=$(cat dev-name) ++ ++# TODO test simple shrink ++# TODO test expand past end of the disk ++# TODO test expand past begin of next partition ++# TODO test shrink before start ++# TODO test everything with GPT ++# TODO more tests with extended/logical partitions ++ ++parted -s $dev mklabel msdos > out 2> err || fail=1 ++# expect no output ++compare /dev/null out || fail=1 ++compare /dev/null err || fail=1 ++ ++# ensure that the disk is large enough ++dev_n_sectors=$(parted -s $dev u s p|sed -n '2s/.* \([0-9]*\)s$/\1/p') ++device_sectors_required=$(echo $default_end | sed 's/s$//') ++# Ensure that $dev is large enough for this test ++test $device_sectors_required -le $dev_n_sectors || fail=1 ++ ++# create an empty partition ++parted -a minimal -s $dev mkpart primary $default_start $default_end > out 2>&1 || fail=1 ++compare /dev/null out || fail=1 ++ ++# print partition table ++parted -m -s $dev u s p > out 2>&1 || fail=1 ++ ++# FIXME: check expected output ++ ++# wait for new partition device to appear ++wait_for_dev_to_appear_ ${dev}1 || { warn_ "${dev}1 did not appear" fail=1; } ++sleep 1 ++ ++ ++# extend the filesystem to end on sector 4096 ++new_end=4096s ++parted -s $dev resizepart 1 $new_end > out 2> err || fail=1 ++# expect no output ++compare /dev/null out || fail=1 ++compare /dev/null err || fail=1 ++ ++# print partition table ++parted -m -s $dev u s p > out 2>&1 || fail=1 ++ ++sed -n 3p out > k && mv k out || fail=1 ++printf "1:$default_start:$new_end:3073s:::$ms;\n" > exp || fail=1 ++compare exp out || fail=1 ++ ++# Remove the partition explicitly, so that mklabel doesn't evoke a warning. ++parted -s $dev rm 1 || fail=1 ++ ++# Create a clean partition table for the next iteration. ++parted -s $dev mklabel msdos > out 2>&1 || fail=1 ++# expect no output ++compare /dev/null out || fail=1 ++ ++Exit $fail +-- +1.9.3 + diff --git a/0128-libparted-Add-support-for-partition-resize.patch b/0128-libparted-Add-support-for-partition-resize.patch new file mode 100644 index 0000000..6de3159 --- /dev/null +++ b/0128-libparted-Add-support-for-partition-resize.patch @@ -0,0 +1,331 @@ +From f09ca967a0bc443b869a6fad5b5ffe8e95c3fe9a Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Tue, 29 Nov 2011 14:05:48 -0500 +Subject: [PATCH 128/134] libparted: Add support for partition resize + +When resizing a partition ( same partition number, same +start sector, different end sector ), try to use the +new BLKPG_RES_PARTITION request to update the kernel +partition table with the new size. Also handle resizing +devmapper targets. +--- + NEWS | 3 +- + libparted/arch/linux.c | 207 +++++++++++++++++++++++++++++++++++++++++-------- + 2 files changed, 177 insertions(+), 33 deletions(-) + +diff --git a/NEWS b/NEWS +index 7069020..ad2fea1 100644 +--- a/NEWS ++++ b/NEWS +@@ -4,7 +4,8 @@ GNU parted NEWS -*- outline -*- + + ** New Features + +- Add resizepart command to resize a partition ++ Add resizepart command to resize a partition. This works even on ++ mounted partitions. + + Add support for EAV DASD partitions, which are ECKD's with more than + 65520 cylinders. +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index cdb8a26..0f18904 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -2493,8 +2493,9 @@ _blkpg_add_partition (PedDisk* disk, const PedPartition *part) + } + linux_part.length *= disk->dev->sector_size; + } +- else ++ else { + linux_part.length = part->geom.length * disk->dev->sector_size; ++ } + linux_part.pno = part->num; + strncpy (linux_part.devname, dev_name, BLKPG_DEVNAMELTH); + if (vol_name) +@@ -2521,6 +2522,60 @@ _blkpg_remove_partition (PedDisk* disk, int n) + BLKPG_DEL_PARTITION); + } + ++#ifdef BLKPG_RESIZE_PARTITION ++static int _blkpg_resize_partition (PedDisk* disk, const PedPartition *part) ++{ ++ struct blkpg_partition linux_part; ++ char* dev_name; ++ ++ PED_ASSERT(disk != NULL); ++ PED_ASSERT(disk->dev->sector_size % PED_SECTOR_SIZE_DEFAULT == 0); ++ ++ dev_name = _device_get_part_path (disk->dev, part->num); ++ if (!dev_name) ++ return 0; ++ memset (&linux_part, 0, sizeof (linux_part)); ++ linux_part.start = part->geom.start * disk->dev->sector_size; ++ /* see fs/partitions/msdos.c:msdos_partition(): "leave room for LILO" */ ++ if (part->type & PED_PARTITION_EXTENDED) { ++ if (disk->dev->sector_size == 512) { ++ linux_part.length = 2; ++ PedPartition *walk; ++ /* if the second sector is claimed by a logical partition, ++ then there's just no room for lilo, so don't try to use it */ ++ for (walk = part->part_list; walk; walk = walk->next) { ++ if (walk->geom.start == part->geom.start+1) ++ linux_part.length = 1; ++ } ++ } else linux_part.length = 1; ++ } ++ else ++ linux_part.length = part->geom.length * disk->dev->sector_size; ++ linux_part.pno = part->num; ++ strncpy (linux_part.devname, dev_name, BLKPG_DEVNAMELTH); ++ ++ free (dev_name); ++ ++ if (!_blkpg_part_command (disk->dev, &linux_part, ++ BLKPG_RESIZE_PARTITION)) { ++ return ped_exception_throw ( ++ PED_EXCEPTION_ERROR, ++ PED_EXCEPTION_IGNORE_CANCEL, ++ _("Error informing the kernel about modifications to " ++ "partition %s -- %s. This means Linux won't know " ++ "about any changes you made to %s until you reboot " ++ "-- so you shouldn't mount it or use it in any way " ++ "before rebooting."), ++ linux_part.devname, ++ strerror (errno), ++ linux_part.devname) ++ == PED_EXCEPTION_IGNORE; ++ } ++ ++ return 1; ++} ++#endif ++ + /* Read the integer from /sys/block/DEV_BASE/ENTRY and set *VAL + to that value, where DEV_BASE is the last component of DEV->path. + Upon success, return true. Otherwise, return false. */ +@@ -2789,6 +2844,76 @@ err: + free (vol_name); + return 0; + } ++ ++static int ++_dm_resize_partition (PedDisk* disk, const PedPartition* part) ++{ ++ LinuxSpecific* arch_specific = LINUX_SPECIFIC (disk->dev); ++ char* params = NULL; ++ char* vol_name = NULL; ++ const char* dev_name = NULL; ++ uint32_t cookie = 0; ++ ++ /* Get map name from devicemapper */ ++ struct dm_task *task = dm_task_create (DM_DEVICE_INFO); ++ if (!task) ++ goto err; ++ ++ if (!dm_task_set_major_minor (task, arch_specific->major, ++ arch_specific->minor, 0)) ++ goto err; ++ ++ if (!dm_task_run(task)) ++ goto err; ++ ++ dev_name = dm_task_get_name (task); ++ size_t name_len = strlen (dev_name); ++ vol_name = zasprintf ("%s%s%d", ++ dev_name, ++ isdigit (dev_name[name_len - 1]) ? "p" : "", ++ part->num); ++ if (vol_name == NULL) ++ goto err; ++ ++ /* Caution: dm_task_destroy frees dev_name. */ ++ dm_task_destroy (task); ++ task = NULL; ++ if ( ! (params = zasprintf ("%d:%d %lld", arch_specific->major, ++ arch_specific->minor, part->geom.start))) ++ goto err; ++ ++ task = dm_task_create (DM_DEVICE_RELOAD); ++ if (!task) ++ goto err; ++ ++ 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)) { ++ dm_task_destroy (task); ++ task = dm_task_create (DM_DEVICE_RESUME); ++ if (!task) ++ goto err; ++ dm_task_set_name (task, vol_name); ++ if (!dm_task_set_cookie (task, &cookie, 0)) ++ goto err; ++ if (dm_task_run (task)) { ++ free (params); ++ free (vol_name); ++ return 1; ++ } ++ } ++err: ++ dm_task_update_nodes(); ++ if (task) ++ dm_task_destroy (task); ++ free (params); ++ free (vol_name); ++ return 0; ++} ++ + #endif + + /* +@@ -2810,9 +2935,10 @@ _disk_sync_part_table (PedDisk* disk) + { + PED_ASSERT(disk != NULL); + PED_ASSERT(disk->dev != NULL); +- int lpn; ++ int lpn, lpn2; + unsigned int part_range = _device_get_partition_range(disk->dev); + int (*add_partition)(PedDisk* disk, const PedPartition *part); ++ int (*resize_partition)(PedDisk* disk, const PedPartition *part); + int (*remove_partition)(PedDisk* disk, int partno); + bool (*get_partition_start_and_length)(PedPartition const *part, + unsigned long long *start, +@@ -2822,10 +2948,16 @@ _disk_sync_part_table (PedDisk* disk) + if (disk->dev->type == PED_DEVICE_DM) { + add_partition = _dm_add_partition; + remove_partition = _dm_remove_partition; ++ resize_partition = _dm_resize_partition; + get_partition_start_and_length = _dm_get_partition_start_and_length; + } else { + add_partition = _blkpg_add_partition; + remove_partition = _blkpg_remove_partition; ++#ifdef BLKPG_RESIZE_PARTITION ++ resize_partition = _blkpg_resize_partition; ++#else ++ resize_partition = NULL; ++#endif + get_partition_start_and_length = _kernel_get_partition_start_and_length; + } + +@@ -2835,7 +2967,11 @@ _disk_sync_part_table (PedDisk* disk) + lpn = PED_MAX(lpn, part_range); + else + lpn = part_range; +- ++ /* for add pass, use lesser of device or label limit */ ++ if (ped_disk_get_max_supported_partition_count(disk, &lpn2)) ++ lpn2 = PED_MIN(lpn2, part_range); ++ else ++ lpn2 = part_range; + /* Its not possible to support largest_partnum < 0. + * largest_partnum == 0 would mean does not support partitions. + * */ +@@ -2860,9 +2996,10 @@ _disk_sync_part_table (PedDisk* disk) + if (get_partition_start_and_length(part, + &start, &length) + && start == part->geom.start +- && length == part->geom.length) ++ && (length == part->geom.length ++ || (resize_partition && part->num < lpn2))) + { +- /* partition is unchanged, so nothing to do */ ++ /* partition is unchanged, or will be resized so nothing to do */ + ok[i - 1] = 1; + continue; + } +@@ -2882,13 +3019,8 @@ _disk_sync_part_table (PedDisk* disk) + } while (n_sleep--); + if (!ok[i - 1] && errnums[i - 1] == ENXIO) + ok[i - 1] = 1; /* it already doesn't exist */ +- } +- /* lpn = largest partition number. +- * for add pass, use lesser of device or label limit */ +- if (ped_disk_get_max_supported_partition_count(disk, &lpn)) +- lpn = PED_MIN(lpn, part_range); +- else +- lpn = part_range; ++ } ++ lpn = lpn2; + /* don't actually add partitions for loop */ + if (strcmp (disk->type->name, "loop") == 0) + lpn = 0; +@@ -2901,11 +3033,22 @@ _disk_sync_part_table (PedDisk* disk) + /* get start and length of existing partition */ + if (get_partition_start_and_length(part, + &start, &length) +- && start == part->geom.start +- && length == part->geom.length) { +- ok[i - 1] = 1; +- /* partition is unchanged, so nothing to do */ +- continue; ++ && start == part->geom.start) ++ { ++ if (length == part->geom.length) { ++ ok[i - 1] = 1; ++ /* partition is unchanged, so nothing to do */ ++ continue; ++ } ++ if (resize_partition ++ && start == part->geom.start) ++ { ++ /* try to resize */ ++ if (resize_partition (disk, part)) { ++ ok[i - 1] = 1; ++ continue; ++ } ++ } + } + /* add the (possibly modified or new) partition */ + if (!add_partition (disk, part)) { +@@ -2917,31 +3060,31 @@ _disk_sync_part_table (PedDisk* disk) + char *bad_part_list = NULL; + /* now warn about any errors */ + for (i = 1; i <= lpn; i++) { +- if (ok[i - 1] || errnums[i - 1] == ENXIO) +- continue; +- if (bad_part_list == NULL) { +- bad_part_list = malloc (lpn * 5); +- if (!bad_part_list) +- goto cleanup; +- bad_part_list[0] = 0; +- } +- sprintf (bad_part_list + strlen (bad_part_list), "%d, ", i); +- } ++ if (ok[i - 1] || errnums[i - 1] == ENXIO) ++ continue; ++ if (bad_part_list == NULL) { ++ bad_part_list = malloc (lpn * 5); ++ if (!bad_part_list) ++ goto cleanup; ++ bad_part_list[0] = 0; ++ } ++ sprintf (bad_part_list + strlen (bad_part_list), "%d, ", i); ++ } + if (bad_part_list == NULL) +- ret = 1; +- else { ++ ret = 1; ++ else { + bad_part_list[strlen (bad_part_list) - 2] = 0; + if (ped_exception_throw ( + PED_EXCEPTION_ERROR, + PED_EXCEPTION_IGNORE_CANCEL, + _("Partition(s) %s on %s have been written, but we have " +- "been unable to inform the kernel of the change, " +- "probably because it/they are in use. As a result, " ++ "been unable to inform the kernel of the change, " ++ "probably because it/they are in use. As a result, " + "the old partition(s) will remain in use. You " + "should reboot now before making further changes."), + bad_part_list, disk->dev->path) == PED_EXCEPTION_IGNORE) + ret = 1; +- free (bad_part_list); ++ free (bad_part_list); + } + cleanup: + free (errnums); +-- +1.9.3 + diff --git a/0129-parted-make-_partition_warn_busy-actually-a-warning-.patch b/0129-parted-make-_partition_warn_busy-actually-a-warning-.patch new file mode 100644 index 0000000..63d2de6 --- /dev/null +++ b/0129-parted-make-_partition_warn_busy-actually-a-warning-.patch @@ -0,0 +1,105 @@ +From f46146a15bf45478569c1d364661d3d54f8e3a1a Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Wed, 30 Nov 2011 13:13:58 -0500 +Subject: [PATCH 129/134] parted: make _partition_warn_busy actually a warning + instead of an error + +This function was throwing a PED_EXCEPTION_ERROR with only the +PED_EXCEPTION_CANCEL option. Converted to a PED_EXCEPTION_WARNING +with the option to continue anyhow. +--- + NEWS | 3 +++ + parted/parted.c | 17 ++++++++++------- + tests/t1101-busy-partition.sh | 2 +- + tests/t1102-loop-label.sh | 3 +-- + tests/t9041-undetected-in-use-16th-partition.sh | 4 ++-- + 5 files changed, 17 insertions(+), 12 deletions(-) + +diff --git a/NEWS b/NEWS +index ad2fea1..118f459 100644 +--- a/NEWS ++++ b/NEWS +@@ -134,6 +134,9 @@ GNU parted NEWS -*- outline -*- + + ** Changes in behavior + ++ When attempting to manipulate a mounted partition, parted now issues ++ a warning that you can choose to ignore, instead of an error. ++ + When creating a loop label, it automatically comes with a partition + using the whole disk. + +diff --git a/parted/parted.c b/parted/parted.c +index a36ca28..ec9e04e 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -224,14 +224,17 @@ _partition_warn_busy (PedPartition* part) + + if (ped_partition_is_busy (part)) { + path = ped_partition_get_path (part); +- ped_exception_throw ( +- PED_EXCEPTION_ERROR, +- PED_EXCEPTION_CANCEL, +- _("Partition %s is being used. You must unmount it " +- "before you modify it with Parted."), +- path); ++ if (ped_exception_throw ( ++ PED_EXCEPTION_WARNING, ++ PED_EXCEPTION_YES_NO, ++ _("Partition %s is being used. Are you sure you " \ ++ "want to continue?"), ++ path) != PED_EXCEPTION_YES) ++ { ++ free (path); ++ return 0; ++ } + free (path); +- return 0; + } + return 1; + } +diff --git a/tests/t1101-busy-partition.sh b/tests/t1101-busy-partition.sh +index eb3fac6..ad091f7 100755 +--- a/tests/t1101-busy-partition.sh ++++ b/tests/t1101-busy-partition.sh +@@ -29,7 +29,7 @@ scsi_debug_setup_ dev_size_mb=80 > dev-name || + dev=$(cat dev-name) + + cat < exp-error || framework_failure +-Error: Partition ${dev}2 is being used. You must unmount it before you modify it with Parted. ++Warning: Partition ${dev}2 is being used. Are you sure you want to continue? + EOF + + parted -s "$dev" mklabel msdos > out 2>&1 || fail=1 +diff --git a/tests/t1102-loop-label.sh b/tests/t1102-loop-label.sh +index c6574c2..9752002 100644 +--- a/tests/t1102-loop-label.sh ++++ b/tests/t1102-loop-label.sh +@@ -73,8 +73,7 @@ compare exp out || fail=1 + # make sure partition busy check works ( mklabel checks whole disk ) + parted -s "$dev" rm 1 > out 2>&1; test $? = 1 || fail=1 + # create expected output file +-echo "Error: Partition $dev is being used. You must unmount it before you modify \ +-it with Parted." > exp ++echo "Warning: Partition ${dev} is being used. Are you sure you want to continue?" > exp + compare exp out || fail=1 + + umount "$mount_point" +diff --git a/tests/t9041-undetected-in-use-16th-partition.sh b/tests/t9041-undetected-in-use-16th-partition.sh +index b763e91..edaae1b 100644 +--- a/tests/t9041-undetected-in-use-16th-partition.sh ++++ b/tests/t9041-undetected-in-use-16th-partition.sh +@@ -87,8 +87,8 @@ for part_dev in $partitions; do + # Removal of mounted partition must fail. + parted -s $scsi_dev rm $n > out 2>&1 && fail=1 + +- echo "Error: Partition $part_dev is being used." \ +- 'You must unmount it before you modify it with Parted.' \ ++ echo "Warning: Partition $part_dev is being used." \ ++ 'Are you sure you want to continue?' \ + > exp-error || framework_failure_ + + # expect error +-- +1.9.3 + diff --git a/0130-parted-Allow-undocumented-commands.patch b/0130-parted-Allow-undocumented-commands.patch new file mode 100644 index 0000000..990c064 --- /dev/null +++ b/0130-parted-Allow-undocumented-commands.patch @@ -0,0 +1,28 @@ +From 360d6277d674c6f92135c8b6bf274c48675ef168 Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Mon, 5 Dec 2011 19:24:39 -0500 +Subject: [PATCH 130/134] parted: Allow undocumented commands + +Have command_print_summary print nothing if the command summary is NULL. +This allows for a command to be registered, but not documented in the +output of help. +--- + parted/command.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/parted/command.c b/parted/command.c +index e8fa64e..bc70e8a 100644 +--- a/parted/command.c ++++ b/parted/command.c +@@ -118,6 +118,8 @@ command_get_names (Command** list) + void + command_print_summary (Command* cmd) + { ++ if (cmd->summary == NULL) ++ return; + fputs (" ", stdout); + str_list_print_wrap (cmd->summary, screen_width(), 2, 8, stdout); + putchar ('\n'); +-- +1.9.3 + diff --git a/0131-parted-Add-stub-resize-command-for-backward-compatib.patch b/0131-parted-Add-stub-resize-command-for-backward-compatib.patch new file mode 100644 index 0000000..7fb28da --- /dev/null +++ b/0131-parted-Add-stub-resize-command-for-backward-compatib.patch @@ -0,0 +1,50 @@ +From 56bfbe21ecca0cb6466c78baed192dc2e5401676 Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Tue, 8 Jan 2013 19:40:35 -0500 +Subject: [PATCH 131/134] parted: Add stub resize command for backward + compatibility + +To make sure that older scripts trying to use the resize command do not +accidentally run the new resizepart command by mistake, this undocumented +stub command will throw an error if called. +--- + parted/parted.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/parted/parted.c b/parted/parted.c +index ec9e04e..f27a035 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -1505,6 +1505,16 @@ error: + } + + static int ++do_resize (PedDevice **dev, PedDisk** diskp) ++{ ++ ped_exception_throw ( ++ PED_EXCEPTION_ERROR, ++ PED_EXCEPTION_CANCEL, ++ _("The resize command has been removed in parted 3.0")); ++ return 0; ++} ++ ++static int + do_resizepart (PedDevice** dev, PedDisk** diskp) + { + PedDisk *disk = *diskp; +@@ -1987,6 +1997,12 @@ NULL), + str_list_create (_(start_end_msg), NULL), 1)); + + command_register (commands, command_create ( ++ str_list_create_unique ("resize", _("resize"), NULL), ++ do_resize, ++ NULL, ++ str_list_create (_(N_("The resize command was removed in parted 3.0\n")), NULL), 1)); ++ ++command_register (commands, command_create ( + str_list_create_unique ("resizepart", _("resizepart"), NULL), + do_resizepart, + str_list_create ( +-- +1.9.3 + diff --git a/0132-Document-resizepart-command.patch b/0132-Document-resizepart-command.patch new file mode 100644 index 0000000..acaef53 --- /dev/null +++ b/0132-Document-resizepart-command.patch @@ -0,0 +1,62 @@ +From 5c793853fe5cb0718d895c3394fb909c73c6fa1e Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Sun, 25 May 2014 14:43:39 -0400 +Subject: [PATCH 132/134] Document resizepart command + +--- + doc/C/parted.8 | 4 ++++ + doc/parted.texi | 16 ++++++++++++++++ + 2 files changed, 20 insertions(+) + +diff --git a/doc/C/parted.8 b/doc/C/parted.8 +index f8e6a3d..689011c 100644 +--- a/doc/C/parted.8 ++++ b/doc/C/parted.8 +@@ -93,6 +93,10 @@ Rescue a lost partition that was located somewhere between \fIstart\fP and + \fIend\fP. If a partition is found, \fBparted\fP will ask if you want to + create an entry for it in the partition table. + .TP ++.B resizepart \fIpartition\fP \fIend\fP ++Change the \fIend\fP position of \fIpartition\fP. Note that this does not ++modify any filesystem present in the partition. ++.TP + .B rm \fIpartition\fP + Delete \fIpartition\fP. + .TP +diff --git a/doc/parted.texi b/doc/parted.texi +index 2b6f7f8..07aa702 100644 +--- a/doc/parted.texi ++++ b/doc/parted.texi +@@ -423,6 +423,7 @@ GNU Parted provides the following commands: + * print:: + * quit:: + * rescue:: ++* resizepart:: + * rm:: + * select:: + * set:: +@@ -744,6 +745,21 @@ It's back! :) + + @end deffn + ++@node resizepart ++@subsection resizepart ++@cindex resizepart, command description ++@cindex command description, resizepart ++ ++@deffn Command resizepart @var{number} @var{end} ++ ++Moves the @var{end} position of partition @var{number}. Note that this ++does not modify any filesystem present in the partition. If you wish to ++do this, you will need to use external tools, such as @command{resize2fs}. ++ ++When growing a partition you will want to grow the filesystem afterwards, ++but when shrinking, you need to shrink the filesystem before the partition. ++@end deffn ++ + @node rm + @subsection rm + @cindex rm, command description +-- +1.9.3 + diff --git a/0133-tests-fix-t9020-alignment.sh.patch b/0133-tests-fix-t9020-alignment.sh.patch new file mode 100644 index 0000000..d0c3165 --- /dev/null +++ b/0133-tests-fix-t9020-alignment.sh.patch @@ -0,0 +1,28 @@ +From ae37d7c4586664e18f42e25a7f210f392e1f0100 Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Sun, 15 Jun 2014 18:20:07 -0400 +Subject: [PATCH 133/134] tests: fix t9020-alignment.sh + +This test was refering to print-alignment by absolute path, which +broke building with a different object directory, causing +make distcheck to fail. +--- + tests/t9020-alignment.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/t9020-alignment.sh b/tests/t9020-alignment.sh +index f27b59b..9ea6eb0 100755 +--- a/tests/t9020-alignment.sh ++++ b/tests/t9020-alignment.sh +@@ -36,7 +36,7 @@ scsi_debug_setup_ physblk_exp=3 lowest_aligned=7 num_parts=4 > dev-name || + scsi_dev=$(cat dev-name) + + # print alignment info +-"$abs_srcdir/print-align" $scsi_dev > out 2>&1 || fail=1 ++../print-align $scsi_dev > out 2>&1 || fail=1 + + compare exp out || fail=1 + +-- +1.9.3 + diff --git a/0134-maint-correct-a-POT-file-updating-rule.patch b/0134-maint-correct-a-POT-file-updating-rule.patch new file mode 100644 index 0000000..8c9bc5f --- /dev/null +++ b/0134-maint-correct-a-POT-file-updating-rule.patch @@ -0,0 +1,26 @@ +From 081ed98dabfd1d857139c71fd6a74f8898dd9dcb Mon Sep 17 00:00:00 2001 +From: Jim Meyering +Date: Mon, 23 Jun 2014 07:20:27 -0700 +Subject: [PATCH 134/134] maint: correct a POT-file updating rule + +* doc/C/Makefile.am (updatepo): If there is no po/$name.pot, +create an empty one. Reported by Philip Susi. +--- + doc/C/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/doc/C/Makefile.am b/doc/C/Makefile.am +index 42b3cb1..c3595f5 100644 +--- a/doc/C/Makefile.am ++++ b/doc/C/Makefile.am +@@ -13,6 +13,7 @@ updatepo: + test -w . || exit 0; \ + for name in $(dist_man8_MANS); do \ + echo $$name; \ ++ test -f po/$$name.pot || touch po/$$name.pot; \ + cp po/$$name.pot po/$$name.new.pot; \ + po4a-updatepo -f man -m $$name -p po/$$name.new.pot; \ + diff -I '^\"POT-Creation-Date: ' po/$$name.pot po/$$name.new.pot 2>&1 > /dev/null; \ +-- +1.9.3 + diff --git a/parted.spec b/parted.spec index b2c023d..cc9118f 100644 --- a/parted.spec +++ b/parted.spec @@ -4,7 +4,7 @@ Summary: The GNU disk partition manipulation program Name: parted Version: 3.1 -Release: 28%{?dist} +Release: 29%{?dist} License: GPLv3+ Group: Applications/System URL: http://www.gnu.org/software/parted @@ -150,6 +150,15 @@ Patch0122: 0122-tests-use-test-s-operator-not.patch Patch0123: 0123-libparted-Fix-part-dupe-with-empty-name.patch Patch0124: 0124-tests-check-name-when-duplicating.patch Patch0125: 0125-Fix-python-test-scripts-for-distribution.patch +Patch0126: 0126-parted-add-resizepart-command.patch +Patch0127: 0127-tests-excersise-resize-command.patch +Patch0128: 0128-libparted-Add-support-for-partition-resize.patch +Patch0129: 0129-parted-make-_partition_warn_busy-actually-a-warning-.patch +Patch0130: 0130-parted-Allow-undocumented-commands.patch +Patch0131: 0131-parted-Add-stub-resize-command-for-backward-compatib.patch +Patch0132: 0132-Document-resizepart-command.patch +Patch0133: 0133-tests-fix-t9020-alignment.sh.patch +Patch0134: 0134-maint-correct-a-POT-file-updating-rule.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: e2fsprogs-devel @@ -289,6 +298,11 @@ fi %changelog +* Mon Jul 14 2014 Brian C. Lane 3.1-29 +- Rebase on parted master commit 081ed98 +- libparted: Add support for partition resize +- parted: add resizepart command + * Wed Jun 11 2014 Brian C. Lane 3.1-28 - Rebase on parted master commit 1da239e2ebd2 - libparted: Fix bug with dupe and empty name