[parted-devel] [PATCH] parted: fix the rescue command

Phillip Susi psusi at ubuntu.com
Tue Jan 13 00:08:37 UTC 2015


The rescue command often failed to locate a filesystem due to it
leaving cylinder alignment on, which snapped the allowed bounds
of the filesystem down to the next lower cylinder boundary,
causing the detected filesystem to be rejected due to not fitting.
---
 NEWS                     |  4 +++-
 parted/parted.c          |  4 ++++
 tests/Makefile.am        |  1 +
 tests/t1701-rescue-fs.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 60 insertions(+), 1 deletion(-)
 create mode 100644 tests/t1701-rescue-fs.sh

diff --git a/NEWS b/NEWS
index da7db50..2689cf2 100644
--- a/NEWS
+++ b/NEWS
@@ -4,8 +4,10 @@ GNU parted NEWS                                    -*- outline -*-
 
 ** Bug Fixes
 
-  libparted-fs-resize: Prevent crash resizing FAT16 file systems.
+  Fix rescue command: the rescue command often failed to find
+  filesystems due to leaving on cylinder alignment.
 
+  libparted-fs-resize: Prevent crash resizing FAT16 file systems.
 
 * Noteworthy changes in release 3.2 (2014-07-28) [stable]
 
diff --git a/parted/parted.c b/parted/parted.c
index f27a035..5e6bb1c 100644
--- a/parted/parted.c
+++ b/parted/parted.c
@@ -1472,6 +1472,10 @@ do_rescue (PedDevice** dev, PedDisk** diskp)
         disk = ped_disk_new (*dev);
         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,
+                                       0))
+                        goto error;
 
         if (!command_line_get_sector (_("Start?"), *dev, &start, NULL, NULL))
                 goto error_destroy_disk;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b726366..ece741d 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -43,6 +43,7 @@ TESTS = \
   t1102-loop-label.sh \
   t1104-remove-and-add-partition.sh \
   t1700-probe-fs.sh \
+  t1701-rescue-fs.sh \
   t2200-dos-label-recog.sh \
   t2201-pc98-label-recog.sh \
   t2300-dos-label-extended-bootcode.sh \
diff --git a/tests/t1701-rescue-fs.sh b/tests/t1701-rescue-fs.sh
new file mode 100644
index 0000000..9b726cf
--- /dev/null
+++ b/tests/t1701-rescue-fs.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# rescue ext4 file system
+
+# Copyright (C) 2008-2014 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_512_byte_sector_size_
+require_root_
+require_scsi_debug_module_
+
+# create memory-backed device
+scsi_debug_setup_ sector_size=$sector_size_ dev_size_mb=32 > dev-name ||
+  skip_ 'failed to create scsi_debug device'
+scsi_dev=$(cat dev-name)
+
+( mkfs.ext4 2>&1 | grep -i '^usage' ) > /dev/null \
+    || { warn_ "$ME: no ext4 support"; Exit $fail; }
+
+parted -s $scsi_dev mklabel msdos mkpart primary ext2 1m 100%
+mkfs.ext4 ${scsi_dev}1 || { warn_ $ME: mkfs.ext4 failed; fail=1; Exit $fail; }
+
+# remove the partition
+parted -s $scsi_dev rm 1 || fail=1
+
+# rescue the partition
+echo yes | parted ---pretend-input-tty $scsi_dev rescue 1m 100% > out 2>&1
+cat > exp <<EOF
+Information: A ext4 primary partition was found at 1049kB -> 33.6MB.  Do you want to add it to the partition table?
+Yes/No/Cancel? yes
+Information: You may need to update /etc/fstab.
+EOF
+# Transform the actual output, to avoid spurious differences when
+# $PWD contains a symlink-to-dir.  Also, remove the ^M      ...^M bogosity.
+# normalize the actual output
+mv out o2 && sed -e "s,
   *
,,g;s, $,," \
+                      -e "s,^.*/lt-parted: ,parted: ," o2 > out
+echo '' >> exp
+compare out exp || fail=1
+Exit $fail
-- 
2.1.0




More information about the parted-devel mailing list