[parted-devel] [PATCH 4/4] Fix resizepart when saying no to the shrink warning

M. J. Everitt m.j.everitt at iee.org
Mon May 7 18:59:04 BST 2018


On 07/05/18 18:55, Phillip Susi wrote:
> Resizepart has to change the PedDisk to see if there are any problems
> in doing so, then gives the warning about shirnking the partition.
> If the user answers No ( do not change ), it did not commit the
> changes to disk, but did keep them around in memory, so they could
> later be committed by another command.  Fix it to discard the modified
> PedDisk.
> ---
>  NEWS                            |  3 +++
>  parted/parted.c                 | 12 +++++++++---
>  tests/t3200-resize-partition.sh | 36 +++++++++++++++++++++++++++++++++++-
>  3 files changed, 47 insertions(+), 4 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index 659119c..9fe2033 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -6,6 +6,9 @@ GNU parted NEWS                                    -*- outline -*-
>  
>  ** Bug Fixes
>  
> +  Fix resizepart to discard changes after getting the warning about
> +  shirnking a partition and answering No.
> +
>    Fix resizepart to adjust the end to be -1 sector when using iec
>    power of 2 units so that the next partition can start immediately
>    following the new end, just like mkpart does.
> diff --git a/parted/parted.c b/parted/parted.c
> index 1d8ceeb..5afb94f 100644
> --- a/parted/parted.c
> +++ b/parted/parted.c
> @@ -1542,6 +1542,7 @@ static int
>  do_resizepart (PedDevice** dev, PedDisk** diskp)
>  {
>          PedDisk                 *disk = *diskp;
> +        PedDisk                 *newdisk = NULL;
>          PedPartition            *part = NULL;
>          PedSector               start, end, oldend;
>          PedGeometry             *range_end = NULL;
> @@ -1555,12 +1556,13 @@ do_resizepart (PedDevice** dev, PedDisk** diskp)
>          if (!disk)
>                  goto error;
>  
> +        newdisk = ped_disk_duplicate (disk);
>          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))
> +        if (!command_line_get_partition (_("Partition number?"), newdisk, &part))
>                  goto error;
>          if (!_partition_warn_busy (part))
>                  goto error;
> @@ -1574,7 +1576,7 @@ do_resizepart (PedDevice** dev, PedDisk** diskp)
>          free(end_input);
>          /* 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,
> +        if (!ped_disk_set_partition_geom (newdisk, part, constraint,
>                                            start, end))
>                  goto error_destroy_constraint;
>          /* warn when shrinking partition - might lose data */
> @@ -1585,7 +1587,9 @@ do_resizepart (PedDevice** dev, PedDisk** diskp)
>                              _("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);
> +        ped_disk_commit (newdisk);
> +        *diskp = newdisk;
> +        newdisk = NULL;
>  
>          if ((*dev)->type != PED_DEVICE_FILE)
>                  disk_is_modified = 1;
> @@ -1597,6 +1601,8 @@ error_destroy_constraint:
>  error:
>          if (range_end != NULL)
>                  ped_geometry_destroy (range_end);
> +        if (newdisk)
> +                ped_disk_destroy (newdisk);
>          return rc;
>  }
>  
> diff --git a/tests/t3200-resize-partition.sh b/tests/t3200-resize-partition.sh
> index 251b545..ee71292 100755
> --- a/tests/t3200-resize-partition.sh
> +++ b/tests/t3200-resize-partition.sh
> @@ -32,7 +32,6 @@ 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
> @@ -86,4 +85,39 @@ parted -s $dev mklabel msdos > out 2>&1 || fail=1
>  # expect no output
>  compare /dev/null out || fail=1
>  
> +# Create a partition
> +parted -s $dev mkpart primary 1m 5m > out 2>&1 || fail=1
> +
> +# Expect no output
> +compare /dev/null out || fail=1
> +
> +# Now shrink it
> +cat > input <<EOF
> +resizepart 1 4m
> +No
> +print
> +EOF
> +
> +parted ---pretend-input-tty $dev > out 2>&1 < input || fail=1
> +cat > out.exp <<EOF
> +GNU Parted 3.2.99-14605-dirty
> +Using $dev
> +Welcome to GNU Parted! Type 'help' to view a list of commands.
> +
>                                                                           
> (parted) resizepart 1 4m
> +Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
> +
>                                                                           
>
>                                                                           
> Yes/No? No
> +
>                                                                           
> (parted) print
> +Model: Linux scsi_debug (scsi)
> +Disk /dev/sda: 5243kB
> +Sector size (logical/physical): 512B/512B
> +Partition Table: msdos
> +Disk Flags: 
> +
> +Number  Start   End     Size    Type     File system  Flags
> + 1      1049kB  5243kB  4194kB  primary
> +
> +
>                                                                           
> (parted) 
> +EOF
> +compare out.exp out || fail=1
> +
>  Exit $fail
s/shirnk/shrink/g :]

lgtm!

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://alioth-lists.debian.net/pipermail/parted-devel/attachments/20180507/584c8928/attachment-0001.sig>


More information about the parted-devel mailing list