- Rebase on parted master commit 081ed98

- libparted: Add support for partition resize
- parted: add resizepart command
This commit is contained in:
Brian C. Lane 2014-07-14 14:44:27 -07:00
parent 73aa139585
commit 13386670d0
13 changed files with 922 additions and 10 deletions

View File

@ -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" <bcl@redhat.com>
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.

View File

@ -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" <bcl@redhat.com>
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

View File

@ -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" <bcl@redhat.com>
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.

View File

@ -0,0 +1,146 @@
From 21c58e17c473ea8ef31a18d03348eb2381c0f36c Mon Sep 17 00:00:00 2001
From: Petr Uzel <petr.uzel@suse.cz>
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

View File

@ -0,0 +1,122 @@
From 33fd692cb14045fdc13306cd57cfe2040328daa8 Mon Sep 17 00:00:00 2001
From: Petr Uzel <petr.uzel@suse.cz>
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 <http://www.gnu.org/licenses/>.
+
+. "${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

View File

@ -0,0 +1,331 @@
From f09ca967a0bc443b869a6fad5b5ffe8e95c3fe9a Mon Sep 17 00:00:00 2001
From: Phillip Susi <psusi@ubuntu.com>
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

View File

@ -0,0 +1,105 @@
From f46146a15bf45478569c1d364661d3d54f8e3a1a Mon Sep 17 00:00:00 2001
From: Phillip Susi <psusi@ubuntu.com>
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 <<EOF > 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

View File

@ -0,0 +1,28 @@
From 360d6277d674c6f92135c8b6bf274c48675ef168 Mon Sep 17 00:00:00 2001
From: Phillip Susi <psusi@ubuntu.com>
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

View File

@ -0,0 +1,50 @@
From 56bfbe21ecca0cb6466c78baed192dc2e5401676 Mon Sep 17 00:00:00 2001
From: Phillip Susi <psusi@ubuntu.com>
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

View File

@ -0,0 +1,62 @@
From 5c793853fe5cb0718d895c3394fb909c73c6fa1e Mon Sep 17 00:00:00 2001
From: Phillip Susi <psusi@ubuntu.com>
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

View File

@ -0,0 +1,28 @@
From ae37d7c4586664e18f42e25a7f210f392e1f0100 Mon Sep 17 00:00:00 2001
From: Phillip Susi <psusi@ubuntu.com>
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

View File

@ -0,0 +1,26 @@
From 081ed98dabfd1d857139c71fd6a74f8898dd9dcb Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@fb.com>
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

View File

@ -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 <bcl@redhat.com> 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 <bcl@redhat.com> 3.1-28
- Rebase on parted master commit 1da239e2ebd2
- libparted: Fix bug with dupe and empty name