From b8ea4c8fecb4413ca37c83c5e89ac99278b837ff Mon Sep 17 00:00:00 2001 From: basebuilder_pel7ppc64bebuilder0 Date: Tue, 29 May 2018 17:03:23 +0200 Subject: [PATCH] parted package update Signed-off-by: basebuilder_pel7ppc64bebuilder0 --- ...Remove-rmmod-loop-from-t8001-1040504.patch | 35 + ...ize-of-container-filesystem-in-t4100.patch | 45 + ...sable-t4100-dvh-test-for-now-1036093.patch | 36 + ...ure-not-to-treat-percentages-as-exac.patch | 56 + ...Use-mkfs.xfs-to-create-files-1036152.patch | 69 + ...page-NAME-so-whatis-will-work-948424.patch | 25 + ...PT-add-support-for-PReP-GUID-1108196.patch | 209 +++ ...-part-table-with-0-partitions-113846.patch | 31 + ...-tests-Change-minimum-size-to-256MiB.patch | 27 + ...-logical-partitions-starting-immedia.patch | 117 ++ ...-for-device-mapper-partition-sizes-1.patch | 106 ++ ...ice-mapper-uses-512b-sectors-1188431.patch | 43 + ...ad-only-when-probing-devices-on-linu.patch | 218 +++ ...tests-Use-wait_for_dev_to_-functions.patch | 145 ++ ...adm-settle-to-wait_for_-loop-1260664.patch | 119 ++ ...0036-tests-Add-wait-to-t9042-1257415.patch | 31 + ...failing-on-a-host-with-a-4k-xfs-file.patch | 57 + ...-fdasd-geometry-code-from-alloc_meta.patch | 48 + ...t-of-filesystems-for-fs-type-1311596.patch | 29 + ...-the-device-once-for-probing-1339705.patch | 45 + ...0041-tests-Stop-timing-t9040-1172675.patch | 45 + ...l-blocks-to-64-for-scsi_debug-device.patch | 32 + .../0043-Add-support-for-NVMe-devices.patch | 122 ++ .../0044-Document-resizepart-command.patch | 65 + ...resize-command-for-backward-compatib.patch | 62 + ...arted-Backport-partition-resize-code.patch | 842 +++++++++++ .../0047-tests-excersise-resize-command.patch | 124 ++ .../0048-parted-add-resizepart-command.patch | 140 ++ ....1-libparted-use-dm_udev_wait-698121.patch | 86 ++ ...-pmbr_boot-when-duplicating-GPT-disk.patch | 25 + ...void-dasd-as-default-file-image-type.patch | 59 + ...Fix-endian-error-with-FirstUsableLBA.patch | 54 + ...d-Flush-parent-device-on-open-962611.patch | 35 + ...libparted-Recognize-btrfs-filesystem.patch | 184 +++ ...-add-support-for-EAV-DASD-partitions.patch | 1058 ++++++++++++++ ...ort-for-implicit-FBA-DASD-partitions.patch | 187 +++ ...PMBR-before-GPT-partition-table-8052.patch | 91 ++ ...rted-don-t-canonicalize-dev-md-paths.patch | 37 + .../parted-3.1-libparted-mklabel-eav.patch | 151 ++ .../parted-3.1-libparted-mklabel-edev.patch | 48 + ...d-preserve-the-uuid-on-dm-partitions.patch | 71 + ...cate-buf-after-_disk_analyse_block_s.patch | 36 + ...rgest_partnum-in-dm_reread_part_tabl.patch | 41 + ...creating-20-device-mapper-partitions.patch | 94 ++ ...d-btrfs-and-xfs-to-the-fs-probe-test.patch | 26 + ...ts-Make-sure-dm-UUIDs-are-not-erased.patch | 92 ++ ...ests-add-t0301-overwrite-gpt-pmbr.sh.patch | 34 + ...rted-3.1-tests-cleanup-losetup-usage.patch | 137 ++ ...ests-rewrite-t6001-to-use-dev-mapper.patch | 98 ++ SOURCES/pubkey.jim.meyering | 371 +++++ SPECS/parted.spec | 1238 +++++++++++++++++ 51 files changed, 7176 insertions(+) create mode 100644 SOURCES/0021-tests-Remove-rmmod-loop-from-t8001-1040504.patch create mode 100644 SOURCES/0022-tests-Increase-size-of-container-filesystem-in-t4100.patch create mode 100644 SOURCES/0023-tests-Disable-t4100-dvh-test-for-now-1036093.patch create mode 100644 SOURCES/0024-libparted-make-sure-not-to-treat-percentages-as-exac.patch create mode 100644 SOURCES/0025-tests-Use-mkfs.xfs-to-create-files-1036152.patch create mode 100644 SOURCES/0026-Update-manpage-NAME-so-whatis-will-work-948424.patch create mode 100644 SOURCES/0027-GPT-add-support-for-PReP-GUID-1108196.patch create mode 100644 SOURCES/0028-libparted-reread-part-table-with-0-partitions-113846.patch create mode 100644 SOURCES/0029-tests-Change-minimum-size-to-256MiB.patch create mode 100644 SOURCES/0030-libparted-handle-logical-partitions-starting-immedia.patch create mode 100644 SOURCES/0031-tests-Add-a-test-for-device-mapper-partition-sizes-1.patch create mode 100644 SOURCES/0032-libparted-device-mapper-uses-512b-sectors-1188431.patch create mode 100644 SOURCES/0033-libparted-Use-read-only-when-probing-devices-on-linu.patch create mode 100644 SOURCES/0034-tests-Use-wait_for_dev_to_-functions.patch create mode 100644 SOURCES/0035-tests-Add-udevadm-settle-to-wait_for_-loop-1260664.patch create mode 100644 SOURCES/0036-tests-Add-wait-to-t9042-1257415.patch create mode 100644 SOURCES/0037-tests-Fix-t1700-failing-on-a-host-with-a-4k-xfs-file.patch create mode 100644 SOURCES/0038-libparted-Remove-fdasd-geometry-code-from-alloc_meta.patch create mode 100644 SOURCES/0039-docs-Add-list-of-filesystems-for-fs-type-1311596.patch create mode 100644 SOURCES/0040-partprobe-Open-the-device-once-for-probing-1339705.patch create mode 100644 SOURCES/0041-tests-Stop-timing-t9040-1172675.patch create mode 100644 SOURCES/0042-tests-Set-optimal-blocks-to-64-for-scsi_debug-device.patch create mode 100644 SOURCES/0043-Add-support-for-NVMe-devices.patch create mode 100644 SOURCES/0044-Document-resizepart-command.patch create mode 100644 SOURCES/0045-parted-Add-stub-resize-command-for-backward-compatib.patch create mode 100644 SOURCES/0046-libparted-Backport-partition-resize-code.patch create mode 100644 SOURCES/0047-tests-excersise-resize-command.patch create mode 100644 SOURCES/0048-parted-add-resizepart-command.patch create mode 100644 SOURCES/parted-2.1-libparted-use-dm_udev_wait-698121.patch create mode 100644 SOURCES/parted-3.0-libparted-copy-pmbr_boot-when-duplicating-GPT-disk.patch create mode 100644 SOURCES/parted-3.1-avoid-dasd-as-default-file-image-type.patch create mode 100644 SOURCES/parted-3.1-libparted-Fix-endian-error-with-FirstUsableLBA.patch create mode 100644 SOURCES/parted-3.1-libparted-Flush-parent-device-on-open-962611.patch create mode 100644 SOURCES/parted-3.1-libparted-Recognize-btrfs-filesystem.patch create mode 100644 SOURCES/parted-3.1-libparted-add-support-for-EAV-DASD-partitions.patch create mode 100644 SOURCES/parted-3.1-libparted-add-support-for-implicit-FBA-DASD-partitions.patch create mode 100644 SOURCES/parted-3.1-libparted-check-PMBR-before-GPT-partition-table-8052.patch create mode 100644 SOURCES/parted-3.1-libparted-don-t-canonicalize-dev-md-paths.patch create mode 100644 SOURCES/parted-3.1-libparted-mklabel-eav.patch create mode 100644 SOURCES/parted-3.1-libparted-mklabel-edev.patch create mode 100644 SOURCES/parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch create mode 100644 SOURCES/parted-3.1-libparted-reallocate-buf-after-_disk_analyse_block_s.patch create mode 100644 SOURCES/parted-3.1-libparted-use-largest_partnum-in-dm_reread_part_tabl.patch create mode 100644 SOURCES/parted-3.1-test-creating-20-device-mapper-partitions.patch create mode 100644 SOURCES/parted-3.1-tests-Add-btrfs-and-xfs-to-the-fs-probe-test.patch create mode 100644 SOURCES/parted-3.1-tests-Make-sure-dm-UUIDs-are-not-erased.patch create mode 100644 SOURCES/parted-3.1-tests-add-t0301-overwrite-gpt-pmbr.sh.patch create mode 100644 SOURCES/parted-3.1-tests-cleanup-losetup-usage.patch create mode 100644 SOURCES/parted-3.1-tests-rewrite-t6001-to-use-dev-mapper.patch create mode 100644 SOURCES/pubkey.jim.meyering create mode 100644 SPECS/parted.spec diff --git a/SOURCES/0021-tests-Remove-rmmod-loop-from-t8001-1040504.patch b/SOURCES/0021-tests-Remove-rmmod-loop-from-t8001-1040504.patch new file mode 100644 index 00000000..fbb5231f --- /dev/null +++ b/SOURCES/0021-tests-Remove-rmmod-loop-from-t8001-1040504.patch @@ -0,0 +1,35 @@ +From 7ed256294ba287c807eca7bcc915a42f0030e5f9 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 22 Jan 2014 11:57:56 -0800 +Subject: [PATCH] tests: Remove rmmod loop from t8001 (#1040504) + +There is no reason to remove and reload the loop module, which may be in +use by other things on the system the test is running on. + + * tests/t8001-loop-blkpg.sh: Drop loop remove/load code. +--- + tests/t8001-loop-blkpg.sh | 8 -------- + 1 file changed, 8 deletions(-) + +diff --git a/tests/t8001-loop-blkpg.sh b/tests/t8001-loop-blkpg.sh +index deef18b..abffd4e 100755 +--- a/tests/t8001-loop-blkpg.sh ++++ b/tests/t8001-loop-blkpg.sh +@@ -27,14 +27,6 @@ cleanup_fn_() + && { udevadm settle --timeout=3; losetup -d "$loopdev"; } + } + +-# If the loop module is loaded, unload it first +-if lsmod | grep '^loop[[:space:]]'; then +- rmmod loop || fail=1 +-fi +- +-# Insert loop module with max_part > 1 +-modprobe loop max_part=7 || fail=1 +- + # Create backing file + dd if=/dev/zero of=backing_file bs=1M count=4 >/dev/null 2>&1 || fail=1 + +-- +1.8.4.2 + diff --git a/SOURCES/0022-tests-Increase-size-of-container-filesystem-in-t4100.patch b/SOURCES/0022-tests-Increase-size-of-container-filesystem-in-t4100.patch new file mode 100644 index 00000000..7c05a6a9 --- /dev/null +++ b/SOURCES/0022-tests-Increase-size-of-container-filesystem-in-t4100.patch @@ -0,0 +1,45 @@ +From 9f0da5d1112d148fc9bdbedfe3f0ee04b7a66708 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 22 Jan 2014 14:51:51 -0800 +Subject: [PATCH] tests: Increase size of container filesystem in t4100 tests + (#1036149) + +The xfs container filesystem was running out of space with larger sector +size tests. Increase it from 20M to 100M. + +* tests/t4100-dvh-partition-limits.sh: Increase fs_file to 100M +* tests/t4100-msdos-partition-limits.sh: Increase fs_file to 100M +--- + tests/t4100-dvh-partition-limits.sh | 2 +- + tests/t4100-msdos-partition-limits.sh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tests/t4100-dvh-partition-limits.sh b/tests/t4100-dvh-partition-limits.sh +index d885502..ec6981d 100755 +--- a/tests/t4100-dvh-partition-limits.sh ++++ b/tests/t4100-dvh-partition-limits.sh +@@ -37,7 +37,7 @@ mp=`pwd`/mount-point + n=4096 + + # create an XFS file system +-dd if=/dev/zero of=$fs bs=1MB count=2 seek=20 || fail=1 ++dd if=/dev/zero of=$fs bs=1MB count=2 seek=100 || fail=1 + mkfs.xfs -f -q $fs || fail=1 + mkdir "$mp" || fail=1 + +diff --git a/tests/t4100-msdos-partition-limits.sh b/tests/t4100-msdos-partition-limits.sh +index ec1854f..f03a85e 100755 +--- a/tests/t4100-msdos-partition-limits.sh ++++ b/tests/t4100-msdos-partition-limits.sh +@@ -37,7 +37,7 @@ mp=`pwd`/mount-point + n=4096 + + # create an XFS file system +-dd if=/dev/zero of=$fs bs=1MB count=2 seek=20 || fail=1 ++dd if=/dev/zero of=$fs bs=1MB count=2 seek=100 || fail=1 + mkfs.xfs -f -q $fs || fail=1 + mkdir "$mp" || fail=1 + +-- +1.8.4.2 + diff --git a/SOURCES/0023-tests-Disable-t4100-dvh-test-for-now-1036093.patch b/SOURCES/0023-tests-Disable-t4100-dvh-test-for-now-1036093.patch new file mode 100644 index 00000000..acd26f7b --- /dev/null +++ b/SOURCES/0023-tests-Disable-t4100-dvh-test-for-now-1036093.patch @@ -0,0 +1,36 @@ +From 2b55a78efa8e11202c8c5b266bc6e80386487f4d Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 22 Jan 2014 17:17:25 -0800 +Subject: [PATCH] tests: Disable t4100-dvh test for now (#1036093) + +This test is failing on ppc64, possibly because of a bug in the dvh +code. + +* tests/Makefile.am: Move t4100-dvh- test to XFAIL +--- + tests/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 98310f2..faa0f37 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -1,5 +1,6 @@ + XFAIL_TESTS = \ +- t3200-type-change.sh ++ t3200-type-change.sh \ ++ t4100-dvh-partition-limits.sh + + TEST_EXTENSIONS = .sh + SH_LOG_COMPILER = $(SHELL) +@@ -48,7 +49,6 @@ TESTS = \ + t4000-sun-raid-type.sh \ + t4001-sun-vtoc.sh \ + t4100-msdos-partition-limits.sh \ +- t4100-dvh-partition-limits.sh \ + t4100-msdos-starting-sector.sh \ + t4200-partprobe.sh \ + t4300-nilfs2-tiny.sh \ +-- +1.8.4.2 + diff --git a/SOURCES/0024-libparted-make-sure-not-to-treat-percentages-as-exac.patch b/SOURCES/0024-libparted-make-sure-not-to-treat-percentages-as-exac.patch new file mode 100644 index 00000000..98b6490b --- /dev/null +++ b/SOURCES/0024-libparted-make-sure-not-to-treat-percentages-as-exac.patch @@ -0,0 +1,56 @@ +From 911bc52b2609ccb2cc3b123ce383b07c66d54048 Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Mon, 4 Nov 2013 13:10:09 -0500 +Subject: [PATCH] libparted: make sure not to treat percentages as exact + (#1045957) + +If 1% of the drive size worked out ot be an even power of +two, it would trigger the exact placement. Add an exception +for the percent units. +--- + NEWS | 9 +++++++++ + libparted/unit.c | 2 +- + 2 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/NEWS b/NEWS +index e2d01ed..80a62d6 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,5 +1,13 @@ + GNU parted NEWS -*- outline -*- + ++* Noteworthy changes in release 3.1-16 (2014-01-22) [RHEL7] ++ ++** Bug Fixes ++ ++ If a drive was 100 times an even multiple of two, sizes specified as ++ a percentage would trigger the exact placement rule and refuse to round ++ to the nearest half percent. ++ + * Noteworthy changes in release 3.1-4 (2012-06-08) [Fedora] + + ** Bug Fixes +@@ -8,6 +16,7 @@ GNU parted NEWS -*- outline -*- + libparted: Treat disks without a PMBR as msdos labeled disks + even if they have GPT partition tables. + ++ + * Noteworthy changes in release 3.1 (2012-03-02) [stable] + + ** New features +diff --git a/libparted/unit.c b/libparted/unit.c +index 66f2b6c..265cc68 100644 +--- a/libparted/unit.c ++++ b/libparted/unit.c +@@ -548,7 +548,7 @@ ped_unit_parse_custom (const char* str, const PedDevice* dev, PedUnit unit, + do not use 4MiB as the range. Rather, presume that they + are specifying precisely the starting or ending number, + and treat "4MiB" just as we would treat "4194304B". */ +- if (is_power_of_2 (unit_size)) ++ if (is_power_of_2 (unit_size) && unit != PED_UNIT_PERCENT) + radius = 0; + + *sector = num * unit_size / dev->sector_size; +-- +1.8.4.2 + diff --git a/SOURCES/0025-tests-Use-mkfs.xfs-to-create-files-1036152.patch b/SOURCES/0025-tests-Use-mkfs.xfs-to-create-files-1036152.patch new file mode 100644 index 00000000..d24c6f8b --- /dev/null +++ b/SOURCES/0025-tests-Use-mkfs.xfs-to-create-files-1036152.patch @@ -0,0 +1,69 @@ +From e6e0f1db4535179f25ebf8f6f0a59eb430d377ff Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Thu, 23 Jan 2014 10:09:36 -0800 +Subject: [PATCH] tests: Use mkfs.xfs to create files (#1036152) + +On s390 there is a bug with mkfs.xfs and pre-existing files. Work around +it by creating the file directly with mkfs.xfs. This also works on other +arches. + +* tests/t1700-probe-fs.sh: Check for xfs and use direct file creation +* tests/t4100-dvh-partition-limits.sh: Use mkfs.xfs -dfile +* tests/t4100-msdos-partition-limits.sh: Use mkfs.xfs -dfile +--- + tests/t1700-probe-fs.sh | 9 +++++++-- + tests/t4100-dvh-partition-limits.sh | 3 +-- + tests/t4100-msdos-partition-limits.sh | 3 +-- + 3 files changed, 9 insertions(+), 6 deletions(-) + +diff --git a/tests/t1700-probe-fs.sh b/tests/t1700-probe-fs.sh +index 36e7cdf..575ca24 100755 +--- a/tests/t1700-probe-fs.sh ++++ b/tests/t1700-probe-fs.sh +@@ -31,8 +31,13 @@ for type in ext2 ext3 ext4 btrfs xfs nilfs2; do + *) n_sectors=$((257*1024)) force=;; esac + + # create an $type file system +- dd if=/dev/zero of=$dev bs=$ss count=$n_sectors >/dev/null || fail=1 +- mkfs.$type $force $dev || { warn_ $ME: mkfs.$type failed; fail=1; continue; } ++ if [ "$type" == "xfs" ]; then ++ # Work around a problem with s390 ++ mkfs.xfs -ssize=$ss -dfile,name=$dev,size=${n_sectors}s || fail=1 ++ else ++ dd if=/dev/zero of=$dev bs=$ss count=$n_sectors >/dev/null || fail=1 ++ mkfs.$type $force $dev || { warn_ $ME: mkfs.$type failed; fail=1; continue; } ++ fi + + # probe the $type file system + parted -m -s $dev u s print >out 2>&1 || fail=1 +diff --git a/tests/t4100-dvh-partition-limits.sh b/tests/t4100-dvh-partition-limits.sh +index ec6981d..88e452d 100755 +--- a/tests/t4100-dvh-partition-limits.sh ++++ b/tests/t4100-dvh-partition-limits.sh +@@ -37,8 +37,7 @@ mp=`pwd`/mount-point + n=4096 + + # create an XFS file system +-dd if=/dev/zero of=$fs bs=1MB count=2 seek=100 || fail=1 +-mkfs.xfs -f -q $fs || fail=1 ++mkfs.xfs -dfile,name=$fs,size=100m || fail=1 + mkdir "$mp" || fail=1 + + # Unmount upon interrupt, failure, etc., as well as upon normal completion. +diff --git a/tests/t4100-msdos-partition-limits.sh b/tests/t4100-msdos-partition-limits.sh +index f03a85e..9350441 100755 +--- a/tests/t4100-msdos-partition-limits.sh ++++ b/tests/t4100-msdos-partition-limits.sh +@@ -37,8 +37,7 @@ mp=`pwd`/mount-point + n=4096 + + # create an XFS file system +-dd if=/dev/zero of=$fs bs=1MB count=2 seek=100 || fail=1 +-mkfs.xfs -f -q $fs || fail=1 ++mkfs.xfs -dfile,name=$fs,size=100m || fail=1 + mkdir "$mp" || fail=1 + + # Unmount upon interrupt, failure, etc., as well as upon normal completion. +-- +1.8.4.2 + diff --git a/SOURCES/0026-Update-manpage-NAME-so-whatis-will-work-948424.patch b/SOURCES/0026-Update-manpage-NAME-so-whatis-will-work-948424.patch new file mode 100644 index 00000000..c9552890 --- /dev/null +++ b/SOURCES/0026-Update-manpage-NAME-so-whatis-will-work-948424.patch @@ -0,0 +1,25 @@ +From 9dfa4ab406c45abc2f7a7e5e64ce01b4ca9977ed Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Fri, 1 Aug 2014 14:48:13 -0700 +Subject: [PATCH] Update manpage NAME so whatis will work (#948424) + +Resolves: rhbz#948424 +--- + doc/C/parted.8 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/doc/C/parted.8 b/doc/C/parted.8 +index 689011c..5304375 100644 +--- a/doc/C/parted.8 ++++ b/doc/C/parted.8 +@@ -1,6 +1,6 @@ + .TH PARTED 8 "2007 March 29" parted "GNU Parted Manual" + .SH NAME +-GNU Parted \- a partition manipulation program ++parted \- a partition manipulation program + .SH SYNOPSIS + .B parted + [options] [device [command [options...]...]] +-- +1.9.3 + diff --git a/SOURCES/0027-GPT-add-support-for-PReP-GUID-1108196.patch b/SOURCES/0027-GPT-add-support-for-PReP-GUID-1108196.patch new file mode 100644 index 00000000..163eab84 --- /dev/null +++ b/SOURCES/0027-GPT-add-support-for-PReP-GUID-1108196.patch @@ -0,0 +1,209 @@ +From cfb23fa541ada431b8225760371bb4d5029893b1 Mon Sep 17 00:00:00 2001 +From: Daniel Battaiola Kreling +Date: Mon, 7 Oct 2013 11:51:50 +0530 +Subject: [PATCH] GPT: add support for PReP GUID (#1108196) + +PReP (PowerPC Reference Platform) boot partition is the first partition used in +PowerPC platform for containing the bootable kernel or bootloader. The firmware +searches for this partition and jumps to it for booting. So far no GUID was +specified for this partition type and hence booting from GPT disk was not +supported on this platform. A new GUID 9e1a2d38-c612-4316-aa26-8b49521e5a8b for +PReP partition is proposed to be included in GPT. + +Resolves: rhbz#1108196 + +Signed-off-by: Brian C. Lane +--- + NEWS | 7 +++++++ + doc/parted.texi | 2 +- + libparted/labels/gpt.c | 37 +++++++++++++++++++++++++++++++++++++ + 3 files changed, 45 insertions(+), 1 deletion(-) + +diff --git a/NEWS b/NEWS +index 80a62d6..4d30b1b 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,5 +1,12 @@ + GNU parted NEWS -*- outline -*- + ++* Noteworthy changes in release 3.1-18 (2014-08-12) [RHEL7.1] ++ ++** New features ++ ++ Add support for prep flag to GPT to select PowerPC Reference Platform ++ boot partition type. ++ + * Noteworthy changes in release 3.1-16 (2014-01-22) [RHEL7] + + ** Bug Fixes +diff --git a/doc/parted.texi b/doc/parted.texi +index 2b1ce64..f10d5e1 100644 +--- a/doc/parted.texi ++++ b/doc/parted.texi +@@ -823,7 +823,7 @@ physical volume. + by the Linux/PA-RISC boot loader, palo. + + @item PREP +-(MS-DOS) - this flag can be enabled so that the partition can be used ++(MS-DOS, GPT) - this flag can be enabled so that the partition can be used + as a PReP boot partition on PowerPC PReP or IBM RS6K/CHRP hardware. + + @item DIAG +diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c +index 6ca33c8..f9332bd 100644 +--- a/libparted/labels/gpt.c ++++ b/libparted/labels/gpt.c +@@ -142,6 +142,10 @@ typedef struct + ((efi_guid_t) { PED_CPU_TO_LE32 (0x5265636F), PED_CPU_TO_LE16 (0x7665), \ + PED_CPU_TO_LE16 (0x11AA), 0xaa, 0x11, \ + { 0x00, 0x30, 0x65, 0x43, 0xEC, 0xAC }}) ++#define PARTITION_PREP_GUID \ ++ ((efi_guid_t) { PED_CPU_TO_LE32 (0x9e1a2d38), PED_CPU_TO_LE16 (0xc612), \ ++ PED_CPU_TO_LE16 (0x4316), 0xaa, 0x26, \ ++ { 0x8b, 0x49, 0x52, 0x1e, 0x5a, 0x8b }}) + + struct __attribute__ ((packed)) _GuidPartitionTableHeader_t + { +@@ -283,6 +287,7 @@ typedef struct _GPTPartitionData + int atvrecv; + int msftrecv; + int legacy_boot; ++ int prep; + } GPTPartitionData; + + static PedDiskType gpt_disk_type; +@@ -782,6 +787,7 @@ _parse_part_entry (PedDisk *disk, GuidPartitionEntry_t *pte) + = gpt_part_data->hidden = gpt_part_data->msftres + = gpt_part_data->msftrecv + = gpt_part_data->legacy_boot ++ = gpt_part_data->prep + = gpt_part_data->bios_grub = gpt_part_data->atvrecv = 0; + + if (pte->Attributes.RequiredToFunction & 0x1) +@@ -805,6 +811,8 @@ _parse_part_entry (PedDisk *disk, GuidPartitionEntry_t *pte) + gpt_part_data->msftrecv = 1; + else if (!guid_cmp (gpt_part_data->type, PARTITION_APPLE_TV_RECOVERY_GUID)) + gpt_part_data->atvrecv = 1; ++ else if (!guid_cmp (gpt_part_data->type, PARTITION_PREP_GUID)) ++ gpt_part_data->prep = 1; + + return part; + } +@@ -1321,6 +1329,7 @@ gpt_partition_new (const PedDisk *disk, + gpt_part_data->msftrecv = 0; + gpt_part_data->atvrecv = 0; + gpt_part_data->legacy_boot = 0; ++ gpt_part_data->prep = 0; + uuid_generate ((unsigned char *) &gpt_part_data->uuid); + swap_uuid_and_efi_guid ((unsigned char *) (&gpt_part_data->uuid)); + memset (gpt_part_data->name, 0, sizeof gpt_part_data->name); +@@ -1394,6 +1403,11 @@ gpt_partition_set_system (PedPartition *part, + gpt_part_data->type = PARTITION_RAID_GUID; + return 1; + } ++ if (gpt_part_data->prep) ++ { ++ gpt_part_data->type = PARTITION_PREP_GUID; ++ return 1; ++ } + if (gpt_part_data->boot) + { + gpt_part_data->type = PARTITION_SYSTEM_GUID; +@@ -1564,6 +1578,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) + = gpt_part_data->hp_service + = gpt_part_data->msftres + = gpt_part_data->msftrecv ++ = gpt_part_data->prep + = gpt_part_data->atvrecv = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_BIOS_GRUB: +@@ -1575,6 +1590,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) + = gpt_part_data->hp_service + = gpt_part_data->msftres + = gpt_part_data->msftrecv ++ = gpt_part_data->prep + = gpt_part_data->atvrecv = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_RAID: +@@ -1586,6 +1602,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) + = gpt_part_data->hp_service + = gpt_part_data->msftres + = gpt_part_data->msftrecv ++ = gpt_part_data->prep + = gpt_part_data->atvrecv = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_LVM: +@@ -1597,6 +1614,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) + = gpt_part_data->hp_service + = gpt_part_data->msftres + = gpt_part_data->msftrecv ++ = gpt_part_data->prep + = gpt_part_data->atvrecv = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_HPSERVICE: +@@ -1608,6 +1626,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) + = gpt_part_data->bios_grub + = gpt_part_data->msftres + = gpt_part_data->msftrecv ++ = gpt_part_data->prep + = gpt_part_data->atvrecv = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_MSFT_RESERVED: +@@ -1619,6 +1638,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) + = gpt_part_data->bios_grub + = gpt_part_data->hp_service + = gpt_part_data->msftrecv ++ = gpt_part_data->prep + = gpt_part_data->atvrecv = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_DIAG: +@@ -1630,6 +1650,7 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) + = gpt_part_data->bios_grub + = gpt_part_data->hp_service + = gpt_part_data->msftres ++ = gpt_part_data->prep + = gpt_part_data->atvrecv = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_APPLE_TV_RECOVERY: +@@ -1641,8 +1662,21 @@ gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state) + = gpt_part_data->bios_grub + = gpt_part_data->hp_service + = gpt_part_data->msftres ++ = gpt_part_data->prep + = gpt_part_data->msftrecv = 0; + return gpt_partition_set_system (part, part->fs_type); ++ case PED_PARTITION_PREP: ++ gpt_part_data->prep = state; ++ if (state) ++ gpt_part_data->boot ++ = gpt_part_data->raid ++ = gpt_part_data->lvm ++ = gpt_part_data->bios_grub ++ = gpt_part_data->hp_service ++ = gpt_part_data->msftres ++ = gpt_part_data->msftrecv ++ = gpt_part_data->atvrecv = 0; ++ return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_HIDDEN: + gpt_part_data->hidden = state; + return 1; +@@ -1687,6 +1721,8 @@ gpt_partition_get_flag (const PedPartition *part, PedPartitionFlag flag) + return gpt_part_data->hidden; + case PED_PARTITION_LEGACY_BOOT: + return gpt_part_data->legacy_boot; ++ case PED_PARTITION_PREP: ++ return gpt_part_data->prep; + case PED_PARTITION_SWAP: + case PED_PARTITION_LBA: + case PED_PARTITION_ROOT: +@@ -1712,6 +1748,7 @@ gpt_partition_is_flag_available (const PedPartition *part, + case PED_PARTITION_APPLE_TV_RECOVERY: + case PED_PARTITION_HIDDEN: + case PED_PARTITION_LEGACY_BOOT: ++ case PED_PARTITION_PREP: + return 1; + case PED_PARTITION_SWAP: + case PED_PARTITION_ROOT: +-- +1.9.3 + diff --git a/SOURCES/0028-libparted-reread-part-table-with-0-partitions-113846.patch b/SOURCES/0028-libparted-reread-part-table-with-0-partitions-113846.patch new file mode 100644 index 00000000..137e3dc8 --- /dev/null +++ b/SOURCES/0028-libparted-reread-part-table-with-0-partitions-113846.patch @@ -0,0 +1,31 @@ +From 22f857bb8f57438ec6f34876e1933df01b448044 Mon Sep 17 00:00:00 2001 +From: Fedora Ninjas +Date: Wed, 24 Sep 2014 15:59:47 -0700 +Subject: [PATCH] libparted: reread part table with 0 partitions (#1138465) + +After removing the last partition it still needs to be able to rescan +the partition table, otherwise device-mapper (and in this case mpath) is +never told that the last partition was removed. + +Resolves: rhbz#1138465 +--- + libparted/arch/linux.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 4af0d5c..4daa881 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -2878,9 +2878,6 @@ static int + _dm_reread_part_table (PedDisk* disk) + { + int largest_partnum = ped_disk_get_last_partition_num (disk); +- if (largest_partnum <= 0) +- return 1; +- + int rc = 1; + int i; + +-- +1.9.3 + diff --git a/SOURCES/0029-tests-Change-minimum-size-to-256MiB.patch b/SOURCES/0029-tests-Change-minimum-size-to-256MiB.patch new file mode 100644 index 00000000..5fd7d068 --- /dev/null +++ b/SOURCES/0029-tests-Change-minimum-size-to-256MiB.patch @@ -0,0 +1,27 @@ +From c4bf408e794c3e2df85539e7d561da51a8ae2cad Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Fri, 7 Nov 2014 11:15:55 -0800 +Subject: [PATCH] tests: Change minimum size to 256MiB + +btrfs on ppc64 wants 136MiB so expand the minimum temp filesystem size +for the t1700-probe-fs test. +--- + tests/t1700-probe-fs.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/t1700-probe-fs.sh b/tests/t1700-probe-fs.sh +index 575ca24..83e6be4 100755 +--- a/tests/t1700-probe-fs.sh ++++ b/tests/t1700-probe-fs.sh +@@ -28,7 +28,7 @@ for type in ext2 ext3 ext4 btrfs xfs nilfs2; do + || { warn_ "$ME: no $type support"; continue; } + + case $type in ext*) n_sectors=8000 force=-F;; +- *) n_sectors=$((257*1024)) force=;; esac ++ *) n_sectors=$((512*1024)) force=;; esac + + # create an $type file system + if [ "$type" == "xfs" ]; then +-- +1.9.3 + diff --git a/SOURCES/0030-libparted-handle-logical-partitions-starting-immedia.patch b/SOURCES/0030-libparted-handle-logical-partitions-starting-immedia.patch new file mode 100644 index 00000000..ab6313ec --- /dev/null +++ b/SOURCES/0030-libparted-handle-logical-partitions-starting-immedia.patch @@ -0,0 +1,117 @@ +From 535f60c9ef91cc662d5ccaecb2f7048a3c2241d9 Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Thu, 12 Jan 2012 14:53:56 -0500 +Subject: [PATCH] libparted: handle logical partitions starting immediately + after the EBR + +_blkpg_add_partition() set the length of the extended partition +to 2 sectors to allow LILO to be installed there, beacuse the +linux kernel does this. If a logical partition used that second +sector, adding it would fail beacuse of the overlap. Now +_blkpg_add_partition() will limit the length to only the first +sector if the second is used by a logical partition. + +Previously parted did create the partition table, and after a +reboot, the kernel would recognize the table, and happily create +the extended partition as 2 sectors long, thus overlapping the +logical partition, but when parted tried to recreate the same +table with BLKPG, the kernel rightly rejected it. + +(cherry picked from commit f503870153eda7659b09e52e4adeda3bebf06471) +--- + NEWS | 8 ++++++++ + libparted/arch/linux.c | 17 +++++++++++++++-- + tests/t2310-dos-extended-2-sector-min-offset.sh | 16 ++++------------ + 3 files changed, 27 insertions(+), 14 deletions(-) + +diff --git a/NEWS b/NEWS +index 4d30b1b..d1ab2a6 100644 +--- a/NEWS ++++ b/NEWS +@@ -11,6 +11,14 @@ GNU parted NEWS -*- outline -*- + + ** Bug Fixes + ++ libparted: handle logical partitions starting immediately after ++ the EBR. Creating a logical partition one sector after the EBR ++ used to cause parted to complain that it could not inform the ++ kernel of the changes, but after a reboot, everything was fine. ++ Parted will now correctly inform the kernel of the changes, but ++ only set the length of the extended partition to 1 sector instead ++ of two, which would cause it to overlap the logical partition. ++ + If a drive was 100 times an even multiple of two, sizes specified as + a percentage would trigger the exact placement rule and refuse to round + to the nearest half percent. +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 4daa881..788cdc3 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -2371,8 +2371,21 @@ _blkpg_add_partition (PedDisk* disk, const PedPartition *part) + 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) +- linux_part.length = part->geom.length == 1 ? 512 : 1024; ++ if (part->type & PED_PARTITION_EXTENDED) { ++ linux_part.length = 1; ++ if (disk->dev->sector_size == 512) { ++ if (linux_part.length == 1) ++ 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; ++ } ++ } ++ linux_part.length *= disk->dev->sector_size; ++ } + else + linux_part.length = part->geom.length * disk->dev->sector_size; + linux_part.pno = part->num; +diff --git a/tests/t2310-dos-extended-2-sector-min-offset.sh b/tests/t2310-dos-extended-2-sector-min-offset.sh +index 89453ae..bd7defb 100644 +--- a/tests/t2310-dos-extended-2-sector-min-offset.sh ++++ b/tests/t2310-dos-extended-2-sector-min-offset.sh +@@ -1,8 +1,6 @@ + #!/bin/sh +-# Ensure that parted leaves at least 2 sectors between the beginning ++# Ensure that parted allows a single sector between the beginning + # of an extended partition and the first logical partition. +-# Before parted-2.3, it could be made to leave just one, and that +-# would cause trouble with the Linux kernel. + + # Copyright (C) 2010-2012 Free Software Foundation, Inc. + +@@ -35,7 +33,7 @@ cat < exp || framework_failure + BYT; + $scsi_dev:2048s:scsi:512:512:msdos:Linux scsi_debug:; + 1:64s:128s:65s:::lba; +-5:66s:128s:63s:::; ++5:65s:128s:64s:::; + EOF + + cat < err.exp || framework_failure +@@ -49,15 +47,9 @@ parted --align=min -s $scsi_dev mkpart extended 64s 128s> out 2>&1 || fail=1 + parted -m -s $scsi_dev u s print + compare /dev/null out || fail=1 + +-# Provoke a failure by trying to create a partition that starts just ++# Trying to create a partition that starts just + # one sector after the start of the extended partition. +-parted --align=min -s $scsi_dev mkpart logical 65s 128s > err 2>&1 && fail=1 +-compare err.exp err || fail=1 +- +-# The above failed, but created the partition nonetheless. Remove it. +-parted -s $scsi_dev rm 5 || fail=1 +- +-parted --align=min -s $scsi_dev mkpart logical 66s 128s > out 2>&1 || fail=1 ++parted --align=min -s $scsi_dev mkpart logical 65s 128s > out 2>&1 || fail=1 + compare /dev/null out || fail=1 + + parted -m -s $scsi_dev u s print > out 2>&1 +-- +2.1.0 + diff --git a/SOURCES/0031-tests-Add-a-test-for-device-mapper-partition-sizes-1.patch b/SOURCES/0031-tests-Add-a-test-for-device-mapper-partition-sizes-1.patch new file mode 100644 index 00000000..85f9e407 --- /dev/null +++ b/SOURCES/0031-tests-Add-a-test-for-device-mapper-partition-sizes-1.patch @@ -0,0 +1,106 @@ +From 1c5b0b263f08faa0649bf673a685d93ed9319bef Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 4 Feb 2015 16:31:00 -0800 +Subject: [PATCH 31/32] tests: Add a test for device-mapper partition sizes + (#1188431) + +device-mapper uses 512b sector units, not device specific sector sizes. +This test ensures that the correct partition size is created, no matter +what the device's sector size is. + +Related: rhbz#1188431 +--- + tests/Makefile.am | 1 + + tests/t6004-dm-512b-sectors.sh | 68 ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 69 insertions(+) + create mode 100644 tests/t6004-dm-512b-sectors.sh + +diff --git a/tests/Makefile.am b/tests/Makefile.am +index faa0f37..1cf859c 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -57,6 +57,7 @@ TESTS = \ + t6001-psep.sh \ + t6002-dm-many-partitions.sh \ + t6003-dm-uuid.sh \ ++ t6004-dm-512b-sectors.sh \ + t6100-mdraid-partitions.sh \ + t7000-scripting.sh \ + t8000-loop.sh \ +diff --git a/tests/t6004-dm-512b-sectors.sh b/tests/t6004-dm-512b-sectors.sh +new file mode 100644 +index 0000000..31abba9 +--- /dev/null ++++ b/tests/t6004-dm-512b-sectors.sh +@@ -0,0 +1,68 @@ ++#!/bin/sh ++# device-mapper sector sizes are 512b, make sure partitions are the correct ++# size when using larger sector sizes and a linear dm table. ++ ++# Copyright (C) 2015 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_ ++ ++grep '^#define USE_BLKID 1' "$CONFIG_HEADER" > /dev/null || ++ skip_ 'this system lacks a new-enough libblkid' ++ ++(dmsetup --help) > /dev/null 2>&1 || skip_test_ "No dmsetup installed" ++ ++# Device maps names - should be random to not conflict with existing ones on ++# the system ++linear_=plinear-$$test ++ ++cleanup_fn_() { ++ i=0 ++ udevadm settle ++ while [ $i -lt 10 ] ; do ++ [ -e "/dev/mapper/${linear_}1" ] && dmsetup remove ${linear_}1 ++ sleep .2 ++ [ -e "/dev/mapper/$linear_" ] && dmsetup remove $linear_ ++ sleep .2 ++ [ -e "/dev/mapper/${linear_}1" -o -e "/dev/mapper/$linear_" ] || i=10 ++ i=$((i + 1)) ++ done ++ udevadm settle ++} ++ ++# Create a 500M device ++ss=$sector_size_ ++scsi_debug_setup_ sector_size=$ss dev_size_mb=500 > dev-name || ++ skip_ 'failed to create scsi_debug device' ++scsi_dev=$(cat dev-name) ++ ++# Size of device, in 512b units ++scsi_dev_size=$(blockdev --getsz $scsi_dev) || framework_failure ++ ++dmsetup create $linear_ --table "0 $scsi_dev_size linear $scsi_dev 0" || framework_failure ++dev="/dev/mapper/$linear_" ++ ++# Create msdos partition table with a partition from 1MiB to 100MiB ++parted -s $dev mklabel msdos mkpart primary ext2 1MiB 101MiB > out 2>&1 || fail=1 ++compare /dev/null out || fail=1 ++ ++# The size of the partition should be 100MiB, or 204800 512b sectors ++p1_size=$(blockdev --getsz ${dev}1) || framework_failure ++[ $p1_size == 204800 ] || fail=1 ++ ++Exit $fail +-- +2.1.0 + diff --git a/SOURCES/0032-libparted-device-mapper-uses-512b-sectors-1188431.patch b/SOURCES/0032-libparted-device-mapper-uses-512b-sectors-1188431.patch new file mode 100644 index 00000000..4253f6e4 --- /dev/null +++ b/SOURCES/0032-libparted-device-mapper-uses-512b-sectors-1188431.patch @@ -0,0 +1,43 @@ +From 07f2604aeeb20d187e7243007fc5ab1a0560a4b7 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 4 Feb 2015 16:46:07 -0800 +Subject: [PATCH 32/32] libparted: device mapper uses 512b sectors (#1188431) + +device mapper doesn't use the device's sector size when creating a +table. It always uses 512b units. This causes partitions to be created +8x smaller than expected on devices with 4906b sectors. + +Resolves: rhbz#1188431 +--- + libparted/arch/linux.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 788cdc3..1d11f58 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -2849,8 +2849,10 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + dm_task_destroy (task); + task = NULL; + ++ /* device-mapper uses 512b units, not the device's sector size */ + if ( ! (params = zasprintf ("%d:%d %lld", arch_specific->major, +- arch_specific->minor, part->geom.start))) ++ arch_specific->minor, ++ part->geom.start * (disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT)))) + goto err; + + task = dm_task_create (DM_DEVICE_CREATE); +@@ -2860,7 +2862,8 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + 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, ++ /* device-mapper uses 512b units, not the device's sector size */ ++ dm_task_add_target (task, 0, part->geom.length * (disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT), + "linear", params); + if (!dm_task_set_cookie(task, &cookie, 0)) + goto err; +-- +2.1.0 + diff --git a/SOURCES/0033-libparted-Use-read-only-when-probing-devices-on-linu.patch b/SOURCES/0033-libparted-Use-read-only-when-probing-devices-on-linu.patch new file mode 100644 index 00000000..e4e71f29 --- /dev/null +++ b/SOURCES/0033-libparted-Use-read-only-when-probing-devices-on-linu.patch @@ -0,0 +1,218 @@ +From 468d537b07c3c1ad72e1ee1e9651a17c72038837 Mon Sep 17 00:00:00 2001 +From: Fedora Ninjas +Date: Thu, 6 Aug 2015 07:17:14 -0700 +Subject: [PATCH 33/35] libparted: Use read only when probing devices on linux + (#1245144) + +When a device is opened for RW closing it can trigger other actions, +like udev scanning it for partition changes. Use read only for the +init_* methods and RW for actual changes to the device. + +This adds _device_open which takes mode flags as an argument and turns +linux_open into a wrapper for it with RW_MODE. + +_device_open_ro is added to open the device with RD_MODE and increment +the open_counter. This is used in the init_* functions. + +_device_close is a wrapper around linux_close that decrements the +open_counter and is used in the init_* functions. + +All of these changes are self-contained with no external API changes. +The only visible change in behavior is that when a new PedDevice is +created the device is opened in RO_MODE instead of RW_MODE. + +Resolves: rhbz#1245144 +--- + libparted/arch/linux.c | 61 ++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 44 insertions(+), 17 deletions(-) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 1d11f58..341bbbb 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -287,6 +287,9 @@ struct blkdev_ioctl_param { + + static char* _device_get_part_path (PedDevice* dev, int num); + static int _partition_is_mounted_by_path (const char* path); ++static int _device_open (PedDevice* dev, int flags); ++static int _device_open_ro (PedDevice* dev); ++static int _device_close (PedDevice* dev); + + static int + _read_fd (int fd, char **buf) +@@ -830,7 +833,7 @@ init_ide (PedDevice* dev) + if (!_device_stat (dev, &dev_stat)) + goto error; + +- if (!ped_device_open (dev)) ++ if (!_device_open_ro (dev)) + goto error; + + if (ioctl (arch_specific->fd, HDIO_GET_IDENTITY, &hdi)) { +@@ -899,11 +902,11 @@ init_ide (PedDevice* dev) + if (!_device_probe_geometry (dev)) + goto error_close_dev; + +- ped_device_close (dev); ++ _device_close (dev); + return 1; + + error_close_dev: +- ped_device_close (dev); ++ _device_close (dev); + error: + return 0; + } +@@ -1036,7 +1039,7 @@ init_scsi (PedDevice* dev) + char* vendor; + char* product; + +- if (!ped_device_open (dev)) ++ if (!_device_open_ro (dev)) + goto error; + + if (ioctl (arch_specific->fd, SCSI_IOCTL_GET_IDLUN, &idlun) < 0) { +@@ -1050,7 +1053,7 @@ init_scsi (PedDevice* dev) + goto error_close_dev; + if (!_device_probe_geometry (dev)) + goto error_close_dev; +- ped_device_close (dev); ++ _device_close (dev); + return 1; + } + +@@ -1072,11 +1075,11 @@ init_scsi (PedDevice* dev) + if (!_device_probe_geometry (dev)) + goto error_close_dev; + +- ped_device_close (dev); ++ _device_close (dev); + return 1; + + error_close_dev: +- ped_device_close (dev); ++ _device_close (dev); + error: + return 0; + } +@@ -1088,7 +1091,7 @@ init_file (PedDevice* dev) + + if (!_device_stat (dev, &dev_stat)) + goto error; +- if (!ped_device_open (dev)) ++ if (!_device_open_ro (dev)) + goto error; + + dev->sector_size = PED_SECTOR_SIZE_DEFAULT; +@@ -1115,7 +1118,7 @@ init_file (PedDevice* dev) + goto error_close_dev; + } + +- ped_device_close (dev); ++ _device_close (dev); + + dev->bios_geom.cylinders = dev->length / 4 / 32; + dev->bios_geom.heads = 4; +@@ -1126,7 +1129,7 @@ init_file (PedDevice* dev) + return 1; + + error_close_dev: +- ped_device_close (dev); ++ _device_close (dev); + error: + return 0; + } +@@ -1142,7 +1145,7 @@ init_dasd (PedDevice* dev, const char* model_name) + if (!_device_stat (dev, &dev_stat)) + goto error; + +- if (!ped_device_open (dev)) ++ if (!_device_open_ro (dev)) + goto error; + + LinuxSpecific* arch_specific = LINUX_SPECIFIC (dev); +@@ -1182,11 +1185,11 @@ init_dasd (PedDevice* dev, const char* model_name) + + dev->model = strdup (model_name); + +- ped_device_close (dev); ++ _device_close (dev); + return 1; + + error_close_dev: +- ped_device_close (dev); ++ _device_close (dev); + error: + return 0; + } +@@ -1201,7 +1204,7 @@ init_generic (PedDevice* dev, const char* model_name) + if (!_device_stat (dev, &dev_stat)) + goto error; + +- if (!ped_device_open (dev)) ++ if (!_device_open_ro (dev)) + goto error; + + ped_exception_fetch_all (); +@@ -1249,11 +1252,11 @@ init_generic (PedDevice* dev, const char* model_name) + + dev->model = strdup (model_name); + +- ped_device_close (dev); ++ _device_close (dev); + return 1; + + error_close_dev: +- ped_device_close (dev); ++ _device_close (dev); + error: + return 0; + } +@@ -1543,12 +1546,27 @@ retry: + } + + static int ++_device_open_ro (PedDevice* dev) ++{ ++ int rc = _device_open (dev, RD_MODE); ++ if (rc) ++ dev->open_count++; ++ return rc; ++} ++ ++static int + linux_open (PedDevice* dev) + { ++ return _device_open (dev, RW_MODE); ++} ++ ++static int ++_device_open (PedDevice* dev, int flags) ++{ + LinuxSpecific* arch_specific = LINUX_SPECIFIC (dev); + + retry: +- arch_specific->fd = open (dev->path, RW_MODE); ++ arch_specific->fd = open (dev->path, flags); + + if (arch_specific->fd == -1) { + char* rw_error_msg = strerror (errno); +@@ -1617,6 +1635,15 @@ linux_refresh_close (PedDevice* dev) + return 1; + } + ++static int ++_device_close (PedDevice* dev) ++{ ++ int rc = linux_close (dev); ++ if (dev->open_count > 0) ++ dev->open_count--; ++ return rc; ++} ++ + #if SIZEOF_OFF_T < 8 + + static _syscall5(int,_llseek, +-- +2.4.3 + diff --git a/SOURCES/0034-tests-Use-wait_for_dev_to_-functions.patch b/SOURCES/0034-tests-Use-wait_for_dev_to_-functions.patch new file mode 100644 index 00000000..a2e85638 --- /dev/null +++ b/SOURCES/0034-tests-Use-wait_for_dev_to_-functions.patch @@ -0,0 +1,145 @@ +From 4182428d60496b7fe61f0599156f871e3cd63f89 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Fri, 7 Aug 2015 11:43:17 -0700 +Subject: [PATCH 34/35] tests: Use wait_for_dev_to_ functions + +Recent changes to udev have made some long-standing problems appear more +frequently. udev executes various actions when changes are made to +devices. Sometimes this can result in device nodes not appearing +immediately. Other times it can result in EBUSY being returned. This +patch only addresses devices that are slow to appear/disappear. + +It is best to use the wait_for_dev_to_appear_ and +wait_for_dev_to_disappear_ functions than to test for existance. These +will loop and wait for up to 2 seconds for it to appear. + +This also changes t9041 to fail if mkfs doesn't work since using skip +here may hide cases when the device node doesn't appear. + +Related: rhbz#1245144 +--- + tests/t1100-busy-label.sh | 10 ++-------- + tests/t6001-psep.sh | 4 ++-- + tests/t6002-dm-many-partitions.sh | 6 ++---- + tests/t6004-dm-512b-sectors.sh | 1 + + tests/t6100-mdraid-partitions.sh | 5 +++-- + tests/t9041-undetected-in-use-16th-partition.sh | 2 +- + 6 files changed, 11 insertions(+), 17 deletions(-) + +diff --git a/tests/t1100-busy-label.sh b/tests/t1100-busy-label.sh +index 9e371da..93229a7 100755 +--- a/tests/t1100-busy-label.sh ++++ b/tests/t1100-busy-label.sh +@@ -27,22 +27,16 @@ dev=$(cat dev-name) + + parted -s "$dev" mklabel msdos mkpart primary fat32 1 40 > out 2>&1 || fail=1 + compare /dev/null out || fail=1 +-mkfs.vfat ${dev}1 || skip_ "mkfs.vfat failed" ++wait_for_dev_to_appear_ ${dev}1 || fail=1 ++mkfs.vfat ${dev}1 || fail=1 + + mount_point="`pwd`/mnt" + + # Be sure to unmount upon interrupt, failure, etc. + cleanup_fn_() { umount "${dev}1" > /dev/null 2>&1; } + +-# There's a race condition here: on udev-based systems, the partition#1 +-# device, ${dev}1 (i.e., /dev/sdd1) is not created immediately, and +-# without some delay, this mount command would fail. Using a flash card +-# as $dev, the loop below typically iterates 7-20 times. +- + # create mount point dir. and mount the just-created partition on it + mkdir $mount_point || fail=1 +-i=0; while :; do test -e "${dev}1" && break; test $i = 90 && break; +- i=$(expr $i + 1); done; + mount "${dev}1" $mount_point || fail=1 + + # now that a partition is mounted, mklabel attempt must fail +diff --git a/tests/t6001-psep.sh b/tests/t6001-psep.sh +index 0c1ab99..b747732 100644 +--- a/tests/t6001-psep.sh ++++ b/tests/t6001-psep.sh +@@ -55,7 +55,7 @@ parted -s $dev mklabel msdos mkpart primary fat32 1m 5m > out 2>&1 || fail=1 + compare /dev/null out || fail=1 + + #make sure device name is correct +-test -e ${dev}p1 || fail=1 ++wait_for_dev_to_appear_ ${dev}p1 || fail=1 + + #repeat on name not ending in a digit + # setup: create a mapping +@@ -67,7 +67,7 @@ parted -s $dev mklabel msdos mkpart primary fat32 1m 5m > out 2>&1 || fail=1 + compare /dev/null out || fail=1 + + #make sure device name is correct +-test -e ${dev}1 || fail=1 ++wait_for_dev_to_appear_ ${dev}1 || fail=1 + + if [ -n "$fail" ]; then + ls /dev/mapper +diff --git a/tests/t6002-dm-many-partitions.sh b/tests/t6002-dm-many-partitions.sh +index 4d08e72..247c9ee 100755 +--- a/tests/t6002-dm-many-partitions.sh ++++ b/tests/t6002-dm-many-partitions.sh +@@ -49,10 +49,8 @@ parted -m -a min -s /dev/mapper/$dm_name mklabel gpt $cmd > /dev/null 2>&1 || fa + + # 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 ++ wait_for_dev_to_appear_ "/dev/mapper/${dm_name}p$i" || { fail=1; break; } ++ + # remove the partitions as we go, otherwise cleanup won't work. + dmsetup remove /dev/mapper/${dm_name}p$i + done +diff --git a/tests/t6004-dm-512b-sectors.sh b/tests/t6004-dm-512b-sectors.sh +index 31abba9..c3045af 100644 +--- a/tests/t6004-dm-512b-sectors.sh ++++ b/tests/t6004-dm-512b-sectors.sh +@@ -60,6 +60,7 @@ dev="/dev/mapper/$linear_" + # Create msdos partition table with a partition from 1MiB to 100MiB + parted -s $dev mklabel msdos mkpart primary ext2 1MiB 101MiB > out 2>&1 || fail=1 + compare /dev/null out || fail=1 ++wait_for_dev_to_appear_ ${dev}1 || fail=1 + + # The size of the partition should be 100MiB, or 204800 512b sectors + p1_size=$(blockdev --getsz ${dev}1) || framework_failure +diff --git a/tests/t6100-mdraid-partitions.sh b/tests/t6100-mdraid-partitions.sh +index aedf69b..d7e7d6a 100755 +--- a/tests/t6100-mdraid-partitions.sh ++++ b/tests/t6100-mdraid-partitions.sh +@@ -54,13 +54,14 @@ parted -s $md_dev mklabel gpt \ + compare /dev/null out || fail=1 + + # Verify that kernel has been informed about the second device. +-grep "${md_name}p2" /proc/partitions || { fail=1; cat /proc/partitions; } ++wait_for_dev_to_appear_ ${md_dev}p2 || { fail=1; cat /proc/partitions; } + + # Remove partitions from the raid device. + parted -s $md_dev rm 2 rm 1 > out 2>&1 || fail=1 + compare /dev/null out || fail=1 + + # Verify that kernel has been informed about those removals. +-grep "${md_name}p[12]" /proc/partitions && { fail=1; cat /proc/partitions; } ++wait_for_dev_to_disappear_ ${md_dev}p1 2 || { fail=1; cat /proc/partitions; } ++wait_for_dev_to_disappear_ ${md_dev}p2 2 || { fail=1; cat /proc/partitions; } + + Exit $fail +diff --git a/tests/t9041-undetected-in-use-16th-partition.sh b/tests/t9041-undetected-in-use-16th-partition.sh +index 6ddc7d8..0b22b0e 100644 +--- a/tests/t9041-undetected-in-use-16th-partition.sh ++++ b/tests/t9041-undetected-in-use-16th-partition.sh +@@ -72,7 +72,7 @@ wait_for_dev_to_appear_ ${scsi_dev}16 || fail_ ${scsi_dev}16 did not appear + + partitions="${scsi_dev}14 ${scsi_dev}15 ${scsi_dev}16" + for i in $partitions; do +- mkfs.ext3 $i || skip_ mkfs.ext3 $i failed ++ mkfs.ext3 $i || fail=1 + done + + # be sure to unmount upon interrupt, failure, etc. +-- +2.4.3 + diff --git a/SOURCES/0035-tests-Add-udevadm-settle-to-wait_for_-loop-1260664.patch b/SOURCES/0035-tests-Add-udevadm-settle-to-wait_for_-loop-1260664.patch new file mode 100644 index 00000000..1ab2558f --- /dev/null +++ b/SOURCES/0035-tests-Add-udevadm-settle-to-wait_for_-loop-1260664.patch @@ -0,0 +1,119 @@ +From 0d00bd73ba85c18082cbe47dd76e2adeba7e8620 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 1 Mar 2016 10:38:26 -0800 +Subject: [PATCH] tests: Add udevadm settle to wait_for_ loop (#1260664) + +Sometimes the device will vanish after the wait_for_dev_to_appear exits. +Add udevadm settle in an attempt to make sure the udev system is done +flapping around and the device will stay in place. + +Related: rhbz#1260664 +--- + tests/t-lib-helpers.sh | 2 ++ + tests/t-local.sh | 2 ++ + tests/t6001-psep.sh | 2 ++ + tests/t6002-dm-many-partitions.sh | 1 + + tests/t6003-dm-uuid.sh | 2 ++ + tests/t6100-mdraid-partitions.sh | 1 + + 6 files changed, 10 insertions(+) + +diff --git a/tests/t-lib-helpers.sh b/tests/t-lib-helpers.sh +index 4b3c122..b65d675 100644 +--- a/tests/t-lib-helpers.sh ++++ b/tests/t-lib-helpers.sh +@@ -371,6 +371,7 @@ wait_for_dev_to_appear_() + local i=0 + local incr=1 + while :; do ++ udevadm settle + ls "$file" > /dev/null 2>&1 && return 0 + sleep .1 2>/dev/null || { sleep 1; incr=10; } + i=$(expr $i + $incr); test $i = 20 && break +@@ -386,6 +387,7 @@ wait_for_dev_to_disappear_() + local i=0 + local incr=1 + while :; do ++ udevadm settle + ls "$file" > /dev/null 2>&1 || return 0 + sleep .1 2>/dev/null || { sleep 1; incr=10; } + i=$(expr $i + $incr); test $i -ge $(expr $n_sec \* 10) && break +diff --git a/tests/t-local.sh b/tests/t-local.sh +index dde1b8d..5305865 100644 +--- a/tests/t-local.sh ++++ b/tests/t-local.sh +@@ -47,6 +47,7 @@ wait_for_dev_to_appear_() + local i=0 + local incr=1 + while :; do ++ udevadm settle + ls "$file" > /dev/null 2>&1 && return 0 + sleep .1 2>/dev/null || { sleep 1; incr=10; } + i=$(expr $i + $incr); test $i = 20 && break +@@ -110,6 +111,7 @@ scsi_debug_setup_() + local i=0 + local new_dev + while :; do ++ udevadm settle + new_dev=$(new_sdX_) && break + sleep .1 2>/dev/null || { sleep 1; incr=10; } + i=$(expr $i + $incr); test $i = 20 && break +diff --git a/tests/t6001-psep.sh b/tests/t6001-psep.sh +index b747732..f22c877 100644 +--- a/tests/t6001-psep.sh ++++ b/tests/t6001-psep.sh +@@ -20,6 +20,8 @@ + . "${srcdir=.}/init.sh"; path_prepend_ ../parted + + require_root_ ++require_udevadm_settle_ ++ + (dmsetup --help) > /dev/null 2>&1 || skip_test_ "No dmsetup installed" + + # Device maps names - should be random to not conflict with existing ones on +diff --git a/tests/t6002-dm-many-partitions.sh b/tests/t6002-dm-many-partitions.sh +index 247c9ee..13894f5 100755 +--- a/tests/t6002-dm-many-partitions.sh ++++ b/tests/t6002-dm-many-partitions.sh +@@ -20,6 +20,7 @@ + . "${srcdir=.}/init.sh"; path_prepend_ ../parted + + require_root_ ++require_udevadm_settle_ + (dmsetup --help) > /dev/null 2>&1 || skip_test_ "No dmsetup installed" + + ss=$sector_size_ +diff --git a/tests/t6003-dm-uuid.sh b/tests/t6003-dm-uuid.sh +index f58cb06..f51e45f 100755 +--- a/tests/t6003-dm-uuid.sh ++++ b/tests/t6003-dm-uuid.sh +@@ -20,6 +20,7 @@ + . "${srcdir=.}/init.sh"; path_prepend_ ../parted + + require_root_ ++require_udevadm_settle_ + (dmsetup --help) > /dev/null 2>&1 || skip_test_ "No dmsetup installed" + + ss=$sector_size_ +@@ -46,6 +47,7 @@ for ((i=1; i<=$n_partitions; i+=1)); do + 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 ++wait_for_dev_to_appear_ /dev/mapper/${dm_name}p${n_partitions} || fail=1 + + # Make sure all the partitions have UUIDs + for ((i=1; i<=$n_partitions; i+=1)); do +diff --git a/tests/t6100-mdraid-partitions.sh b/tests/t6100-mdraid-partitions.sh +index d7e7d6a..a74afe0 100755 +--- a/tests/t6100-mdraid-partitions.sh ++++ b/tests/t6100-mdraid-partitions.sh +@@ -38,6 +38,7 @@ parted -s "$scsi_dev" mklabel gpt \ + mkpart p1 ext2 1M 4M \ + mkpart p2 ext2 5M 8M > out 2>&1 || fail=1 + compare /dev/null out || fail=1 ++wait_for_dev_to_appear_ ${scsi_dev}2 || { fail=1; cat /proc/partitions; } + + cleanup_fn_() { + # stop mdraid array +-- +2.5.0 + diff --git a/SOURCES/0036-tests-Add-wait-to-t9042-1257415.patch b/SOURCES/0036-tests-Add-wait-to-t9042-1257415.patch new file mode 100644 index 00000000..be3d0d2c --- /dev/null +++ b/SOURCES/0036-tests-Add-wait-to-t9042-1257415.patch @@ -0,0 +1,31 @@ +From ce7a3fd5e2beeee6b0765decb77ba8ee15867342 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 1 Mar 2016 13:51:54 -0800 +Subject: [PATCH] tests: Add wait to t9042 (#1257415) + +Also make the new disklabel and first partition all in one step to +prevent udev problems. + +Resolves: rhbz#1257415 +--- + tests/t9042-dos-partition-limit.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tests/t9042-dos-partition-limit.sh b/tests/t9042-dos-partition-limit.sh +index 67ea86d..fb2dd72 100644 +--- a/tests/t9042-dos-partition-limit.sh ++++ b/tests/t9042-dos-partition-limit.sh +@@ -44,8 +44,8 @@ printf '%s\n' "BYT;" \ + "1:$((start-2))s:$((n-1))s:$((n-start+2))s:::lba;" \ + > exp || fail=1 + +-parted -s $scsi_dev mklabel msdos || fail=1 +-parted -s -a min $scsi_dev mkpart extended $((start-2))s 100% || fail=1 ++parted -s -a min $scsi_dev mklabel msdos mkpart extended $((start-2))s 100% || fail=1 ++wait_for_dev_to_appear_ ${scsi_dev}1 || fail=1 + + i=1 + while :; do +-- +2.5.0 + diff --git a/SOURCES/0037-tests-Fix-t1700-failing-on-a-host-with-a-4k-xfs-file.patch b/SOURCES/0037-tests-Fix-t1700-failing-on-a-host-with-a-4k-xfs-file.patch new file mode 100644 index 00000000..4fc293cb --- /dev/null +++ b/SOURCES/0037-tests-Fix-t1700-failing-on-a-host-with-a-4k-xfs-file.patch @@ -0,0 +1,57 @@ +From 72ed2ef652be536c6752febf4f03cfc5d343e520 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Mon, 29 Feb 2016 14:31:35 -0800 +Subject: [PATCH] tests: Fix t1700 failing on a host with a 4k xfs filesystem + (#1260664) + +The problem is that mkfs.xfs won't work if the file it is trying to +create is on a filesystem with a sector size larger than the passed +-ssize value. So a host with 4k disks (eg. s390) and the xfs filesystem +will fail with the error message: + illegal sector size 512; hw sector is 4096 + +Failures setting up the environment for the test aren't parted bugs. +This stops treating mkfs and dd errors as test failures, skipping the fs +and logging a warning. + +Related: rhbz#1260664 +--- + tests/t1700-probe-fs.sh | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/tests/t1700-probe-fs.sh b/tests/t1700-probe-fs.sh +index 83e6be4..2b59307 100755 +--- a/tests/t1700-probe-fs.sh ++++ b/tests/t1700-probe-fs.sh +@@ -30,13 +30,13 @@ for type in ext2 ext3 ext4 btrfs xfs nilfs2; do + case $type in ext*) n_sectors=8000 force=-F;; + *) n_sectors=$((512*1024)) force=;; esac + +- # create an $type file system +- if [ "$type" == "xfs" ]; then +- # Work around a problem with s390 +- mkfs.xfs -ssize=$ss -dfile,name=$dev,size=${n_sectors}s || fail=1 ++ # create an $type file system, creation failures are not parted bugs, ++ # skip the filesystem instead of failing the test. ++ if [ "$type" = "xfs" ]; then ++ mkfs.xfs -ssize=$ss -dfile,name=$dev,size=${n_sectors}s || { warn_ "$ME: mkfs.$type failed, skipping"; continue; } + else +- dd if=/dev/zero of=$dev bs=$ss count=$n_sectors >/dev/null || fail=1 +- mkfs.$type $force $dev || { warn_ $ME: mkfs.$type failed; fail=1; continue; } ++ dd if=/dev/null of=$dev bs=$ss seek=$n_sectors >/dev/null || { warn_ "$ME: dd failed, skipping $type"; continue; } ++ mkfs.$type $force $dev || { warn_ "$ME: mkfs.$type failed skipping"; continue; } + fi + + # probe the $type file system +@@ -48,7 +48,7 @@ done + # Some features should indicate ext4 by themselves. + for feature in uninit_bg flex_bg; do + # create an ext3 file system +- dd if=/dev/zero of=$dev bs=1024 count=4096 >/dev/null || fail=1 ++ dd if=/dev/null of=$dev bs=1024 seek=4096 >/dev/null || skip_ "dd failed" + mkfs.ext3 -F $dev >/dev/null || skip_ "mkfs.ext3 failed" + + # set the feature +-- +2.5.0 + diff --git a/SOURCES/0038-libparted-Remove-fdasd-geometry-code-from-alloc_meta.patch b/SOURCES/0038-libparted-Remove-fdasd-geometry-code-from-alloc_meta.patch new file mode 100644 index 00000000..22bc7c34 --- /dev/null +++ b/SOURCES/0038-libparted-Remove-fdasd-geometry-code-from-alloc_meta.patch @@ -0,0 +1,48 @@ +From 9da2f460bebf9a8281fdd52536d3676b0914b8fd Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Mon, 11 Apr 2016 15:10:51 -0700 +Subject: [PATCH 38/39] libparted: Remove fdasd geometry code from + alloc_metadata (#1244833) + +commit db20944f changed how the trailing_metadata_end is calculated in +dasd_alloc_metadata, removing the need for setting up the anchor struct. +But dasd_alloc_metadata can be called in various contexts, and the +arch_specific->fd may or may not be valid during these calls. This can +result in unpredictable crashes when it uses a stale fd and tries to run +the file image code in fdasd_get_geometry instead of the device code. + +The solution is to just drop the unneeded code, and to remember that +arch_specific->fd should only be used when ped_device_open has first +been called. + +Resolves: rhbz#1244833 +--- + libparted/labels/dasd.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c +index 4d533cf..5bffda7 100644 +--- a/libparted/labels/dasd.c ++++ b/libparted/labels/dasd.c +@@ -950,7 +950,6 @@ dasd_alloc_metadata (PedDisk* disk) + PedPartition* part = NULL; /* initialize solely to placate gcc */ + PedPartition* new_part2; + PedSector trailing_meta_start, trailing_meta_end; +- struct fdasd_anchor anchor; + + PED_ASSERT (disk != NULL); + PED_ASSERT (disk->dev != NULL); +@@ -1000,10 +999,7 @@ dasd_alloc_metadata (PedDisk* disk) + backed up, then restored to a larger size disk, etc. + */ + trailing_meta_start = part->geom.end + 1; +- fdasd_initialize_anchor(&anchor); +- fdasd_get_geometry(disk->dev, &anchor, arch_specific->fd); + trailing_meta_end = (long long) disk->dev->length - 1; +- fdasd_cleanup(&anchor); + if (trailing_meta_end >= trailing_meta_start) { + new_part2 = ped_partition_new (disk,PED_PARTITION_METADATA, + NULL, trailing_meta_start, trailing_meta_end); +-- +2.5.5 + diff --git a/SOURCES/0039-docs-Add-list-of-filesystems-for-fs-type-1311596.patch b/SOURCES/0039-docs-Add-list-of-filesystems-for-fs-type-1311596.patch new file mode 100644 index 00000000..fd629c16 --- /dev/null +++ b/SOURCES/0039-docs-Add-list-of-filesystems-for-fs-type-1311596.patch @@ -0,0 +1,29 @@ +From 8e64cda0151fa70195030d5abc0361bd3cd187bb Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Mon, 29 Feb 2016 16:47:18 -0800 +Subject: [PATCH 39/39] docs: Add list of filesystems for fs-type (#1311596) + +Add the most common filesystem types to the parted manpage. + +Resolves: rhbz#1311596 +(cherry picked from commit c9f50a36aee0a4c373b5e1bd3069aeb18fac055d) +--- + doc/C/parted.8 | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/doc/C/parted.8 b/doc/C/parted.8 +index 1ea741e..03bb3a5 100644 +--- a/doc/C/parted.8 ++++ b/doc/C/parted.8 +@@ -76,6 +76,8 @@ should be one of "aix", "amiga", "bsd", "dvh", "gpt", "loop", "mac", "msdos", + .B mkpart \fIpart-type\fP \fI[fs-type]\fP \fIstart\fP \fIend\fP + Make a \fIpart-type\fP partition for filesystem \fIfs-type\fP (if specified), + beginning at \fIstart\fP and ending at \fIend\fP (by default in megabytes). ++\fIfs-type\fP can be one of "btrfs", "ext2", "ext3", "ext4", "fat16", "fat32", ++"hfs", "hfs+", "linux-swap", "ntfs", "reiserfs", or "xfs". + \fIpart-type\fP should be one of "primary", "logical", or "extended". + .TP + .B name \fIpartition\fP \fIname\fP +-- +2.5.5 + diff --git a/SOURCES/0040-partprobe-Open-the-device-once-for-probing-1339705.patch b/SOURCES/0040-partprobe-Open-the-device-once-for-probing-1339705.patch new file mode 100644 index 00000000..d470578c --- /dev/null +++ b/SOURCES/0040-partprobe-Open-the-device-once-for-probing-1339705.patch @@ -0,0 +1,45 @@ +From c34f2e31d804d70332b8be9760ea3f285d480070 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 25 May 2016 09:00:04 -0700 +Subject: [PATCH] partprobe: Open the device once for probing (#1339705) + +Previously there were 3 open/close pairs for the device, which may +result in triggering extra udev actions. Instead, open it once at the +start of process_dev and close it at the end. + +Resolves: rhbz#1339705 +--- + partprobe/partprobe.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/partprobe/partprobe.c b/partprobe/partprobe.c +index 8bccc4f..c5260c6 100644 +--- a/partprobe/partprobe.c ++++ b/partprobe/partprobe.c +@@ -108,6 +108,9 @@ process_dev (PedDevice* dev) + PedDiskType* disk_type; + PedDisk* disk; + ++ if (!ped_device_open (dev)) ++ return 0; ++ + disk_type = ped_disk_probe (dev); + if (!disk_type || !strcmp (disk_type->name, "loop")) + return 1; +@@ -122,11 +125,13 @@ process_dev (PedDevice* dev) + if (opt_summary) + summary (disk); + ped_disk_destroy (disk); ++ ped_device_close (dev); + return 1; + + error_destroy_disk: + ped_disk_destroy (disk); + error: ++ ped_device_close (dev); + return 0; + } + +-- +2.5.5 + diff --git a/SOURCES/0041-tests-Stop-timing-t9040-1172675.patch b/SOURCES/0041-tests-Stop-timing-t9040-1172675.patch new file mode 100644 index 00000000..77ea916c --- /dev/null +++ b/SOURCES/0041-tests-Stop-timing-t9040-1172675.patch @@ -0,0 +1,45 @@ +From 4e729dc2d3ab4339181f59dc0a51583ecc14c7ab Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Mon, 29 Feb 2016 16:54:05 -0800 +Subject: [PATCH] tests: Stop timing t9040 (#1172675) + +parted doesn't have any control over how long this takes, there is no +reason to consider this a parted bug if it takes longer than expected. + +Resolves: rhbz#1172675 +--- + tests/t9040-many-partitions.sh | 10 ---------- + 1 file changed, 10 deletions(-) + +diff --git a/tests/t9040-many-partitions.sh b/tests/t9040-many-partitions.sh +index 8949310..1f8e201 100644 +--- a/tests/t9040-many-partitions.sh ++++ b/tests/t9040-many-partitions.sh +@@ -53,9 +53,7 @@ while :; do + done + + # Time the actual command: +-t0=$(date +%s.%N) + parted -m -a min -s $scsi_dev mklabel gpt $cmd u s p > out 2>&1 || fail=1 +-t_final=$(date +%s.%N) + + i=1 + while :; do +@@ -64,14 +62,6 @@ while :; do + printf "$i:${s}s:${e}s:${partition_sectors}s::p$i:;\n" >> exp + test $i = $n_partitions && break; i=$((i+1)) + done +- +-# Fail the test if it takes too long. +-# On Fedora 16, this takes about 10 seconds for me. +-# With Fedora-12-era kernels, it typically took more than 150 seconds. +-$AWK "BEGIN {d = $t_final - $t0; n = $n_partitions; st = 60 < d;"\ +-' printf "created %d partitions in %.2f seconds\n", n, d; exit st }' /dev/null \ +- || fail=1 +- + compare exp out || fail=1 + + Exit $fail +-- +2.5.5 + diff --git a/SOURCES/0042-tests-Set-optimal-blocks-to-64-for-scsi_debug-device.patch b/SOURCES/0042-tests-Set-optimal-blocks-to-64-for-scsi_debug-device.patch new file mode 100644 index 00000000..dead2e57 --- /dev/null +++ b/SOURCES/0042-tests-Set-optimal-blocks-to-64-for-scsi_debug-device.patch @@ -0,0 +1,32 @@ +From f648310fbc24186395e1864a48571982e1588435 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 23 Aug 2016 08:55:18 -0700 +Subject: [PATCH] tests: Set optimal blocks to 64 for scsi_debug devices + (#1359682) + +The Linux kernel 4.5 changed the optimal blocks count from 64 to 1024 +This causes tests using scsi_debug devices to fail because of alignment +issues. Set the opt_blks to 64 so that we have consistent behavior +across kernels. + +Resolves: rhbz#1359682 +--- + tests/t-local.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/t-local.sh b/tests/t-local.sh +index 5305865..93ee0f7 100644 +--- a/tests/t-local.sh ++++ b/tests/t-local.sh +@@ -98,7 +98,7 @@ scsi_debug_setup_() + # It is not trivial to determine the name of the device we're creating. + # Record the names of all /sys/block/sd* devices *before* probing: + touch stamp +- modprobe scsi_debug "$@" || { rm -f stamp; return 1; } ++ modprobe scsi_debug opt_blks=64 "$@" || { rm -f stamp; return 1; } + scsi_debug_modprobe_succeeded_=1 + test "$VERBOSE" = yes \ + && warn_ $ME_ modprobe scsi_debug succeeded +-- +2.7.4 + diff --git a/SOURCES/0043-Add-support-for-NVMe-devices.patch b/SOURCES/0043-Add-support-for-NVMe-devices.patch new file mode 100644 index 00000000..e9b4113c --- /dev/null +++ b/SOURCES/0043-Add-support-for-NVMe-devices.patch @@ -0,0 +1,122 @@ +From 62cb6416f112dda0b0b969c1247cbc0f98314182 Mon Sep 17 00:00:00 2001 +From: Petr Uzel +Date: Tue, 14 Jun 2016 13:17:00 +0200 +Subject: [PATCH] Add support for NVMe devices + +Recognize NVMe Devices, so "parted -s /dev/nvme0n1" now prints +"NVMe Device (nvme)" instead of "Model: Unknown (unknown)". + +In order for a device to be recognized as NVMe, it has to +have a 'blkext' major number. But since this major can be +used also by other device types, we also check the device +path contains 'nvme' as a substring. + +* NEWS: Mention the change +* include/parted/device.h.in(PedDeviceType): Add PED_DEVICE_NVME +* libparted/arch/linux.c(BLKEXT_MAJOR): New define. +* libparted/arch/linux.c(_is_blkext_major): New function. +* libparted/arch/linux.c(_device_probe_type): Recognize NVMe devices. +* libparted/arch/linux.c(linux_new): Handle NVMe devices. +* parted/parted.c(do_print): Add "nvme" to list of transports. + +Signed-off-by: Brian C. Lane +(cherry picked from commit e4ae4330f3e33201aeeed3b7ca88e15d98d03e13) + +Resolves: rhbz#1316239 +--- + NEWS | 4 ++++ + include/parted/device.in.h | 3 ++- + libparted/arch/linux.c | 14 ++++++++++++++ + parted/parted.c | 2 +- + 4 files changed, 21 insertions(+), 2 deletions(-) + +diff --git a/NEWS b/NEWS +index d1ab2a6..d1a6f58 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,5 +1,9 @@ + GNU parted NEWS -*- outline -*- + ++* Noteworthy changes in release 3.1-29 (2017-04-11) [RHEL7.4] ++ ++ Parted now recognizes NVMe devices ++ + * Noteworthy changes in release 3.1-18 (2014-08-12) [RHEL7.1] + + ** New features +diff --git a/include/parted/device.in.h b/include/parted/device.in.h +index a3d1737..b0aa1f2 100644 +--- a/include/parted/device.in.h ++++ b/include/parted/device.in.h +@@ -49,7 +49,8 @@ typedef enum { + PED_DEVICE_VIRTBLK = 15, + PED_DEVICE_AOE = 16, + PED_DEVICE_MD = 17, +- PED_DEVICE_LOOP = 18 ++ PED_DEVICE_LOOP = 18, ++ PED_DEVICE_NVME = 19 + } PedDeviceType; + + typedef struct _PedDevice PedDevice; +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 341bbbb..fa329f4 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -275,6 +275,7 @@ struct blkdev_ioctl_param { + #define SDMMC_MAJOR 179 + #define LOOP_MAJOR 7 + #define MD_MAJOR 9 ++#define BLKEXT_MAJOR 259 + + #define SCSI_BLK_MAJOR(M) ( \ + (M) == SCSI_DISK0_MAJOR \ +@@ -437,6 +438,12 @@ _is_virtblk_major (int major) + return _major_type_in_devices (major, "virtblk"); + } + ++static int ++_is_blkext_major (int major) ++{ ++ return _major_type_in_devices (major, "blkext"); ++} ++ + #ifdef ENABLE_DEVICE_MAPPER + static int + _is_dm_major (int major) +@@ -600,6 +607,8 @@ _device_probe_type (PedDevice* dev) + dev->type = PED_DEVICE_LOOP; + } else if (dev_major == MD_MAJOR) { + dev->type = PED_DEVICE_MD; ++ } else if (_is_blkext_major(dev_major) && dev->path && strstr(dev->path, "nvme")) { ++ dev->type = PED_DEVICE_NVME; + } else { + dev->type = PED_DEVICE_UNKNOWN; + } +@@ -1372,6 +1381,11 @@ linux_new (const char* path) + goto error_free_arch_specific; + break; + ++ case PED_DEVICE_NVME: ++ if (!init_generic (dev, _("NVMe Device"))) ++ goto error_free_arch_specific; ++ break; ++ + case PED_DEVICE_ATARAID: + if (!init_generic (dev, _("ATARAID Controller"))) + goto error_free_arch_specific; +diff --git a/parted/parted.c b/parted/parted.c +index 789030a..957789a 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -947,7 +947,7 @@ _print_disk_info (const PedDevice *dev, const PedDisk *disk) + "cpqarray", "file", "ataraid", "i2o", + "ubd", "dasd", "viodasd", "sx8", "dm", + "xvd", "sd/mmc", "virtblk", "aoe", +- "md", "loopback"}; ++ "md", "loopback", "nvme"}; + + char* start = ped_unit_format (dev, 0); + PedUnit default_unit = ped_unit_get_default (); +-- +2.9.4 + diff --git a/SOURCES/0044-Document-resizepart-command.patch b/SOURCES/0044-Document-resizepart-command.patch new file mode 100644 index 00000000..80b921f8 --- /dev/null +++ b/SOURCES/0044-Document-resizepart-command.patch @@ -0,0 +1,65 @@ +From c051e9f7eaae007940a73be1509257bd52c569de Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Sun, 25 May 2014 14:43:39 -0400 +Subject: [PATCH 44/48] Document resizepart command + +(cherry picked from commit 5c793853fe5cb0718d895c3394fb909c73c6fa1e) + +Related: rhbz#1423357 +--- + 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 03bb3a5..5a24c94 100644 +--- a/doc/C/parted.8 ++++ b/doc/C/parted.8 +@@ -95,6 +95,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 f10d5e1..d498367 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:: +@@ -715,6 +716,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 +-- +2.9.4 + diff --git a/SOURCES/0045-parted-Add-stub-resize-command-for-backward-compatib.patch b/SOURCES/0045-parted-Add-stub-resize-command-for-backward-compatib.patch new file mode 100644 index 00000000..d77d797a --- /dev/null +++ b/SOURCES/0045-parted-Add-stub-resize-command-for-backward-compatib.patch @@ -0,0 +1,62 @@ +From 575b286502bd7338bfeeafbfc5e6ae6718b269f9 Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Tue, 8 Jan 2013 19:40:35 -0500 +Subject: [PATCH 45/48] 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. + +(cherry picked from commit 56bfbe21ecca0cb6466c78baed192dc2e5401676) + +Related: rhbz#1423357 +--- + parted/parted.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +diff --git a/parted/parted.c b/parted/parted.c +index 957789a..d4a397b 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -1478,6 +1478,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_rm (PedDevice** dev) + { + PedDisk* disk; +@@ -1891,6 +1901,20 @@ 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 ( ++_("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 ( +-- +2.9.4 + diff --git a/SOURCES/0046-libparted-Backport-partition-resize-code.patch b/SOURCES/0046-libparted-Backport-partition-resize-code.patch new file mode 100644 index 00000000..5b054ce8 --- /dev/null +++ b/SOURCES/0046-libparted-Backport-partition-resize-code.patch @@ -0,0 +1,842 @@ +From 31ab97cfe0233191a73a1dd9cb7cd193451491da Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Fri, 11 Aug 2017 08:37:11 -0700 +Subject: [PATCH 46/48] libparted: Backport partition resize code + +This adds _blkpg_resize_partition, _dm_resize_partition, and adjust the +current code to support it. Changes are somewhat extensive, since they +also touch _disk_sync_part_table. + +This is based on code from commit f09ca967a0bc443b869a6fad5b5ffe8e95c3fe9a + +Related: rhbz#1423357 +--- + libparted/arch/linux.c | 673 +++++++++++++++++++++++++++++-------------------- + 1 file changed, 403 insertions(+), 270 deletions(-) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index fa329f4..6e78faf 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -288,6 +288,7 @@ struct blkdev_ioctl_param { + + static char* _device_get_part_path (PedDevice* dev, int num); + static int _partition_is_mounted_by_path (const char* path); ++static unsigned int _device_get_partition_range(PedDevice const* dev); + static int _device_open (PedDevice* dev, int flags); + static int _device_open_ro (PedDevice* dev); + static int _device_close (PedDevice* dev); +@@ -446,6 +447,17 @@ _is_blkext_major (int major) + + #ifdef ENABLE_DEVICE_MAPPER + static int ++_dm_task_run_wait (struct dm_task *task, uint32_t cookie) ++{ ++ int rc = 0; ++ ++ rc = dm_task_run (task); ++ dm_udev_wait (cookie); ++ ++ return rc; ++} ++ ++static int + _is_dm_major (int major) + { + return _major_type_in_devices (major, "device-mapper"); +@@ -1521,6 +1533,7 @@ _flush_cache (PedDevice* dev) + { + LinuxSpecific* arch_specific = LINUX_SPECIFIC (dev); + int i; ++ int lpn = _device_get_partition_range(dev); + + if (dev->read_only) + return; +@@ -1532,7 +1545,7 @@ _flush_cache (PedDevice* dev) + if (_have_kern26()) + return; + +- for (i = 1; i < 16; i++) { ++ for (i = 1; i < lpn; i++) { + char* name; + int fd; + +@@ -2268,28 +2281,63 @@ zasprintf (const char *format, ...) + return r < 0 ? NULL : resultp; + } + ++#ifdef ENABLE_DEVICE_MAPPER ++static char * ++dm_canonical_path (PedDevice const *dev) ++{ ++ LinuxSpecific const *arch_specific = LINUX_SPECIFIC (dev); ++ ++ /* 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; ++ char *dev_name = zasprintf ("/dev/mapper/%s", dm_task_get_name (task)); ++ if (dev_name == NULL) ++ goto err; ++ dm_task_destroy (task); ++ return dev_name; ++err: ++ return NULL; ++} ++#endif ++ + static char* + _device_get_part_path (PedDevice *dev, int num) + { +- size_t path_len = strlen (dev->path); +- ++ char *devpath; ++ size_t path_len; + char *result; ++#ifdef ENABLE_DEVICE_MAPPER ++ devpath = (dev->type == PED_DEVICE_DM ++ ? dm_canonical_path (dev) : dev->path); ++#else ++ devpath = dev->path; ++#endif ++ path_len = strlen (devpath); + /* Check for devfs-style /disc => /partN transformation + unconditionally; the system might be using udev with devfs rules, + and if not the test is harmless. */ +- if (5 < path_len && !strcmp (dev->path + path_len - 5, "/disc")) { ++ if (5 < path_len && !strcmp (devpath + path_len - 5, "/disc")) { + /* replace /disc with /part%d */ + result = zasprintf ("%.*s/part%d", +- (int) (path_len - 5), dev->path, num); ++ (int) (path_len - 5), devpath, num); + } else { + char const *p = (dev->type == PED_DEVICE_DAC960 + || dev->type == PED_DEVICE_CPQARRAY + || dev->type == PED_DEVICE_ATARAID + || isdigit (dev->path[path_len - 1]) + ? "p" : ""); +- result = zasprintf ("%s%s%d", dev->path, p, num); ++ result = zasprintf ("%s%s%d", devpath, p, num); + } +- ++#ifdef ENABLE_DEVICE_MAPPER ++ if (dev->type == PED_DEVICE_DM) ++ free (devpath); ++#endif + return result; + } + +@@ -2438,6 +2486,62 @@ _blkpg_add_partition (PedDisk* disk, const PedPartition *part) + + if (!_blkpg_part_command (disk->dev, &linux_part, + BLKPG_ADD_PARTITION)) { ++ return 0; ++ } ++ ++ return 1; ++} ++ ++static int ++_blkpg_remove_partition (PedDisk* disk, int n) ++{ ++ struct blkpg_partition linux_part; ++ ++ memset (&linux_part, 0, sizeof (linux_part)); ++ linux_part.pno = n; ++ return _blkpg_part_command (disk->dev, &linux_part, ++ 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; ++ } ++ linux_part.length *= disk->dev->sector_size; ++ } ++ 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, +@@ -2454,17 +2558,7 @@ _blkpg_add_partition (PedDisk* disk, const PedPartition *part) + + return 1; + } +- +-static int +-_blkpg_remove_partition (PedDisk* disk, int n) +-{ +- struct blkpg_partition linux_part; +- +- memset (&linux_part, 0, sizeof (linux_part)); +- linux_part.pno = n; +- return _blkpg_part_command (disk->dev, &linux_part, +- BLKPG_DEL_PARTITION); +-} ++#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. +@@ -2586,6 +2680,8 @@ static unsigned int + _device_get_partition_range(PedDevice const* dev) + { + int range; ++ if (dev->type == PED_DEVICE_DM) ++ return MAX_NUM_PARTS; + bool ok = _sysfs_int_entry_from_dev(dev, "ext_range", &range); + + if (!ok) +@@ -2594,264 +2690,78 @@ _device_get_partition_range(PedDevice const* dev) + return range > 1 ? range : 0; + } + +-/* +- * Sync the partition table in two step process: +- * 1. Remove all of the partitions from the kernel's tables, but do not attempt +- * removal of any partition for which the corresponding ioctl call fails. +- * 2. Add all the partitions that we hold in disk, throwing a warning +- * if we cannot because step 1 failed to remove it and it is not being +- * added back with the same start and length. +- * +- * To achieve this two step process we must calculate the minimum number of +- * maximum possible partitions between what linux supports and what the label +- * type supports. EX: +- * +- * number=MIN(max_parts_supported_in_linux,max_parts_supported_in_msdos_tables) +- */ +-static int +-_disk_sync_part_table (PedDisk* disk) +-{ +- PED_ASSERT(disk != NULL); +- PED_ASSERT(disk->dev != NULL); +- int lpn; +- +- unsigned int part_range = _device_get_partition_range(disk->dev); +- +- /* lpn = largest partition number. */ +- if (ped_disk_get_max_supported_partition_count(disk, &lpn)) +- lpn = PED_MIN(lpn, part_range); +- else +- lpn = part_range; +- +- /* Its not possible to support largest_partnum < 0. +- * largest_partnum == 0 would mean does not support partitions. +- * */ +- if (lpn < 1) +- return 0; +- int ret = 0; +- int *ok = calloc (lpn, sizeof *ok); +- if (!ok) +- return 0; +- int *errnums = ped_malloc(sizeof(int) * lpn); +- if (!errnums) +- goto cleanup; +- +- /* Attempt to remove each and every partition, retrying for +- up to max_sleep_seconds upon any failure due to EBUSY. */ +- unsigned int sleep_microseconds = 10000; +- unsigned int max_sleep_seconds = 1; +- unsigned int n_sleep = (max_sleep_seconds +- * 1000000 / sleep_microseconds); +- int i; +- for (i = 0; i < n_sleep; i++) { +- if (i) +- usleep (sleep_microseconds); +- bool busy = false; +- int j; +- for (j = 0; j < lpn; j++) { +- if (!ok[j]) { +- ok[j] = _blkpg_remove_partition (disk, j + 1); +- errnums[j] = errno; +- if (!ok[j] && errnums[j] == EBUSY) +- busy = true; +- } +- } +- if (!busy) +- break; +- } +- +- for (i = 1; i <= lpn; i++) { +- PedPartition *part = ped_disk_get_partition (disk, i); +- if (part) { +- if (!ok[i - 1] && errnums[i - 1] == EBUSY) { +- unsigned long long length; +- unsigned long long start; +- /* get start and length of existing partition */ +- if (!_kernel_get_partition_start_and_length(part, +- &start, &length)) +- goto cleanup; +- if (start == part->geom.start +- && length == part->geom.length) +- ok[i - 1] = 1; +- /* If the new partition is unchanged and the +- existing one was not removed because it was +- in use, then reset the error flag and do not +- try to add it since it is already there. */ +- continue; +- } +- +- /* add the (possibly modified or new) partition */ +- if (!_blkpg_add_partition (disk, part)) { +- ped_exception_throw ( +- PED_EXCEPTION_ERROR, +- PED_EXCEPTION_RETRY_CANCEL, +- _("Failed to add partition %d (%s)"), +- i, strerror (errno)); +- goto cleanup; +- } +- } +- } +- +- 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 (bad_part_list == NULL) +- 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, " +- "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); +- } +- cleanup: +- free (errnums); +- free (ok); +- return ret; +-} +- + #ifdef ENABLE_DEVICE_MAPPER + static int +-_dm_remove_map_name(char *name) ++_dm_remove_partition(PedDisk* disk, int partno) + { +- struct dm_task *task = NULL; + int rc = 0; + uint32_t cookie = 0; ++ char *part_name = _device_get_part_path (disk->dev, partno); + +- task = dm_task_create(DM_DEVICE_REMOVE); ++ int fd = open (part_name, O_RDONLY | O_EXCL); ++ if (fd == -1) { ++ if (errno == ENOENT) ++ errno = ENXIO; /* nothing to remove, device already doesn't exist */ ++ goto err; ++ } ++ close (fd); ++ struct dm_task *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); ++ goto err; ++ dm_task_set_name (task, part_name); ++ if (!dm_task_set_cookie (task, &cookie, 0)) ++ goto err; ++ rc = _dm_task_run_wait (task, cookie); + dm_task_update_nodes(); +-err: + dm_task_destroy(task); +- if (!rc) +- return 1; +- +- return 0; ++err: ++ free (part_name); ++ return rc; + } + +-static int +-_dm_is_part (struct dm_info *this, char *name) ++static bool ++_dm_get_partition_start_and_length(PedPartition const *part, ++ unsigned long long *start, ++ unsigned long long *length) + { + struct dm_task* task = NULL; +- struct dm_info* info = alloca(sizeof *info); +- struct dm_deps* deps = NULL; + int rc = 0; +- unsigned int i; + +- task = dm_task_create(DM_DEVICE_DEPS); +- if (!task) ++ if (!(task = dm_task_create(DM_DEVICE_TABLE))) + return 0; +- +- dm_task_set_name(task, name); +- if (!dm_task_run(task)) ++ char *path = _device_get_part_path (part->disk->dev, part->num); ++ PED_ASSERT(path); ++ /* libdevmapper likes to complain on stderr instead of quietly ++ returning ENOENT or ENXIO, so try to stat first */ ++ struct stat st; ++ if (stat(path, &st)) + goto err; +- +- memset(info, '\0', sizeof *info); +- dm_task_get_info(task, info); +- if (!info->exists) ++ dm_task_set_name(task, path); ++ if (!dm_task_run(task)) + goto err; + +- deps = dm_task_get_deps(task); +- if (!deps) ++ int major, minor; ++ char *params; ++ char *target_type; ++ dm_get_next_target(task, NULL, (uint64_t *)start, (uint64_t *)length, &target_type, ¶ms); ++ if (sscanf (params, "%d:%d %Ld", &major, &minor, start) != 3) + goto err; ++ rc = 1; + +- for (i = 0; i < deps->count; i++) { +- unsigned int ma = major(deps->device[i]), +- mi = minor(deps->device[i]); +- +- if (ma == this->major && mi == this->minor) +- rc = 1; +- } +- ++ /* device-mapper uses 512b units, make sure we return length and start in terms of the device's ++ * sector size. ++ */ ++ *start /= (part->disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT); ++ *length /= (part->disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT); + err: ++ free (path); + dm_task_destroy(task); + return rc; + } + +-static int +-_dm_remove_parts (PedDevice* dev) +-{ +- struct dm_task* task = NULL; +- struct dm_info* info = alloca(sizeof *info); +- struct dm_names* names = NULL; +- unsigned int next = 0; +- int rc; +- LinuxSpecific* arch_specific = LINUX_SPECIFIC (dev); +- +- task = dm_task_create(DM_DEVICE_LIST); +- 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; +- +- memset(info, '\0', sizeof *info); +- dm_task_get_info(task, info); +- if (!info->exists) +- goto err; +- +- names = dm_task_get_names(task); +- if (!names) +- goto err; +- +- rc = 0; +- do { +- names = (void *) ((char *) names + next); +- +- if (_dm_is_part(info, names->name)) +- rc += _dm_remove_map_name(names->name); +- +- next = names->next; +- } while (next); +- +- dm_task_update_nodes(); +- dm_task_destroy(task); +- task = NULL; +- +- if (!rc) +- return 1; +-err: +- if (task) +- dm_task_destroy(task); +- ped_exception_throw (PED_EXCEPTION_WARNING, PED_EXCEPTION_IGNORE, +- _("parted was unable to re-read the partition " +- "table on %s (%s). This means Linux won't know " +- "anything about the modifications you made. "), +- dev->path, strerror (errno)); +- return 0; +-} + + static int +-_dm_add_partition (PedDisk* disk, PedPartition* part) ++_dm_add_partition (PedDisk* disk, const PedPartition* part) + { + char* vol_name = NULL; + const char* dev_name = NULL; +@@ -2908,9 +2818,8 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + "linear", params); + if (!dm_task_set_cookie(task, &cookie, 0)) + goto err; +- if (dm_task_run (task)) { ++ if (_dm_task_run_wait (task, cookie)) { + //printf("0 %ld linear %s\n", part->geom.length, params); +- dm_udev_wait(cookie); + dm_task_update_nodes(); + dm_task_destroy(task); + free(params); +@@ -2918,8 +2827,7 @@ _dm_add_partition (PedDisk* disk, PedPartition* part) + free(vol_name); + return 1; + } else { +- dm_udev_wait(cookie); +- _dm_remove_map_name(vol_name); ++ _dm_remove_partition (disk, part->num); + } + err: + dm_task_update_nodes(); +@@ -2932,30 +2840,259 @@ err: + } + + static int +-_dm_reread_part_table (PedDisk* disk) ++_dm_resize_partition (PedDisk* disk, const PedPartition* part) + { +- int largest_partnum = ped_disk_get_last_partition_num (disk); +- int rc = 1; +- int i; ++ LinuxSpecific* arch_specific = LINUX_SPECIFIC (disk->dev); ++ char* params = NULL; ++ char* vol_name = NULL; ++ const char* dev_name = NULL; ++ uint32_t cookie = 0; ++ int rc = 0; + +- sync(); +- if (!_dm_remove_parts(disk->dev)) +- rc = 0; ++ /* Get map name from devicemapper */ ++ struct dm_task *task = dm_task_create (DM_DEVICE_INFO); ++ if (!task) ++ goto err; + +- for (i = 1; i <= largest_partnum; i++) { +- PedPartition* part; ++ if (!dm_task_set_major_minor (task, arch_specific->major, ++ arch_specific->minor, 0)) ++ goto err; + +- part = ped_disk_get_partition (disk, i); +- if (!part) +- continue; ++ 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; ++ ++ /* device-mapper uses 512b units, not the device's sector size */ ++ if ( ! (params = zasprintf ("%d:%d %lld", arch_specific->major, ++ arch_specific->minor, ++ part->geom.start * (disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT)))) ++ goto err; ++ ++ task = dm_task_create (DM_DEVICE_RELOAD); ++ if (!task) ++ goto err; + +- if (!_dm_add_partition (disk, part)) +- rc = 0; ++ dm_task_set_name (task, vol_name); ++ /* device-mapper uses 512b units, not the device's sector size */ ++ dm_task_add_target (task, 0, part->geom.length * (disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT), ++ "linear", params); ++ /* NOTE: DM_DEVICE_RELOAD doesn't generate udev events, so no cookie is needed (it will freeze). ++ * DM_DEVICE_RESUME does, so get a cookie and synchronize with udev. ++ */ ++ 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_wait (task, cookie)) { ++ rc = 1; ++ } + } ++err: ++ dm_task_update_nodes(); ++ if (task) ++ dm_task_destroy (task); ++ free (params); ++ free (vol_name); + return rc; + } ++ + #endif + ++/* ++ * Sync the partition table in two step process: ++ * 1. Remove all of the partitions from the kernel's tables, but do not attempt ++ * removal of any partition for which the corresponding ioctl call fails. ++ * 2. Add all the partitions that we hold in disk, throwing a warning ++ * if we cannot because step 1 failed to remove it and it is not being ++ * added back with the same start and length. ++ * ++ * To achieve this two step process we must calculate the minimum number of ++ * maximum possible partitions between what linux supports and what the label ++ * type supports. EX: ++ * ++ * number=MIN(max_parts_supported_in_linux,max_parts_supported_in_msdos_tables) ++ */ ++static int ++_disk_sync_part_table (PedDisk* disk) ++{ ++ PED_ASSERT(disk != NULL); ++ PED_ASSERT(disk->dev != NULL); ++ 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, ++ unsigned long long *length); ++ ++ ++#ifdef ENABLE_DEVICE_MAPPER ++ 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 ++#endif ++ { ++ 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; ++ } ++ ++ /* lpn = largest partition number. ++ * for remove pass, use greater of device or label limit */ ++ if (ped_disk_get_max_supported_partition_count(disk, &lpn)) ++ 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. ++ * */ ++ if (lpn < 1) ++ return 0; ++ int ret = 0; ++ int *ok = calloc (lpn, sizeof *ok); ++ if (!ok) ++ return 0; ++ int *errnums = ped_malloc(sizeof(int) * lpn); ++ if (!errnums) ++ goto cleanup; ++ ++ int i; ++ /* remove old partitions first */ ++ for (i = 1; i <= lpn; i++) { ++ PedPartition *part = ped_disk_get_partition (disk, i); ++ if (part) { ++ unsigned long long length; ++ unsigned long long start; ++ /* get start and length of existing partition */ ++ if (get_partition_start_and_length(part, ++ &start, &length) ++ && start == part->geom.start ++ && (length == part->geom.length ++ || (resize_partition && part->num < lpn2))) ++ { ++ /* partition is unchanged, or will be resized so nothing to do */ ++ ok[i - 1] = 1; ++ continue; ++ } ++ } ++ /* Attempt to remove the partition, retrying for ++ up to max_sleep_seconds upon any failure due to EBUSY. */ ++ unsigned int sleep_microseconds = 10000; ++ unsigned int max_sleep_seconds = 1; ++ unsigned int n_sleep = (max_sleep_seconds ++ * 1000000 / sleep_microseconds); ++ do { ++ ok[i - 1] = remove_partition (disk, i); ++ errnums[i - 1] = errno; ++ if (ok[i - 1] || errnums[i - 1] != EBUSY) ++ break; ++ usleep (sleep_microseconds); ++ } while (n_sleep--); ++ if (!ok[i - 1] && errnums[i - 1] == ENXIO) ++ ok[i - 1] = 1; /* it already doesn't exist */ ++ } ++ lpn = lpn2; ++ /* don't actually add partitions for loop */ ++ if (strcmp (disk->type->name, "loop") == 0) ++ lpn = 0; ++ for (i = 1; i <= lpn; i++) { ++ PedPartition *part = ped_disk_get_partition (disk, i); ++ if (!part) ++ continue; ++ unsigned long long length; ++ unsigned long long start; ++ /* get start and length of existing partition */ ++ if (get_partition_start_and_length(part, ++ &start, &length) ++ && 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)) { ++ ok[i - 1] = 0; ++ errnums[i - 1] = errno; ++ } ++ } ++ ++ 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 (bad_part_list == NULL) ++ 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, " ++ "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); ++ } ++ cleanup: ++ free (errnums); ++ free (ok); ++ return ret; ++} ++ + static int + _have_blkpg () + { +@@ -2973,10 +3110,6 @@ _have_blkpg () + static int + linux_disk_commit (PedDisk* disk) + { +-#ifdef ENABLE_DEVICE_MAPPER +- if (disk->dev->type == PED_DEVICE_DM) +- return _dm_reread_part_table (disk); +-#endif + if (disk->dev->type != PED_DEVICE_FILE) { + + /* We now require BLKPG support. If this assertion fails, +-- +2.9.4 + diff --git a/SOURCES/0047-tests-excersise-resize-command.patch b/SOURCES/0047-tests-excersise-resize-command.patch new file mode 100644 index 00000000..c8e2932d --- /dev/null +++ b/SOURCES/0047-tests-excersise-resize-command.patch @@ -0,0 +1,124 @@ +From f1711f8bd420315a01b2df6d4339646c96169558 Mon Sep 17 00:00:00 2001 +From: Petr Uzel +Date: Tue, 27 Sep 2011 09:11:29 +0200 +Subject: [PATCH 47/48] tests: excersise resize command + +a lot of TODOs + +(cherry picked from commit 33fd692cb14045fdc13306cd57cfe2040328daa8) +--- + 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 1cf859c..29fa280 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -42,6 +42,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 +-- +2.9.4 + diff --git a/SOURCES/0048-parted-add-resizepart-command.patch b/SOURCES/0048-parted-add-resizepart-command.patch new file mode 100644 index 00000000..689111a0 --- /dev/null +++ b/SOURCES/0048-parted-add-resizepart-command.patch @@ -0,0 +1,140 @@ +From 109a5a35d8482f43c7d779df3b7d10bf16d5f31b Mon Sep 17 00:00:00 2001 +From: Petr Uzel +Date: Mon, 26 Sep 2011 17:21:01 +0200 +Subject: [PATCH 48/48] 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. + +(cherry picked from commit 21c58e17c473ea8ef31a18d03348eb2381c0f36c) + +Resolves: rhbz#1423357 +--- + NEWS | 1 + + parted/parted.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 77 insertions(+), 1 deletion(-) + +diff --git a/NEWS b/NEWS +index d1a6f58..62d6381 100644 +--- a/NEWS ++++ b/NEWS +@@ -3,6 +3,7 @@ GNU parted NEWS -*- outline -*- + * Noteworthy changes in release 3.1-29 (2017-04-11) [RHEL7.4] + + Parted now recognizes NVMe devices ++ Add resizepart command to resize a partition + + * Noteworthy changes in release 3.1-18 (2014-08-12) [RHEL7.1] + +diff --git a/parted/parted.c b/parted/parted.c +index d4a397b..d64b0b8 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -152,6 +152,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"); +@@ -435,6 +438,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) + { +@@ -1478,7 +1496,7 @@ error: + } + + static int +-do_resize (PedDevice **dev, PedDisk** diskp) ++do_resize (PedDevice **dev) + { + ped_exception_throw ( + PED_EXCEPTION_ERROR, +@@ -1488,6 +1506,63 @@ do_resize (PedDevice **dev, PedDisk** diskp) + } + + static int ++do_resizepart (PedDevice** dev) ++{ ++ PedDisk *disk; ++ PedPartition *part = NULL; ++ PedSector start, end, oldend; ++ PedGeometry *range_end = NULL; ++ PedConstraint* constraint; ++ int rc = 0; ++ ++ 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, ++ 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* disk; +-- +2.9.4 + diff --git a/SOURCES/parted-2.1-libparted-use-dm_udev_wait-698121.patch b/SOURCES/parted-2.1-libparted-use-dm_udev_wait-698121.patch new file mode 100644 index 00000000..e60a7a27 --- /dev/null +++ b/SOURCES/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/SOURCES/parted-3.0-libparted-copy-pmbr_boot-when-duplicating-GPT-disk.patch b/SOURCES/parted-3.0-libparted-copy-pmbr_boot-when-duplicating-GPT-disk.patch new file mode 100644 index 00000000..4183f7e6 --- /dev/null +++ b/SOURCES/parted-3.0-libparted-copy-pmbr_boot-when-duplicating-GPT-disk.patch @@ -0,0 +1,25 @@ +From 43663f1226da0a6284b5f52f6e2f741473c077b6 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Fri, 3 Feb 2012 13:03:27 -0800 +Subject: [PATCH] libparted: copy pmbr_boot when duplicating GPT disk + +* libparted/labels/gpt.c (gpt_duplicate): copy pmbr_boot flag +--- + libparted/labels/gpt.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c +index bad9ed4..0f07250 100644 +--- a/libparted/labels/gpt.c ++++ b/libparted/labels/gpt.c +@@ -562,6 +562,7 @@ gpt_duplicate (const PedDisk *disk) + old_disk_data->data_area.length); + new_disk_data->entry_count = old_disk_data->entry_count; + new_disk_data->uuid = old_disk_data->uuid; ++ new_disk_data->pmbr_boot = old_disk_data->pmbr_boot; + return new_disk; + } + +-- +1.7.6.5 + diff --git a/SOURCES/parted-3.1-avoid-dasd-as-default-file-image-type.patch b/SOURCES/parted-3.1-avoid-dasd-as-default-file-image-type.patch new file mode 100644 index 00000000..f3807925 --- /dev/null +++ b/SOURCES/parted-3.1-avoid-dasd-as-default-file-image-type.patch @@ -0,0 +1,59 @@ +Subject: [PATCH] libparted: Avoid dasd as default disk type while probe + +From: Nageswara R Sastry + +This patch avoids setting 'dasd' as a default disk type for +'disk image file' at the time of probe. + +Signed-off-by: Nageswara R Sastry +--- + include/parted/fdasd.h | 1 + + libparted/labels/fdasd.c | 6 +++++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +--- a/include/parted/fdasd.h ++++ b/include/parted/fdasd.h +@@ -261,6 +261,7 @@ typedef struct fdasd_anchor { + struct fdasd_hd_geometry geo; + unsigned int label_block; + unsigned int FBA_layout; ++ bool is_file; + } fdasd_anchor_t; + + enum offset {lower, upper}; +--- a/libparted/labels/fdasd.c ++++ b/libparted/labels/fdasd.c +@@ -301,6 +301,7 @@ fdasd_initialize_anchor (fdasd_anchor_t + } + anc->hw_cylinders = 0; + anc->formatted_cylinders = 0; ++ anc->is_file = 0; + } + + /* +@@ -892,7 +893,7 @@ fdasd_check_volume (fdasd_anchor_t *anc, + /* Some times LDL formatted disks does not + contain any volume label */ + return 1; +- } else { ++ } else if (! anc->is_file) { + /* didn't find VOL1 volume label */ + anc->formatted_cylinders = anc->hw_cylinders; + anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads +@@ -976,6 +977,7 @@ fdasd_get_geometry (const PedDevice *dev + dasd_info.FBA_layout = 0; + anc->hw_cylinders = ((st.st_size / blksize) / anc->geo.sectors) / + anc->geo.heads; ++ anc->is_file = 1; + } else { + if (ioctl(f, HDIO_GETGEO, &anc->geo) != 0) + fdasd_error(anc, unable_to_ioctl, +@@ -997,6 +999,8 @@ fdasd_get_geometry (const PedDevice *dev + anc->hw_cylinders = characteristics->long_no_cyl; + else + anc->hw_cylinders = characteristics->no_cyl; ++ ++ anc->is_file = 0; + } + + anc->dev_type = dasd_info.dev_type; diff --git a/SOURCES/parted-3.1-libparted-Fix-endian-error-with-FirstUsableLBA.patch b/SOURCES/parted-3.1-libparted-Fix-endian-error-with-FirstUsableLBA.patch new file mode 100644 index 00000000..f9365d29 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-Fix-endian-error-with-FirstUsableLBA.patch @@ -0,0 +1,54 @@ +From 1190dc5b214ce6ba4cbeadbdd599ab3ebb2cbb13 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 8 Jun 2012 14:42:45 -0700 +Subject: [PATCH] libparted: Fix endian error with FirstUsableLBA (#829960) + +On big-endial systems (eg. ppc64) this would cause parted to +crash. + +* NEWS: add new bugfix +* libparted/labels/gpt.c (gpt_get_max_supported_partition_count): + fix endian issues with pth->FirstUsableLBA +--- + NEWS | 3 ++- + libparted/labels/gpt.c | 4 ++-- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/NEWS b/NEWS +index b0a0657..596ab37 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,9 +1,10 @@ + GNU parted NEWS -*- outline -*- + +-* Noteworthy changes in release 3.1-2 (2012-03-21) [Fedora] ++* Noteworthy changes in release 3.1-4 (2012-06-08) [Fedora] + + ** Bug Fixes + ++ libparted: Don't crash on big-endian systems when using GPT + libparted: Treat disks without a PMBR as msdos labeled disks + even if they have GPT partition tables. + +diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c +index ab2145e..6ca33c8 100644 +--- a/libparted/labels/gpt.c ++++ b/libparted/labels/gpt.c +@@ -1787,12 +1787,12 @@ gpt_get_max_supported_partition_count (const PedDisk *disk, int *max_n) + + if (!_header_is_valid (disk, pth, 1)) + { +- pth->FirstUsableLBA = 34; ++ pth->FirstUsableLBA = PED_CPU_TO_LE64 (34); + pth->SizeOfPartitionEntry + = PED_CPU_TO_LE32 (sizeof (GuidPartitionEntry_t)); + } + +- *max_n = (disk->dev->sector_size * (pth->FirstUsableLBA - 2) ++ *max_n = (disk->dev->sector_size * (PED_LE64_TO_CPU (pth->FirstUsableLBA)-2) + / PED_LE32_TO_CPU (pth->SizeOfPartitionEntry)); + pth_free (pth); + return true; +-- +1.7.7.6 + diff --git a/SOURCES/parted-3.1-libparted-Flush-parent-device-on-open-962611.patch b/SOURCES/parted-3.1-libparted-Flush-parent-device-on-open-962611.patch new file mode 100644 index 00000000..b229f9b7 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-Flush-parent-device-on-open-962611.patch @@ -0,0 +1,35 @@ +From dc213bf52d640c0219541afb002f71b49a888c7f Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 4 Sep 2013 11:45:44 -0700 +Subject: [PATCH] libparted: Flush parent device on open (#962611) + +Parted probes for filesystems using geometry offsets into the parent +device, not the partition device itself. This means it may get stale +information if a partition has just been formatted. + +On kernels before 2.6 this will also flush all partition devices. On 2.6 +and newer kernels it will only flush the parent device. + +* libparted/arch/linux.c (linux_open): Always call _flush_cache +--- + libparted/arch/linux.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 2c410a0..4af0d5c 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -1579,9 +1579,7 @@ retry: + dev->read_only = 0; + } + +- /* With kernels < 2.6 flush cache for cache coherence issues */ +- if (!_have_kern26()) +- _flush_cache (dev); ++ _flush_cache (dev); + + return 1; + } +-- +1.8.3.1 + diff --git a/SOURCES/parted-3.1-libparted-Recognize-btrfs-filesystem.patch b/SOURCES/parted-3.1-libparted-Recognize-btrfs-filesystem.patch new file mode 100644 index 00000000..50f5e2f5 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-Recognize-btrfs-filesystem.patch @@ -0,0 +1,184 @@ +From 242217de0268d6036a6e6a3f196abd79bfcb98b8 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 27 Aug 2013 17:27:07 -0700 +Subject: [PATCH 1/2] libparted: Recognize btrfs filesystem + +Add support for showing 'btrfs' in the 'file system' column. Also +allows the used to enter btrfs as the fs type. It doesn't really do +anything -- just sets the partition type to linux. + +* NEWS (Changes in behavior): Mention it. +* doc/parted.texti: Document btrfs fs. +* (libparted/fs/Makefile.am): Add btrfs.c +* (libparted/fs/btrfs/btrfs.c): Probe for btrfs +* (libparted/libparted.c): Register btrfs +--- + NEWS | 3 ++ + doc/parted.texi | 1 + + libparted/fs/Makefile.am | 1 + + libparted/fs/btrfs/btrfs.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++ + libparted/libparted.c | 4 +++ + 5 files changed, 87 insertions(+) + create mode 100644 libparted/fs/btrfs/btrfs.c + +diff --git a/NEWS b/NEWS +index 596ab37..e2d01ed 100644 +--- a/NEWS ++++ b/NEWS +@@ -84,6 +84,9 @@ GNU parted NEWS -*- outline -*- + + ** Changes in behavior + ++ Added support for recognizing btrfs filesystem. This simply displays ++ btrfs in the 'file system' column of the parted output. ++ + Floppy drives are no longer scanned on linux: they cannot be partitioned + anyhow, and some users have a misconfigured BIOS that claims to have a + floppy when they don't, and scanning gets hung up. +diff --git a/doc/parted.texi b/doc/parted.texi +index 6561d0e..2b1ce64 100644 +--- a/doc/parted.texi ++++ b/doc/parted.texi +@@ -575,6 +575,7 @@ partition table. + @item NTFS + @item reiserfs + @item ufs ++@item btrfs + @end itemize + + Example: +diff --git a/libparted/fs/Makefile.am b/libparted/fs/Makefile.am +index 8d48ea1..a8fb313 100644 +--- a/libparted/fs/Makefile.am ++++ b/libparted/fs/Makefile.am +@@ -25,6 +25,7 @@ libfs_la_SOURCES = \ + amiga/asfs.c \ + amiga/asfs.h \ + amiga/a-interface.c \ ++ btrfs/btrfs.c \ + ext2/ext2.h \ + ext2/ext2_fs.h \ + ext2/interface.c \ +diff --git a/libparted/fs/btrfs/btrfs.c b/libparted/fs/btrfs/btrfs.c +new file mode 100644 +index 0000000..e5abed6 +--- /dev/null ++++ b/libparted/fs/btrfs/btrfs.c +@@ -0,0 +1,78 @@ ++/* ++ libparted - a library for manipulating disk partitions ++ Copyright (C) 2013 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 . ++*/ ++ ++#include ++ ++#include ++#include ++ ++/* Located 64k inside the partition (start of the first btrfs superblock) */ ++#define BTRFS_MAGIC 0x4D5F53665248425FULL /* ascii _BHRfS_M, no null */ ++#define BTRFS_CSUM_SIZE 32 ++#define BTRFS_FSID_SIZE 16 ++ ++ ++static PedGeometry* ++btrfs_probe (PedGeometry* geom) ++{ ++ union { ++ struct { ++ /* Just enough of the btrfs_super_block to get the magic */ ++ uint8_t csum[BTRFS_CSUM_SIZE]; ++ uint8_t fsid[BTRFS_FSID_SIZE]; ++ uint64_t bytenr; ++ uint64_t flags; ++ uint64_t magic; ++ } sb; ++ int8_t sector[8192]; ++ } buf; ++ PedSector offset = (64*1024)/geom->dev->sector_size; ++ ++ if (geom->length < offset+1) ++ return 0; ++ if (!ped_geometry_read (geom, &buf, offset, 1)) ++ return 0; ++ ++ if (PED_LE64_TO_CPU(buf.sb.magic) == BTRFS_MAGIC) { ++ return ped_geometry_new (geom->dev, geom->start, geom->length); ++ } ++ return NULL; ++} ++ ++static PedFileSystemOps btrfs_ops = { ++ probe: btrfs_probe, ++}; ++ ++static PedFileSystemType btrfs_type = { ++ next: NULL, ++ ops: &btrfs_ops, ++ name: "btrfs", ++ block_sizes: ((int[2]){512, 0}) ++}; ++ ++void ++ped_file_system_btrfs_init () ++{ ++ ped_file_system_type_register (&btrfs_type); ++} ++ ++void ++ped_file_system_btrfs_done () ++{ ++ ped_file_system_type_unregister (&btrfs_type); ++} +diff --git a/libparted/libparted.c b/libparted/libparted.c +index a6d86f0..3c3b337 100644 +--- a/libparted/libparted.c ++++ b/libparted/libparted.c +@@ -109,6 +109,7 @@ extern void ped_file_system_hfs_init (void); + extern void ped_file_system_fat_init (void); + extern void ped_file_system_ext2_init (void); + extern void ped_file_system_nilfs2_init (void); ++extern void ped_file_system_btrfs_init (void); + + static void + init_file_system_types () +@@ -124,6 +125,7 @@ init_file_system_types () + ped_file_system_fat_init (); + ped_file_system_ext2_init (); + ped_file_system_nilfs2_init (); ++ ped_file_system_btrfs_init (); + } + + extern void ped_disk_aix_done (); +@@ -186,6 +188,7 @@ extern void ped_file_system_reiserfs_done (void); + extern void ped_file_system_ufs_done (void); + extern void ped_file_system_xfs_done (void); + extern void ped_file_system_amiga_done (void); ++extern void ped_file_system_btrfs_done (void); + + static void + done_file_system_types () +@@ -201,6 +204,7 @@ done_file_system_types () + ped_file_system_ufs_done (); + ped_file_system_xfs_done (); + ped_file_system_amiga_done (); ++ ped_file_system_btrfs_done (); + } + + static void _done() __attribute__ ((destructor)); +-- +1.8.3.1 + diff --git a/SOURCES/parted-3.1-libparted-add-support-for-EAV-DASD-partitions.patch b/SOURCES/parted-3.1-libparted-add-support-for-EAV-DASD-partitions.patch new file mode 100644 index 00000000..81f73a85 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-add-support-for-EAV-DASD-partitions.patch @@ -0,0 +1,1058 @@ +Subject: [PATCH] libparted: add support for EAV DASD partitions + +From: Nageswara R Sastry + +Extended Address Volume (EAV) DASDs are ECKD DASDs with more than +65520 cylinders. This patch adds support for recognizing and +modifying partitions on EAV DASDs to Parted. The changes are +based on the EAV support added to version 1.8.1 [1] of the +s390-tools package. + +[1] http://www.ibm.com/developerworks/linux/linux390/s390-tools-1.8.1.html + +Signed-off-by: Nageswara R Sastry +Signed-off-by: Peter Oberparleiter + +--- + include/parted/fdasd.h | 89 ++++++++++++++++-- + include/parted/vtoc.h | 58 ++++++++++-- + libparted/labels/dasd.c | 1 + libparted/labels/fdasd.c | 226 ++++++++++++++++++++++++++++++++--------------- + libparted/labels/vtoc.c | 173 ++++++++++++++++++++++++++++++----- + 5 files changed, 435 insertions(+), 112 deletions(-) + +--- a/include/parted/fdasd.h ++++ b/include/parted/fdasd.h +@@ -74,6 +74,80 @@ typedef struct dasd_information_t { + char configuration_data[256]; /* from read_configuration_data */ + } dasd_information_t; + ++struct dasd_eckd_characteristics { ++ unsigned short cu_type; ++ struct { ++ unsigned char support:2; ++ unsigned char async:1; ++ unsigned char reserved:1; ++ unsigned char cache_info:1; ++ unsigned char model:3; ++ } __attribute__ ((packed)) cu_model; ++ unsigned short dev_type; ++ unsigned char dev_model; ++ struct { ++ unsigned char mult_burst:1; ++ unsigned char RT_in_LR:1; ++ unsigned char reserved1:1; ++ unsigned char RD_IN_LR:1; ++ unsigned char reserved2:4; ++ unsigned char reserved3:8; ++ unsigned char defect_wr:1; ++ unsigned char XRC_supported:1; ++ unsigned char reserved4:1; ++ unsigned char striping:1; ++ unsigned char reserved5:4; ++ unsigned char cfw:1; ++ unsigned char reserved6:2; ++ unsigned char cache:1; ++ unsigned char dual_copy:1; ++ unsigned char dfw:1; ++ unsigned char reset_alleg:1; ++ unsigned char sense_down:1; ++ } __attribute__ ((packed)) facilities; ++ unsigned char dev_class; ++ unsigned char unit_type; ++ unsigned short no_cyl; ++ unsigned short trk_per_cyl; ++ unsigned char sec_per_trk; ++ unsigned char byte_per_track[3]; ++ unsigned short home_bytes; ++ unsigned char formula; ++ union { ++ struct { ++ unsigned char f1; ++ unsigned short f2; ++ unsigned short f3; ++ } __attribute__ ((packed)) f_0x01; ++ struct { ++ unsigned char f1; ++ unsigned char f2; ++ unsigned char f3; ++ unsigned char f4; ++ unsigned char f5; ++ } __attribute__ ((packed)) f_0x02; ++ } __attribute__ ((packed)) factors; ++ unsigned short first_alt_trk; ++ unsigned short no_alt_trk; ++ unsigned short first_dia_trk; ++ unsigned short no_dia_trk; ++ unsigned short first_sup_trk; ++ unsigned short no_sup_trk; ++ unsigned char MDR_ID; ++ unsigned char OBR_ID; ++ unsigned char director; ++ unsigned char rd_trk_set; ++ unsigned short max_rec_zero; ++ unsigned char reserved1; ++ unsigned char RWANY_in_LR; ++ unsigned char factor6; ++ unsigned char factor7; ++ unsigned char factor8; ++ unsigned char reserved2[3]; ++ unsigned char reserved3[6]; ++ unsigned int long_no_cyl; ++} __attribute__ ((packed)); ++ + /* + * struct format_data_t + * represents all data necessary to format a dasd +@@ -116,18 +190,6 @@ typedef struct format_data_t { + #define BLKRRPART _IO(0x12,95) + /* get block device sector size */ + #define BLKSSZGET _IO(0x12,104) +- +-/***************************************************************************** +- * SECTION: Definition from hdreq.h * +- *****************************************************************************/ +- +-struct fdasd_hd_geometry { +- unsigned char heads; +- unsigned char sectors; +- unsigned short cylinders; +- unsigned long start; +-}; +- + /* get device geometry */ + #define HDIO_GETGEO 0x0301 + +@@ -189,10 +251,13 @@ typedef struct fdasd_anchor { + format4_label_t *f4; + format5_label_t *f5; + format7_label_t *f7; ++ format9_label_t *f9; /* template for all f9 labels */ + partition_info_t *first; + partition_info_t *last; + volume_label_t *vlabel; + config_data_t confdata[USABLE_PARTITIONS]; ++ u_int32_t hw_cylinders; ++ u_int32_t formatted_cylinders; + struct fdasd_hd_geometry geo; + unsigned int label_block; + unsigned int FBA_layout; +--- a/include/parted/vtoc.h ++++ b/include/parted/vtoc.h +@@ -42,7 +42,18 @@ + + #define VOLSER_LENGTH 6 + #define BIG_DISK_SIZE 0x10000 ++#define LV_COMPAT_CYL 0xFFFE + ++/***************************************************************************** ++ * SECTION: Definition from hdreq.h * ++ *****************************************************************************/ ++ ++struct fdasd_hd_geometry { ++ unsigned char heads; ++ unsigned char sectors; ++ unsigned short cylinders; ++ unsigned long start; ++}; + + typedef struct ttr ttr_t; + typedef struct cchhb cchhb_t; +@@ -59,6 +70,7 @@ typedef struct ds5ext ds5ext_t + typedef struct format5_label format5_label_t; + typedef struct ds7ext ds7ext_t; + typedef struct format7_label format7_label_t; ++typedef struct format9_label format9_label_t; + + struct __attribute__ ((packed)) ttr { + u_int16_t tt; +@@ -169,6 +181,10 @@ struct __attribute__ ((packed)) dev_cons + u_int8_t DS4DEVDB; /* number of directory blocks per track */ + }; + ++/* ++ * format 1 and format 8 label have the same layout so we use the following ++ * structure for both. ++ */ + struct __attribute__ ((packed)) format1_label { + char DS1DSNAM[44]; /* data set name */ + u_int8_t DS1FMTID; /* format identifier */ +@@ -229,7 +245,11 @@ struct __attribute__ ((packed)) format4_ + char res2[10]; /* reserved */ + u_int8_t DS4EFLVL; /* extended free-space management level */ + cchhb_t DS4EFPTR; /* pointer to extended free-space info */ +- char res3[9]; /* reserved */ ++ char res3; /* reserved */ ++ u_int32_t DS4DCYL; /* number of logical cyls */ ++ char res4[2]; /* reserved */ ++ u_int8_t DS4DEVF2; /* device flags */ ++ char res5; /* reserved */ + }; + + struct __attribute__ ((packed)) ds5ext { +@@ -261,12 +281,28 @@ struct __attribute__ ((packed)) format7_ + cchhb_t DS7PTRDS; /* pointer to next FMT7 DSCB */ + }; + ++struct __attribute__ ((packed)) format9_label { ++ u_int8_t DS9KEYID; /* key code for format 9 labels (0x09) */ ++ u_int8_t DS9SUBTY; /* subtype (0x01) */ ++ u_int8_t DS9NUMF9; /* number of F9 datasets */ ++ u_int8_t res1[41]; /* reserved */ ++ u_int8_t DS9FMTID; /* format identifier */ ++ u_int8_t res2[95]; /* reserved */ ++}; ++ + char *vtoc_ebcdic_enc (char const *source, char *target, int l); + char *vtoc_ebcdic_dec (char const *source, char *target, int l); + void vtoc_set_extent (extent_t *ext, u_int8_t typeind, u_int8_t seqno, + cchh_t *lower, cchh_t *upper); +-void vtoc_set_cchh (cchh_t *addr, u_int16_t cc, u_int16_t hh); +-void vtoc_set_cchhb (cchhb_t *addr, u_int16_t cc, u_int16_t hh, u_int8_t b); ++void vtoc_set_cchh (cchh_t *addr, u_int32_t cc, u_int16_t hh); ++u_int32_t vtoc_get_cyl_from_cchh(cchh_t *addr); ++u_int16_t vtoc_get_head_from_cchh(cchh_t *addr); ++void vtoc_set_cchhb (cchhb_t *addr, u_int32_t cc, u_int16_t hh, u_int8_t b); ++u_int32_t vtoc_get_cyl_from_cchhb(cchhb_t *addr); ++u_int16_t vtoc_get_head_from_cchhb(cchhb_t *addr); ++u_int64_t cchhb2blk(cchhb_t *p, struct fdasd_hd_geometry *geo); ++u_int64_t cchh2blk (cchh_t *p, struct fdasd_hd_geometry *geo); ++u_int32_t cchh2trk (cchh_t *p, struct fdasd_hd_geometry *geo); + void vtoc_set_date (labeldate_t *d, u_int8_t year, u_int16_t day); + + void vtoc_volume_label_init (volume_label_t *vlabel); +@@ -295,14 +331,16 @@ void vtoc_write_label (int fd, unsigned + format1_label_t const *f1, + format4_label_t const *f4, + format5_label_t const *f5, +- format7_label_t const *f7); ++ format7_label_t const *f7, ++ format9_label_t const *f9); + + void vtoc_init_format1_label (char *volid, unsigned int blksize, + extent_t *part_extent, format1_label_t *f1); + + void vtoc_init_format4_label (format4_label_t *f4lbl, + unsigned int usable_partitions, +- unsigned int cylinders, ++ unsigned int compat_cylinders, ++ unsigned int real_cylinders, + unsigned int tracks, + unsigned int blocks, + unsigned int blksize, +@@ -329,8 +367,16 @@ void vtoc_update_format7_label_add (form + void vtoc_update_format7_label_del (format7_label_t *f7, int verbose, + u_int32_t a, u_int32_t b); + ++void vtoc_init_format8_label (char *volid, unsigned int blksize, ++ extent_t *part_extent, format1_label_t *f1); ++ ++void vtoc_update_format8_label (cchhb_t *associated_f9, format1_label_t *f8); ++ ++void vtoc_init_format9_label (format9_label_t *f9); ++ + void vtoc_set_freespace(format4_label_t *f4, format5_label_t *f5, + format7_label_t *f7, char ch, int verbose, +- u_int32_t start, u_int32_t stop, int cyl, int trk); ++ u_int32_t start, u_int32_t stop, u_int32_t cyl, ++ u_int32_t trk); + + #endif /* VTOC_H */ +--- a/libparted/labels/dasd.c ++++ b/libparted/labels/dasd.c +@@ -631,6 +631,7 @@ dasd_write (const PedDisk* disk) + /* initialize the anchor */ + fdasd_initialize_anchor(&anchor); + fdasd_get_geometry(disk->dev, &anchor, arch_specific->fd); ++ fdasd_check_volume(&anchor, arch_specific->fd); + memcpy(anchor.vlabel, &disk_specific->vlabel, sizeof(volume_label_t)); + anchor.vlabel_changed++; + +--- a/libparted/labels/fdasd.c ++++ b/libparted/labels/fdasd.c +@@ -59,6 +59,48 @@ setpos (fdasd_anchor_t *anc, int dsn, in + anc->partno[dsn] = pos; + } + ++static u_int32_t ++get_usable_cylinders (fdasd_anchor_t *anc) ++{ ++ u_int32_t cyl; ++ ++ /* large volume */ ++ if (anc->f4->DS4DEVCT.DS4DSCYL == LV_COMPAT_CYL && ++ anc->f4->DS4DCYL > anc->f4->DS4DEVCT.DS4DSCYL) ++ return anc->f4->DS4DCYL; ++ /* normal volume */ ++ if (anc->f4->DS4DEVCT.DS4DEVFG & ALTERNATE_CYLINDERS_USED) ++ cyl = anc->f4->DS4DEVCT.DS4DSCYL - ++ (u_int16_t) anc->f4->DS4DEVAC; ++ else ++ cyl = anc->f4->DS4DEVCT.DS4DSCYL; ++ return cyl; ++} ++ ++static void ++get_addr_of_highest_f1_f8_label (fdasd_anchor_t *anc, cchhb_t *addr) ++{ ++ ++ u_int8_t record; ++ /* We have to count the follwing labels: ++ * one format 4 ++ * one format 5 ++ * format 7 only if we have moren then BIG_DISK_SIZE tracks ++ * one for each format 1 or format 8 label == one for each partition ++ * one for each format 9 label before the last format 8 ++ * We assume that all partitions use format 8 labels when ++ * anc->formatted_cylinders > LV_COMPAT_CYL ++ * Note: Record zero is special, so block 0 on our disk is record 1! ++ */ ++ ++ record = anc->used_partitions + 2; ++ if (anc->big_disk) ++ record++; ++ if (anc->formatted_cylinders > LV_COMPAT_CYL) ++ record += anc->used_partitions - 1; ++ vtoc_set_cchhb(addr, VTOC_START_CC, VTOC_START_HH, record); ++} ++ + void + fdasd_cleanup (fdasd_anchor_t *anchor) + { +@@ -72,6 +114,7 @@ fdasd_cleanup (fdasd_anchor_t *anchor) + free(anchor->f4); + free(anchor->f5); + free(anchor->f7); ++ free(anchor->f9); + free(anchor->vlabel); + + p = anchor->first; +@@ -82,6 +125,7 @@ fdasd_cleanup (fdasd_anchor_t *anchor) + if (p == NULL) + return; + q = p->next; ++ free(p->f1); + free(p); + p = q; + } +@@ -154,17 +198,6 @@ fdasd_error (fdasd_anchor_t *anc, enum f + } + + /* +- * converts cyl-cyl-head-head-blk to blk +- */ +-static unsigned long +-cchhb2blk (cchhb_t *p, struct fdasd_hd_geometry *geo) +-{ +- PDEBUG +- return (unsigned long) (p->cc * geo->heads * geo->sectors +- + p->hh * geo->sectors + p->b); +-} +- +-/* + * initializes the anchor structure and allocates some + * memory for the labels + */ +@@ -216,9 +249,16 @@ fdasd_initialize_anchor (fdasd_anchor_t + if (anc->f7 == NULL) + fdasd_error(anc, malloc_failed, "FMT7 DSCB."); + ++ /* template for all format 9 labels */ ++ anc->f9 = malloc(sizeof(format9_label_t)); ++ if (anc->f9 == NULL) ++ fdasd_error(anc, malloc_failed, "FMT9 DSCB."); ++ + bzero(anc->f4, sizeof(format4_label_t)); + bzero(anc->f5, sizeof(format5_label_t)); + bzero(anc->f7, sizeof(format7_label_t)); ++ bzero(anc->f9, sizeof(format9_label_t)); ++ vtoc_init_format9_label(anc->f9); + + v = malloc(sizeof(volume_label_t)); + if (v == NULL) +@@ -259,6 +299,8 @@ fdasd_initialize_anchor (fdasd_anchor_t + + q = p; + } ++ anc->hw_cylinders = 0; ++ anc->formatted_cylinders = 0; + } + + /* +@@ -269,44 +311,46 @@ fdasd_write_vtoc_labels (fdasd_anchor_t + { + PDEBUG + partition_info_t *p; +- unsigned long b; ++ unsigned long b, maxblk; + char dsno[6], s1[7], s2[45], *c1, *c2, *ch; + int i = 0, k = 0; ++ cchhb_t f9addr; ++ format1_label_t emptyf1; + + b = (cchhb2blk (&anc->vlabel->vtoc, &anc->geo) - 1) * anc->blksize; + if (b <= 0) + fdasd_error (anc, vlabel_corrupted, ""); ++ maxblk = b + anc->blksize * 9; /* f4+f5+f7+3*f8+3*f9 */ + + /* write FMT4 DSCB */ +- vtoc_write_label (fd, b, NULL, anc->f4, NULL, NULL); ++ vtoc_write_label (fd, b, NULL, anc->f4, NULL, NULL, NULL); ++ b += anc->blksize; + + /* write FMT5 DSCB */ ++ vtoc_write_label (fd, b, NULL, NULL, anc->f5, NULL, NULL); + b += anc->blksize; +- vtoc_write_label (fd, b, NULL, NULL, anc->f5, NULL); + + /* write FMT7 DSCB */ + if (anc->big_disk) { ++ vtoc_write_label (fd, b, NULL, NULL, NULL, anc->f7, NULL); + b += anc->blksize; +- vtoc_write_label (fd, b, NULL, NULL, NULL, anc->f7); + } + +- /* loop over all FMT1 DSCBs */ +- p = anc->first; +- for (i = 0; i < USABLE_PARTITIONS; i++) { +- b += anc->blksize; ++ /* loop over all partitions (format 1 or format 8 DCB) */ ++ for (p = anc->first; p != NULL; p = p->next) { + + if (p->used != 0x01) { +- vtoc_write_label (fd, b, p->f1, NULL, NULL, NULL); + continue; + } + ++ i++; + strncpy (p->f1->DS1DSSN, anc->vlabel->volid, 6); + + ch = p->f1->DS1DSNAM; + vtoc_ebcdic_dec (ch, ch, 44); + c1 = ch + 7; + +- if (getdsn (anc, i) > -1) { ++ if (getdsn (anc, i-1) > -1) { + /* re-use the existing data set name */ + c2 = strchr (c1, '.'); + if (c2 != NULL) +@@ -325,11 +369,7 @@ fdasd_write_vtoc_labels (fdasd_anchor_t + while (getpos (anc, k) > -1) + k++; + +- setpos (anc, k, i); +- +- strncpy (s2, ch, 44); +- s2[44] = 0; +- vtoc_ebcdic_dec (s2, s2, 44); ++ setpos (anc, k, i-1); + + strncpy (ch, "LINUX.V " " ", 44); + +@@ -366,8 +406,32 @@ fdasd_write_vtoc_labels (fdasd_anchor_t + + vtoc_ebcdic_enc (ch, ch, 44); + +- vtoc_write_label (fd, b, p->f1, NULL, NULL, NULL); +- p = p->next; ++ if (p->f1->DS1FMTID == 0xf8 ) { ++ /* Now as we know where which label will be written, we ++ * can add the address of the format 9 label to the ++ * format 8 label. The f9 record will be written to the ++ * block after the current blk. Remember: records are of ++ * by one, so we have to add 2 and not just one. ++ */ ++ vtoc_set_cchhb(&f9addr, VTOC_START_CC, VTOC_START_HH, ++ ((b / anc->blksize) % anc->geo.sectors) + 2); ++ vtoc_update_format8_label(&f9addr, p->f1); ++ vtoc_write_label(fd, b, p->f1, NULL, NULL, NULL, NULL); ++ b += anc->blksize; ++ vtoc_write_label(fd, b, NULL, NULL, NULL, NULL, ++ anc->f9); ++ b += anc->blksize; ++ } else { ++ vtoc_write_label(fd, b, p->f1, NULL, NULL, NULL, NULL); ++ b += anc->blksize; ++ } ++ } ++ ++ /* write empty labels to the rest of the blocks */ ++ bzero(&emptyf1, sizeof(emptyf1)); ++ while (b < maxblk) { ++ vtoc_write_label(fd, b, &emptyf1, NULL, NULL, NULL, NULL); ++ b += anc->blksize; + } + } + +@@ -394,20 +458,25 @@ int + fdasd_prepare_labels (fdasd_anchor_t *anc, int fd) + { + PDEBUG +- partition_info_t *p = anc->first; ++ partition_info_t *p; + char dsno[6], s1[7], s2[45], *c1, *c2, *ch; + int i = 0, k = 0; + +- /* loop over all FMT1 DSCBs */ +- p = anc->first; +- for (i = 0; i < USABLE_PARTITIONS; i++) { ++ /* loop over all partitions (format 1 or format 8 DCB) */ ++ for (p = anc->first; p != NULL; p = p->next) { ++ ++ if (p->used != 0x01) { ++ continue; ++ } ++ ++ i++; + strncpy (p->f1->DS1DSSN, anc->vlabel->volid, 6); + + ch = p->f1->DS1DSNAM; + vtoc_ebcdic_dec (ch, ch, 44); + c1 = ch + 7; + +- if (getdsn (anc, i) > -1) { ++ if (getdsn (anc, i-1) > -1) { + /* re-use the existing data set name */ + c2 = strchr (c1, '.'); + if (c2 != NULL) +@@ -426,11 +495,7 @@ fdasd_prepare_labels (fdasd_anchor_t *an + while (getpos (anc, k) > -1) + k++; + +- setpos (anc, k, i); +- +- strncpy (s2, ch, 44); +- s2[44] = 0; +- vtoc_ebcdic_dec (s2, s2, 44); ++ setpos (anc, k, i-1); + + strncpy (ch, "LINUX.V " " ", 44); + +@@ -466,7 +531,6 @@ fdasd_prepare_labels (fdasd_anchor_t *an + } + + vtoc_ebcdic_enc (ch, ch, 44); +- p = p->next; + } + + return 1; +@@ -482,6 +546,7 @@ fdasd_recreate_vtoc (fdasd_anchor_t *anc + vtoc_init_format4_label(anc->f4, + USABLE_PARTITIONS, + anc->geo.cylinders, ++ anc->formatted_cylinders, + anc->geo.heads, + anc->geo.sectors, + anc->blksize, +@@ -492,8 +557,8 @@ fdasd_recreate_vtoc (fdasd_anchor_t *anc + vtoc_set_freespace(anc->f4, anc->f5, anc->f7, + '+', anc->verbose, + FIRST_USABLE_TRK, +- anc->geo.cylinders * anc->geo.heads - 1, +- anc->geo.cylinders, anc->geo.heads); ++ anc->formatted_cylinders * anc->geo.heads - 1, ++ anc->formatted_cylinders, anc->geo.heads); + + for (i = 0; i < USABLE_PARTITIONS; i++) { + bzero(p->f1, sizeof(format1_label_t)); +@@ -507,7 +572,8 @@ fdasd_recreate_vtoc (fdasd_anchor_t *anc + } + + anc->used_partitions = 0; +- anc->fspace_trk = anc->geo.cylinders * anc->geo.heads - FIRST_USABLE_TRK; ++ anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads - ++ FIRST_USABLE_TRK; + + for (i=0; ifirst; +- unsigned int h = anc->geo.heads; +- unsigned long max = anc->geo.cylinders * h - 1; ++ unsigned long max = anc->formatted_cylinders * anc->geo.heads - 1; + int i; + char *ch; + + anc->used_partitions = anc->geo.sectors - 2 - anc->f4->DS4DSREC; + + for (i = 1; i <= USABLE_PARTITIONS; i++) { +- if (p->f1->DS1FMTID != 0xf1) { ++ if (p->f1->DS1FMTID != 0xf1 && ++ p->f1->DS1FMTID != 0xf8) { + if (i == 1) + /* there is no partition at all */ + anc->fspace_trk = max - FIRST_USABLE_TRK + 1; +@@ -546,8 +612,8 @@ fdasd_update_partition_info (fdasd_ancho + + /* this is a valid format 1 label */ + p->used = 0x01; +- p->start_trk = p->f1->DS1EXT1.llimit.cc * h + p->f1->DS1EXT1.llimit.hh; +- p->end_trk = p->f1->DS1EXT1.ulimit.cc * h + p->f1->DS1EXT1.ulimit.hh; ++ p->start_trk = cchh2trk(&p->f1->DS1EXT1.llimit, &anc->geo); ++ p->end_trk = cchh2trk(&p->f1->DS1EXT1.ulimit, &anc->geo); + p->len_trk = p->end_trk - p->start_trk + 1; + + if (i == 1) { +@@ -618,14 +684,22 @@ fdasd_process_valid_vtoc (fdasd_anchor_t + format1_label_t q; + char s[5], *ch; + ++ if (anc->f4->DS4DEVCT.DS4DSCYL == LV_COMPAT_CYL && ++ anc->f4->DS4DCYL > anc->f4->DS4DEVCT.DS4DSCYL) ++ anc->formatted_cylinders = anc->f4->DS4DCYL; ++ else ++ anc->formatted_cylinders = anc->f4->DS4DEVCT.DS4DSCYL; ++ anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads - ++ FIRST_USABLE_TRK; + b += anc->blksize; + +- for (i = 1; i <= anc->geo.sectors; i++) { ++ for (i = 1; i < anc->geo.sectors; i++) { + bzero (&q, f1size); + vtoc_read_label (fd, b, &q, NULL, NULL, NULL); + + switch (q.DS1FMTID) { + case 0xf1: ++ case 0xf8: + if (p == NULL) + break; + memcpy (p->f1, &q, f1size); +@@ -669,6 +743,12 @@ fdasd_process_valid_vtoc (fdasd_anchor_t + memcpy (anc->f7, &q, f1size); + f7_counter++; + break; ++ case 0xf9: ++ /* each format 8 lable has an associated ++ * format 9 lable, but they are of no further ++ * use to us. ++ */ ++ break; + } + + b += anc->blksize; +@@ -718,7 +798,7 @@ fdasd_check_volume (fdasd_anchor_t *anc, + { + PDEBUG + volume_label_t *v = anc->vlabel; +- unsigned long b = -1; ++ long long b = -1; + char str[LINE_LENGTH]; + + memset(v, 0, sizeof(volume_label_t)); +@@ -784,6 +864,7 @@ fdasd_get_geometry (const PedDevice *dev + PDEBUG + int blksize = 0; + dasd_information_t dasd_info; ++ struct dasd_eckd_characteristics *characteristics; + + /* We can't get geometry from a regular file, + so simulate something usable, for the sake of testing. */ +@@ -803,6 +884,8 @@ fdasd_get_geometry (const PedDevice *dev + dasd_info.devno = 513; + dasd_info.label_block = 2; + dasd_info.FBA_layout = 0; ++ anc->hw_cylinders = ((st.st_size / blksize) / anc->geo.sectors) / ++ anc->geo.heads; + } else { + if (ioctl(f, HDIO_GETGEO, &anc->geo) != 0) + fdasd_error(anc, unable_to_ioctl, +@@ -816,13 +899,20 @@ fdasd_get_geometry (const PedDevice *dev + if (ioctl(f, BIODASDINFO, &dasd_info) != 0) + fdasd_error(anc, unable_to_ioctl, + _("Could not retrieve disk information.")); ++ ++ characteristics = (struct dasd_eckd_characteristics *) ++ &dasd_info.characteristics; ++ if (characteristics->no_cyl == LV_COMPAT_CYL && ++ characteristics->long_no_cyl) ++ anc->hw_cylinders = characteristics->long_no_cyl; ++ else ++ anc->hw_cylinders = characteristics->no_cyl; + } + + anc->dev_type = dasd_info.dev_type; + anc->blksize = blksize; + anc->label_pos = dasd_info.label_block * blksize; + anc->devno = dasd_info.devno; +- anc->fspace_trk = anc->geo.cylinders * anc->geo.heads - FIRST_USABLE_TRK; + anc->label_block = dasd_info.label_block; + anc->FBA_layout = dasd_info.FBA_layout; + } +@@ -850,20 +940,17 @@ fdasd_get_partition_data (fdasd_anchor_t + unsigned int *stop_ptr) + { + PDEBUG +- unsigned int limit, cc, hh; ++ unsigned int limit; ++ u_int32_t cc, c; ++ u_int16_t hh, h; + cchh_t llimit, ulimit; + partition_info_t *q; + u_int8_t b1, b2; +- u_int16_t c, h; + unsigned int start = *start_ptr, stop = *stop_ptr; + int i; + char *ch; + +- if (anc->f4->DS4DEVCT.DS4DEVFG & ALTERNATE_CYLINDERS_USED) +- c = anc->f4->DS4DEVCT.DS4DSCYL - (u_int16_t) anc->f4->DS4DEVAC; +- else +- c = anc->f4->DS4DEVCT.DS4DSCYL; +- ++ c = get_usable_cylinders(anc); + h = anc->f4->DS4DEVCT.DS4DSTRK; + limit = (h * c - 1); + +@@ -1019,7 +1106,6 @@ fdasd_add_partition (fdasd_anchor_t *anc + cchhb_t hf1; + partition_info_t *p; + extent_t ext; +- int i; + + PDEBUG; + +@@ -1032,8 +1118,14 @@ fdasd_add_partition (fdasd_anchor_t *anc + if (fdasd_get_partition_data(anc, &ext, p, &start, &stop) != 0) + return 0; + +- PDEBUG; +- vtoc_init_format1_label(anc->vlabel->volid, anc->blksize, &ext, p->f1); ++ if (anc->formatted_cylinders > LV_COMPAT_CYL) { ++ vtoc_init_format8_label(anc->vlabel->volid, anc->blksize, &ext, ++ p->f1); ++ } else { ++ PDEBUG; ++ vtoc_init_format1_label(anc->vlabel->volid, anc->blksize, &ext, ++ p->f1); ++ } + + PDEBUG; + fdasd_enqueue_new_partition(anc); +@@ -1041,23 +1133,17 @@ fdasd_add_partition (fdasd_anchor_t *anc + PDEBUG; + anc->used_partitions += 1; + +- i = anc->used_partitions + 2; +- if (anc->big_disk) +- i++; +- PDEBUG; +- +- vtoc_set_cchhb(&hf1, VTOC_START_CC, VTOC_START_HH, i); +- ++ get_addr_of_highest_f1_f8_label(anc, &hf1); + vtoc_update_format4_label(anc->f4, &hf1, anc->f4->DS4DSREC - 1); + + PDEBUG; + +- start = ext.llimit.cc * anc->geo.heads + ext.llimit.hh; +- stop = ext.ulimit.cc * anc->geo.heads + ext.ulimit.hh; ++ start = cchh2trk(&ext.llimit, &anc->geo); ++ stop = cchh2trk(&ext.ulimit, &anc->geo); + + PDEBUG; + vtoc_set_freespace(anc->f4, anc->f5, anc->f7, '-', anc->verbose, +- start, stop, anc->geo.cylinders, anc->geo.heads); ++ start, stop, anc->formatted_cylinders, anc->geo.heads); + + anc->vtoc_changed++; + +--- a/libparted/labels/vtoc.c ++++ b/libparted/labels/vtoc.c +@@ -218,11 +218,32 @@ vtoc_set_extent (extent_t *ext, u_int8_t + } + + void +-vtoc_set_cchh (cchh_t *addr, u_int16_t cc, u_int16_t hh) ++vtoc_set_cchh (cchh_t *addr, u_int32_t cc, u_int16_t hh) + { + PDEBUG +- addr->cc = cc; +- addr->hh = hh; ++ addr->cc = (u_int16_t) cc; ++ addr->hh = cc >> 16; ++ addr->hh <<= 4; ++ addr->hh |= hh; ++} ++ ++u_int32_t ++vtoc_get_cyl_from_cchh (cchh_t *addr) ++{ ++ u_int32_t cyl; ++ ++ /*decode cylinder for large volumes */ ++ cyl = addr->hh & 0xFFF0; ++ cyl <<= 12; ++ cyl |= addr->cc; ++ return cyl; ++} ++ ++u_int16_t ++vtoc_get_head_from_cchh (cchh_t *addr) ++{ ++ /* decode heads for large volumes */ ++ return addr->hh & 0x000F; + } + + static void +@@ -234,12 +255,63 @@ vtoc_set_ttr (ttr_t *addr, u_int16_t tt, + } + + void +-vtoc_set_cchhb (cchhb_t *addr, u_int16_t cc, u_int16_t hh, u_int8_t b) ++vtoc_set_cchhb (cchhb_t *addr, u_int32_t cc, u_int16_t hh, u_int8_t b) + { + PDEBUG +- addr->cc = cc; +- addr->hh = hh; +- addr->b = b; ++ addr->cc = (u_int16_t) cc; ++ addr->hh = cc >> 16; ++ addr->hh <<= 4; ++ addr->hh |= hh; ++ addr->b = b; ++} ++ ++u_int32_t ++vtoc_get_cyl_from_cchhb(cchhb_t *addr) ++{ ++ u_int32_t cyl; ++ ++ /* decode cylinder for large volumes */ ++ cyl = addr->hh & 0xFFF0; ++ cyl <<= 12; ++ cyl |= addr->cc; ++ return cyl; ++} ++ ++u_int16_t ++vtoc_get_head_from_cchhb(cchhb_t *addr) ++{ ++ /* decode heads for large volumes */ ++ return addr->hh & 0x000F; ++} ++ ++/* ++ * some functions to convert cyl-cyl-head-head addresses to ++ * block or track numbers ++ * Note: Record zero is special, so first block on a track is ++ * in record 1! ++ */ ++u_int64_t ++cchhb2blk (cchhb_t *p, struct fdasd_hd_geometry *geo) ++{ ++ return (u_int64_t) vtoc_get_cyl_from_cchhb(p) * ++ geo->heads * geo->sectors + ++ vtoc_get_head_from_cchhb(p) * geo->sectors + ++ p->b; ++} ++ ++u_int64_t ++cchh2blk (cchh_t *p, struct fdasd_hd_geometry *geo) ++{ ++ return (u_int64_t) vtoc_get_cyl_from_cchh(p) * ++ geo->heads * geo->sectors + ++ vtoc_get_head_from_cchh(p) * geo->sectors; ++} ++ ++u_int32_t ++cchh2trk (cchh_t *p, struct fdasd_hd_geometry *geo) ++{ ++ return vtoc_get_cyl_from_cchh(p) * geo->heads + ++ vtoc_get_head_from_cchh(p); + } + + void +@@ -506,7 +578,8 @@ vtoc_write_label (int f, unsigned long p + format1_label_t const *f1, + format4_label_t const *f4, + format5_label_t const *f5, +- format7_label_t const *f7) ++ format7_label_t const *f7, ++ format9_label_t const *f9) + { + PDEBUG + int t; +@@ -542,6 +615,17 @@ vtoc_write_label (int f, unsigned long p + vtoc_error(unable_to_write, "vtoc_write_label", + _("Could not write VTOC FMT7 DSCB.")); + } ++ ++ if (f9 != NULL) ++ { ++ t = sizeof(format9_label_t); ++ if (write(f, f9, t) != t) ++ { ++ close(f); ++ vtoc_error(unable_to_write, "vtoc_write_label", ++ _("Could not write VTOC FMT9 DSCB.")); ++ } ++ } + } + + /* +@@ -549,7 +633,8 @@ vtoc_write_label (int f, unsigned long p + */ + void + vtoc_init_format4_label (format4_label_t *f4, unsigned int usable_partitions, +- unsigned int cylinders, unsigned int tracks, ++ unsigned int compat_cylinders, ++ unsigned int real_cylinders, unsigned int tracks, + unsigned int blocks, unsigned int blksize, + u_int16_t dev_type) + { +@@ -574,7 +659,7 @@ vtoc_init_format4_label (format4_label_t + f4->DS4DEVAC = 0x00; + + /* -- begin f4->DS4DEVCT -- */ +- f4->DS4DEVCT.DS4DSCYL = cylinders; ++ f4->DS4DEVCT.DS4DSCYL = compat_cylinders; + f4->DS4DEVCT.DS4DSTRK = tracks; + + switch (dev_type) { +@@ -613,7 +698,11 @@ vtoc_init_format4_label (format4_label_t + bzero(f4->res2, sizeof(f4->res2)); + f4->DS4EFLVL = 0x00; + bzero(&f4->DS4EFPTR, sizeof(f4->DS4EFPTR)); +- bzero(f4->res3, sizeof(f4->res3)); ++ bzero(&f4->res3, sizeof(f4->res3)); ++ f4->DS4DCYL = real_cylinders; ++ bzero(f4->res4, sizeof(f4->res4)); ++ f4->DS4DEVF2 = 0x40; /* allow format 8 and 9 labels */ ++ bzero(&f4->res5, sizeof(f4->res5)); + } + + /* +@@ -647,11 +736,12 @@ vtoc_init_format7_label (format7_label_t + } + + /* +- * initializes a format1 label ++ * helper function that initializes a most parts of a ++ * format1 or format 8 label, all but the field DS1FMTID + */ + void +-vtoc_init_format1_label (char *volid, unsigned int blksize, +- extent_t *part_extent, format1_label_t *f1) ++vtoc_init_format_1_8_label (char *volid, unsigned int blksize, ++ extent_t *part_extent, format1_label_t *f1) + { + PDEBUG + struct tm * creatime; +@@ -666,7 +756,6 @@ vtoc_init_format1_label (char *volid, un + sprintf(str, "PART .NEW "); + vtoc_ebcdic_enc(str, str, 44); + strncpy(f1->DS1DSNAM, str, 44); +- f1->DS1FMTID = 0xf1; + strncpy(f1->DS1DSSN, " ", 6); + f1->DS1VOLSQ = 0x0001; + +@@ -704,6 +793,37 @@ vtoc_init_format1_label (char *volid, un + vtoc_set_cchhb(&f1->DS1PTRDS, 0x0000, 0x0000, 0x00); + } + ++void ++vtoc_init_format1_label (char *volid, unsigned int blksize, ++ extent_t *part_extent, format1_label_t *f1) ++{ ++ vtoc_init_format_1_8_label(volid, blksize, part_extent, f1); ++ f1->DS1FMTID = 0xf1; ++} ++ ++void ++vtoc_init_format8_label (char *volid, unsigned int blksize, ++ extent_t *part_extent, format1_label_t *f8) ++{ ++ vtoc_init_format_1_8_label(volid, blksize, part_extent, f8); ++ f8->DS1FMTID = 0xf8; ++} ++ ++void ++vtoc_update_format8_label (cchhb_t *associated_f9, format1_label_t *f8) ++{ ++ memcpy(&f8->DS1PTRDS, associated_f9, sizeof(*associated_f9)); ++} ++ ++void ++vtoc_init_format9_label (format9_label_t *f9) ++{ ++ f9->DS9KEYID = 0x09; ++ f9->DS9SUBTY = 0x01; ++ f9->DS9NUMF9 = 1; ++ f9->DS9FMTID = 0xf9; ++} ++ + /* + * do some updates to the VTOC format4 label + */ +@@ -1060,7 +1180,7 @@ vtoc_update_format7_label_add (format7_l + if ((ext->a + ext->b) == 0x00000000) + continue; + +- if ((ext->b + 1) == tmp->a) { ++ if (ext->b == tmp->a) { + /* this extent precedes the new one */ + ext->b = tmp->b; + bzero(tmp, sizeof(ds7ext_t)); +@@ -1074,7 +1194,7 @@ vtoc_update_format7_label_add (format7_l + continue; + } + +- if (ext->a == (tmp->b + 1)) { ++ if (ext->a == tmp->b) { + /* this extent succeeds the new one */ + ext->a = tmp->a; + bzero(tmp, sizeof(ds7ext_t)); +@@ -1119,7 +1239,7 @@ vtoc_update_format7_label_del (format7_l + + if ((a == ext->a) && (b < ext->b)) { + /* left-bounded in free space gap */ +- ext->a = b + 1; ++ ext->a = b; + + if (verbose) + puts ("FMT7 add extent: left-bounded"); +@@ -1130,7 +1250,7 @@ vtoc_update_format7_label_del (format7_l + + if ((a > ext->a) && (b == ext->b)) { + /* right-bounded in free space gap */ +- ext->b = a - 1; ++ ext->b = a; + + if (verbose) + puts ("FMT7 add extent: right-bounded"); +@@ -1141,8 +1261,8 @@ vtoc_update_format7_label_del (format7_l + + if ((a > ext->a) && (b < ext->b)) { + /* partition devides free space into 2 pieces */ +- vtoc_update_format7_label_add(f7, verbose, b+1, ext->b); +- ext->b = a - 1; ++ vtoc_update_format7_label_add(f7, verbose, b, ext->b); ++ ext->b = a; + + if (verbose) + puts ("FMT7 add extent: 2 pieces"); +@@ -1172,14 +1292,19 @@ vtoc_update_format7_label_del (format7_l + void + vtoc_set_freespace(format4_label_t *f4, format5_label_t *f5, + format7_label_t *f7, char ch, int verbose, +- u_int32_t start, u_int32_t stop, int cyl, int trk) ++ u_int32_t start, u_int32_t stop, u_int32_t cyl, ++ u_int32_t trk) + { + PDEBUG + if ((cyl * trk) > BIG_DISK_SIZE) { + if (ch == '+') +- vtoc_update_format7_label_add(f7, verbose, start, stop); ++ vtoc_update_format7_label_add(f7, verbose, start, ++ /* ds7ext RTA + 1 */ ++ stop + 1); + else if (ch == '-') +- vtoc_update_format7_label_del(f7, verbose, start, stop); ++ vtoc_update_format7_label_del(f7, verbose, start, ++ /* ds7ext RTA + 1 */ ++ stop + 1); + else + puts ("BUG: syntax error in vtoc_set_freespace call"); + diff --git a/SOURCES/parted-3.1-libparted-add-support-for-implicit-FBA-DASD-partitions.patch b/SOURCES/parted-3.1-libparted-add-support-for-implicit-FBA-DASD-partitions.patch new file mode 100644 index 00000000..95d25512 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-add-support-for-implicit-FBA-DASD-partitions.patch @@ -0,0 +1,187 @@ +Subject: [PATCH] libparted: add support for implicit FBA DASD partitions + +From: Nageswara R Sastry + +Fixed Block Access (FBA) DASDs are mainframe-specific disk devices +which are layed out as a sequence of 512-byte sectors. In contrast +to ECKD DASDs, these disks do not require formatting and resemble +the LBA layout of non-mainframe disks. Despite this resemblance, +the Linux kernel applies special handling during partition detection +for FBA DASDs, resulting in a single, immutable partition being +reported. + +While actual FBA DASD hardware is no longer available, the z/VM +hypervisor can simulate FBA DASD disks, backed by either ECKD or +SCSI devices. + +This patch adds support for recognizing FBA DASD partitions +to parted. + +Signed-off-by: Nageswara R Sastry +Signed-off-by: Peter Oberparleiter + +--- + include/parted/fdasd.h | 2 + + libparted/labels/dasd.c | 63 ++++++++++++++++++++++++++++++++++++++++------- + libparted/labels/fdasd.c | 5 +++ + 3 files changed, 61 insertions(+), 9 deletions(-) + +--- a/include/parted/fdasd.h ++++ b/include/parted/fdasd.h +@@ -194,6 +194,8 @@ typedef struct fdasd_anchor { + volume_label_t *vlabel; + config_data_t confdata[USABLE_PARTITIONS]; + struct fdasd_hd_geometry geo; ++ unsigned int label_block; ++ unsigned int FBA_layout; + } fdasd_anchor_t; + + enum offset {lower, upper}; +--- a/libparted/labels/dasd.c ++++ b/libparted/labels/dasd.c +@@ -71,6 +71,7 @@ typedef struct { + + typedef struct { + unsigned int format_type; ++ unsigned int label_block; + volume_label_t vlabel; + } DasdDiskSpecific; + +@@ -151,6 +152,7 @@ dasd_alloc (const PedDevice* dev) + + /* CDL format, newer */ + disk_specific->format_type = 2; ++ disk_specific->label_block = 2; + + /* Setup volume label (for fresh disks) */ + snprintf(volser, sizeof(volser), "0X%04X", arch_specific->devno); +@@ -226,7 +228,9 @@ dasd_probe (const PedDevice *dev) + + fdasd_check_api_version(&anchor, arch_specific->fd); + +- if (fdasd_check_volume(&anchor, arch_specific->fd)) ++ /* Labels are required on CDL formatted DASDs. */ ++ if (fdasd_check_volume(&anchor, arch_specific->fd) && ++ anchor.FBA_layout == 0) + goto error_cleanup; + + fdasd_cleanup(&anchor); +@@ -273,17 +277,53 @@ dasd_read (PedDisk* disk) + fdasd_initialize_anchor(&anchor); + + fdasd_get_geometry(disk->dev, &anchor, arch_specific->fd); ++ disk_specific->label_block = anchor.label_block; ++ ++ if ((anchor.geo.cylinders * anchor.geo.heads) > BIG_DISK_SIZE) ++ anchor.big_disk++; + + /* check dasd for labels and vtoc */ +- if (fdasd_check_volume(&anchor, arch_specific->fd)) +- goto error_close_dev; ++ if (fdasd_check_volume(&anchor, arch_specific->fd)) { ++ DasdPartitionData* dasd_data; ++ ++ /* Kernel partitioning code will report 'implicit' partitions ++ * for non-CDL format DASDs even when there is no ++ * label/VTOC. */ ++ if (anchor.FBA_layout == 0) ++ goto error_close_dev; ++ ++ disk_specific->format_type = 1; ++ ++ /* Register implicit partition */ ++ ped_disk_delete_all (disk); ++ ++ start = (PedSector) arch_specific->real_sector_size / ++ (PedSector) disk->dev->sector_size * ++ (PedSector) (anchor.label_block + 1); ++ end = disk->dev->length - 1; ++ part = ped_partition_new (disk, PED_PARTITION_NORMAL, NULL, ++ start, end); ++ if (!part) ++ goto error_close_dev; ++ ++ part->num = 1; ++ part->fs_type = ped_file_system_probe (&part->geom); ++ dasd_data = part->disk_specific; ++ dasd_data->raid = 0; ++ dasd_data->lvm = 0; ++ dasd_data->type = 0; ++ ++ if (!ped_disk_add_partition (disk, part, NULL)) ++ goto error_close_dev; ++ ++ fdasd_cleanup(&anchor); ++ ++ return 1; ++ } + + /* Save volume label (read by fdasd_check_volume) for writing */ + memcpy(&disk_specific->vlabel, anchor.vlabel, sizeof(volume_label_t)); + +- if ((anchor.geo.cylinders * anchor.geo.heads) > BIG_DISK_SIZE) +- anchor.big_disk++; +- + ped_disk_delete_all (disk); + + bool is_ldl = strncmp(anchor.vlabel->volkey, +@@ -348,7 +388,7 @@ dasd_read (PedDisk* disk) + / (long long) disk->dev->sector_size + * (long long) (cms_ptr->block_count - 1) - 1; + +- part = ped_partition_new (disk, PED_PARTITION_PROTECTED, NULL, start, end); ++ part = ped_partition_new (disk, PED_PARTITION_NORMAL, NULL, start, end); + if (!part) + goto error_close_dev; + +@@ -923,7 +963,12 @@ dasd_alloc_metadata (PedDisk* disk) + the start of the first partition */ + if (disk_specific->format_type == 1) { + part = ped_disk_get_partition(disk, 1); +- vtoc_end = part->geom.start - 1; ++ if (part) ++ vtoc_end = part->geom.start - 1; ++ else ++ vtoc_end = (PedSector) arch_specific->real_sector_size / ++ (PedSector) disk->dev->sector_size * ++ (PedSector) disk_specific->label_block; + } + else { + if (disk->dev->type == PED_DEVICE_FILE) +@@ -943,7 +988,7 @@ dasd_alloc_metadata (PedDisk* disk) + goto error; + } + +- if (disk_specific->format_type == 1) { ++ if (disk_specific->format_type == 1 && part) { + /* + For LDL or CMS there may be trailing metadata as well. + For example: the last block of a CMS reserved file, +--- a/libparted/labels/fdasd.c ++++ b/libparted/labels/fdasd.c +@@ -721,6 +721,7 @@ fdasd_check_volume (fdasd_anchor_t *anc, + unsigned long b = -1; + char str[LINE_LENGTH]; + ++ memset(v, 0, sizeof(volume_label_t)); + vtoc_read_volume_label (fd, anc->label_pos, v); + + if (strncmp(v->vollbl, vtoc_ebcdic_enc ("VOL1", str, 4), 4) == 0) { +@@ -800,6 +801,8 @@ fdasd_get_geometry (const PedDevice *dev + dasd_info.dev_type = 13200; + dasd_info.label_block = 2; + dasd_info.devno = 513; ++ dasd_info.label_block = 2; ++ dasd_info.FBA_layout = 0; + } else { + if (ioctl(f, HDIO_GETGEO, &anc->geo) != 0) + fdasd_error(anc, unable_to_ioctl, +@@ -820,6 +823,8 @@ fdasd_get_geometry (const PedDevice *dev + anc->label_pos = dasd_info.label_block * blksize; + anc->devno = dasd_info.devno; + anc->fspace_trk = anc->geo.cylinders * anc->geo.heads - FIRST_USABLE_TRK; ++ anc->label_block = dasd_info.label_block; ++ anc->FBA_layout = dasd_info.FBA_layout; + } + + /* diff --git a/SOURCES/parted-3.1-libparted-check-PMBR-before-GPT-partition-table-8052.patch b/SOURCES/parted-3.1-libparted-check-PMBR-before-GPT-partition-table-8052.patch new file mode 100644 index 00000000..11687b30 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-check-PMBR-before-GPT-partition-table-8052.patch @@ -0,0 +1,91 @@ +From 9343e79fee796a142a4bd12674aa3fdb56526eb6 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 20 Mar 2012 16:08:25 -0700 +Subject: [PATCH 1/2] libparted: check PMBR before GPT partition table + (#805272) + +The UEFI spec requires that a valid GPT disk label have a PMBR +partition. This moves the PMBR check to before the GPT check, +exiting gpt_probe with a 0 if the PMBR is not valid. + +The previous behavior would cause problems in the following situation: + 1. format a disk as GPT + 2. re-format it as MSDOS using tools that don't understand GPT + +Subsequent operations with parted would then complain about the invlid +PMBR, but would not allow the disk to be used as a msdos disk. This +change causes parted to tread the disk as a msdos disk. + +* libparted/labels/gpt.c (gpt_probe): Move _pmbr_is_valid test +--- + libparted/labels/gpt.c | 44 +++++++++++++------------------------------- + 1 files changed, 13 insertions(+), 31 deletions(-) + +diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c +index 84bdc12..e57b3a2 100644 +--- a/libparted/labels/gpt.c ++++ b/libparted/labels/gpt.c +@@ -465,6 +465,17 @@ gpt_probe (const PedDevice *dev) + if (dev->length <= 1) + return 0; + ++ void *label; ++ if (!ptt_read_sector (dev, 0, &label)) ++ return 0; ++ ++ if (!_pmbr_is_valid ((const LegacyMBR_t *) label)) ++ { ++ free (label); ++ return 0; ++ } ++ free (label); ++ + void *pth_raw = ped_malloc (pth_get_size (dev)); + if (ped_device_read (dev, pth_raw, 1, GPT_HEADER_SECTORS) + || ped_device_read (dev, pth_raw, dev->length - 1, GPT_HEADER_SECTORS)) +@@ -472,40 +483,11 @@ gpt_probe (const PedDevice *dev) + gpt = pth_new_from_raw (dev, pth_raw); + if (gpt->Signature == PED_CPU_TO_LE64 (GPT_HEADER_SIGNATURE)) + gpt_sig_found = 1; ++ pth_free (gpt); + } +- + free (pth_raw); + +- pth_free (gpt); +- +- if (!gpt_sig_found) +- return 0; +- +- void *label; +- if (!ptt_read_sector (dev, 0, &label)) +- return 0; +- +- int ok = 1; +- if (!_pmbr_is_valid ((const LegacyMBR_t *) label)) +- { +- int ex_status = ped_exception_throw +- (PED_EXCEPTION_WARNING, +- PED_EXCEPTION_YES_NO, +- _("%s contains GPT signatures, indicating that it has " +- "a GPT table. However, it does not have a valid " +- "fake msdos partition table, as it should. Perhaps " +- "it was corrupted -- possibly by a program that " +- "doesn't understand GPT partition tables. Or " +- "perhaps you deleted the GPT table, and are now " +- "using an msdos partition table. Is this a GPT " +- "partition table?"), +- dev->path); +- if (ex_status == PED_EXCEPTION_NO) +- ok = 0; +- } +- +- free (label); +- return ok; ++ return gpt_sig_found; + } + + static PedDisk * +-- +1.7.7.6 + diff --git a/SOURCES/parted-3.1-libparted-don-t-canonicalize-dev-md-paths.patch b/SOURCES/parted-3.1-libparted-don-t-canonicalize-dev-md-paths.patch new file mode 100644 index 00000000..2390881c --- /dev/null +++ b/SOURCES/parted-3.1-libparted-don-t-canonicalize-dev-md-paths.patch @@ -0,0 +1,37 @@ +From c17f0c2e68960969789427eca20ddab1b8e4fcc6 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Thu, 1 Nov 2012 16:22:42 -0700 +Subject: [PATCH] libparted: don't canonicalize /dev/md/ paths (#872361) + +This is the same issue we have with /dev/mapper/ paths that was fixed in +commit c1eb485b9fd8919e18f192d678bc52b0488e6ee0. When libparted +is used to setup the device the symlink should be used to reference it, +not the backing device name which could change. + +* libparted/device.c (ped_device_get): Don't canonicalize names + that start with "/dev/md/". +--- + libparted/device.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/libparted/device.c b/libparted/device.c +index 738b320..cdcc117 100644 +--- a/libparted/device.c ++++ b/libparted/device.c +@@ -152,8 +152,11 @@ ped_device_get (const char* path) + char* normal_path = NULL; + + PED_ASSERT (path != NULL); +- /* Don't canonicalize /dev/mapper paths, see tests/symlink.c */ +- if (strncmp (path, "/dev/mapper/", 12)) ++ /* Don't canonicalize /dev/mapper or /dev/md/ paths, see ++ tests/symlink.c ++ */ ++ if (strncmp (path, "/dev/mapper/", 12) && ++ strncmp (path, "/dev/md/", 8)) + normal_path = canonicalize_file_name (path); + if (!normal_path) + /* Well, maybe it is just that the file does not exist. +-- +1.7.11.7 + diff --git a/SOURCES/parted-3.1-libparted-mklabel-eav.patch b/SOURCES/parted-3.1-libparted-mklabel-eav.patch new file mode 100644 index 00000000..a8bc2280 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-mklabel-eav.patch @@ -0,0 +1,151 @@ +Subject: [PATCH] libparted: mklabel to support EAV DASD + +From: Nageswara R Sastry + +Extended Address Volume (EAV) DASDs are ECKD DASDs with more than +65520 cylinders. This patch adds support for mklabel to properly +handle unformatted EAV DASDs. + +Signed-off-by: Nageswara R Sastry +--- + include/parted/fdasd.h | 1 + libparted/labels/fdasd.c | 92 +++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 90 insertions(+), 3 deletions(-) + +--- a/include/parted/fdasd.h ++++ b/include/parted/fdasd.h +@@ -288,7 +288,6 @@ void fdasd_get_geometry (const PedDevice + void fdasd_check_api_version (fdasd_anchor_t *anc, int fd); + int fdasd_check_volume (fdasd_anchor_t *anc, int fd); + int fdasd_write_labels (fdasd_anchor_t *anc, int fd); +-int fdasd_invalid_vtoc_pointer(fdasd_anchor_t *anc); + void fdasd_recreate_vtoc(fdasd_anchor_t *anc); + partition_info_t * fdasd_add_partition (fdasd_anchor_t *anc, + unsigned int start, unsigned int stop); +--- a/libparted/labels/fdasd.c ++++ b/libparted/labels/fdasd.c +@@ -581,6 +581,22 @@ fdasd_recreate_vtoc (fdasd_anchor_t *anc + anc->vtoc_changed++; + } + ++ /* ++ * initialize the VOL1 volume label ++ */ ++static void ++fdasd_init_volume_label(fdasd_anchor_t *anc, int fd) ++{ ++ volume_label_t *vlabel = anc->vlabel; ++ ++ vtoc_volume_label_init(vlabel); ++ vtoc_volume_label_set_key(vlabel, "VOL1"); ++ vtoc_volume_label_set_label(vlabel, "VOL1"); ++ ++ vtoc_set_cchhb(&vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01); ++} ++ ++ + /* + * sets some important partition data + * (like used, start_trk, end_trk, len_trk) +@@ -769,6 +785,52 @@ fdasd_process_valid_vtoc (fdasd_anchor_t + fdasd_update_partition_info (anc); + } + ++static void ++fdasd_invalid_vtoc_pointer(fdasd_anchor_t *anc) ++{ ++ PDEBUG ++ anc->formatted_cylinders = anc->hw_cylinders; ++ anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads ++ - FIRST_USABLE_TRK; ++ vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS, ++ anc->geo.cylinders, anc->formatted_cylinders, ++ anc->geo.heads, anc->geo.sectors, ++ anc->blksize, anc->dev_type); ++ ++ vtoc_init_format5_label(anc->f5); ++ vtoc_init_format7_label(anc->f7); ++ ++ vtoc_set_freespace(anc->f4, anc->f5, anc->f7, '+', anc->verbose, ++ FIRST_USABLE_TRK, ++ anc->formatted_cylinders * anc->geo.heads - 1, ++ anc->formatted_cylinders, anc->geo.heads); ++ ++ vtoc_set_cchhb(&anc->vlabel->vtoc, VTOC_START_CC, VTOC_START_HH, 0x01); ++} ++ ++/* ++ * we have a invalid FMT4 DSCB and therefore we will re-create the VTOC ++ */ ++static void ++fdasd_process_invalid_vtoc(fdasd_anchor_t *anc) ++{ ++ anc->formatted_cylinders = anc->hw_cylinders; ++ anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads ++ - FIRST_USABLE_TRK; ++ vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS, ++ anc->geo.cylinders, anc->formatted_cylinders, ++ anc->geo.heads, anc->geo.sectors, ++ anc->blksize, anc->dev_type); ++ ++ vtoc_init_format5_label(anc->f5); ++ vtoc_init_format7_label(anc->f7); ++ vtoc_set_freespace(anc->f4, anc->f5, anc->f7, '+', anc->verbose, ++ FIRST_USABLE_TRK, ++ anc->formatted_cylinders * anc->geo.heads - 1, ++ anc->formatted_cylinders, anc->geo.heads); ++} ++ ++ + static int + fdasd_valid_vtoc_pointer(fdasd_anchor_t *anc, unsigned long b, int fd) + { +@@ -781,6 +843,8 @@ fdasd_valid_vtoc_pointer(fdasd_anchor_t + if (anc->f4->DS4IDFMT == 0xf4) { + fdasd_process_valid_vtoc (anc, b, fd); + return 0; ++ } else { ++ fdasd_process_invalid_vtoc(anc); + } + if (strncmp(anc->vlabel->volkey, vtoc_ebcdic_enc("LNX1",str,4),4) == 0 || + strncmp(anc->vlabel->volkey, vtoc_ebcdic_enc("CMS1",str,4),4) == 0) +@@ -817,13 +881,37 @@ fdasd_check_volume (fdasd_anchor_t *anc, + else + return 0; + } else { +- return 1; ++ fdasd_invalid_vtoc_pointer(anc); + } + } else if (strncmp (v->volkey, vtoc_ebcdic_enc ("LNX1", str, 4), 4) == 0 || + strncmp (v->volkey, vtoc_ebcdic_enc ("CMS1", str, 4), 4) == 0) { + return 0; ++ } else if (anc->FBA_layout == 1) { ++ /* Some times LDL formatted disks does not ++ contain any volume label */ ++ return 1; ++ } else { ++ /* didn't find VOL1 volume label */ ++ anc->formatted_cylinders = anc->hw_cylinders; ++ anc->fspace_trk = anc->formatted_cylinders * anc->geo.heads ++ - FIRST_USABLE_TRK; ++ ++ fdasd_init_volume_label(anc, fd); ++ ++ vtoc_init_format4_label(anc->f4, USABLE_PARTITIONS, ++ anc->geo.cylinders, anc->formatted_cylinders, ++ anc->geo.heads, anc->geo.sectors, ++ anc->blksize, anc->dev_type); ++ ++ vtoc_init_format5_label(anc->f5); ++ vtoc_init_format7_label(anc->f7); ++ ++ vtoc_set_freespace(anc->f4, anc->f5, anc->f7, '+', ++ anc->verbose, FIRST_USABLE_TRK, ++ anc->formatted_cylinders * anc->geo.heads - 1, ++ anc->formatted_cylinders, anc->geo.heads); ++ return 0; + } +- + return 1; + } + diff --git a/SOURCES/parted-3.1-libparted-mklabel-edev.patch b/SOURCES/parted-3.1-libparted-mklabel-edev.patch new file mode 100644 index 00000000..c2f869c4 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-mklabel-edev.patch @@ -0,0 +1,48 @@ +Subject: [PATCH] libparted: mklabel to support EDEV DASD + +From: Nageswara R Sastry + +Fixed Block Access (FBA) DASDs are mainframe-specific disk devices +which are layed out as a sequence of 512-byte sectors. This patch adds +support for mklabel to properly handle FBA devices. + +Signed-off-by: Nageswara R Sastry +--- + libparted/labels/fdasd.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +--- a/libparted/labels/fdasd.c ++++ b/libparted/labels/fdasd.c +@@ -869,19 +869,21 @@ fdasd_check_volume (fdasd_anchor_t *anc, + vtoc_read_volume_label (fd, anc->label_pos, v); + + if (strncmp(v->vollbl, vtoc_ebcdic_enc ("VOL1", str, 4), 4) == 0) { +- /* found VOL1 volume label */ +- b = (cchhb2blk (&v->vtoc, &anc->geo) - 1) * anc->blksize; ++ if (anc->FBA_layout != 1 ) { ++ /* found VOL1 volume label */ ++ b = (cchhb2blk (&v->vtoc, &anc->geo) - 1) * anc->blksize; + +- if (b > 0) { +- int rc; +- rc = fdasd_valid_vtoc_pointer (anc, b, fd); ++ if (b > 0) { ++ int rc; ++ rc = fdasd_valid_vtoc_pointer (anc, b, fd); + +- if (rc < 0) +- return 1; +- else +- return 0; +- } else { +- fdasd_invalid_vtoc_pointer(anc); ++ if (rc < 0) ++ return 1; ++ else ++ return 0; ++ } else { ++ fdasd_invalid_vtoc_pointer(anc); ++ } + } + } else if (strncmp (v->volkey, vtoc_ebcdic_enc ("LNX1", str, 4), 4) == 0 || + strncmp (v->volkey, vtoc_ebcdic_enc ("CMS1", str, 4), 4) == 0) { diff --git a/SOURCES/parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch b/SOURCES/parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch new file mode 100644 index 00000000..d33a2727 --- /dev/null +++ b/SOURCES/parted-3.1-libparted-preserve-the-uuid-on-dm-partitions.patch @@ -0,0 +1,71 @@ +From e2b9f9051c8d9905b15af0f7fa79c85502370b25 Mon Sep 17 00:00:00 2001 +From: Brian C. Lane +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 file changed, 11 insertions(+) + +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 37ddb5f..2c410a0 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 ("part%d-%s", part->num, dev_uuid))) ++ 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.11.4 + diff --git a/SOURCES/parted-3.1-libparted-reallocate-buf-after-_disk_analyse_block_s.patch b/SOURCES/parted-3.1-libparted-reallocate-buf-after-_disk_analyse_block_s.patch new file mode 100644 index 00000000..48f66bcc --- /dev/null +++ b/SOURCES/parted-3.1-libparted-reallocate-buf-after-_disk_analyse_block_s.patch @@ -0,0 +1,36 @@ +From 4ee2a7d03f6720c5f97eef93c4df4b9c52e79b5e Mon Sep 17 00:00:00 2001 +From: Brian C. Lane +Date: Tue, 4 Sep 2012 15:56:47 -0700 +Subject: [PATCH] libparted: reallocate buf after _disk_analyse_block_size + call + +The call to _disk_analyse_block_size may change the +disk->dev->sector_size, if this happens buf may be too small for +subsequent reads. + +libparted/labels/mac.c (mac_read): reallocate buf +--- + libparted/labels/mac.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/libparted/labels/mac.c b/libparted/labels/mac.c +index 1f59a1a..5fa8283 100644 +--- a/libparted/labels/mac.c ++++ b/libparted/labels/mac.c +@@ -759,6 +759,13 @@ mac_read (PedDisk* disk) + mac_disk_data->block_size = raw_disk->block_size; + } + ++ /* re-allocate buf in case _disk_analyse_block_size changed ++ * the sector_size */ ++ free (buf); ++ buf = ped_malloc (disk->dev->sector_size); ++ if (!buf) ++ goto error; ++ + for (num=1; num==1 || num <= last_part_entry_num; num++) { + void *raw_part = buf; + if (!ped_device_read (disk->dev, raw_part, +-- +1.7.11.4 + diff --git a/SOURCES/parted-3.1-libparted-use-largest_partnum-in-dm_reread_part_tabl.patch b/SOURCES/parted-3.1-libparted-use-largest_partnum-in-dm_reread_part_tabl.patch new file mode 100644 index 00000000..23027513 --- /dev/null +++ b/SOURCES/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/SOURCES/parted-3.1-test-creating-20-device-mapper-partitions.patch b/SOURCES/parted-3.1-test-creating-20-device-mapper-partitions.patch new file mode 100644 index 00000000..8a860e7e --- /dev/null +++ b/SOURCES/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/SOURCES/parted-3.1-tests-Add-btrfs-and-xfs-to-the-fs-probe-test.patch b/SOURCES/parted-3.1-tests-Add-btrfs-and-xfs-to-the-fs-probe-test.patch new file mode 100644 index 00000000..7aa5449f --- /dev/null +++ b/SOURCES/parted-3.1-tests-Add-btrfs-and-xfs-to-the-fs-probe-test.patch @@ -0,0 +1,26 @@ +From 17027da1eda39d20b2d6dca0a59ac4afc5409318 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Wed, 28 Aug 2013 08:47:26 -0700 +Subject: [PATCH 69/69] tests: Add btrfs and xfs to the fs probe test + +* tests/tests/t1700-probe-fs.sh: Add btrfs and xfs +--- + tests/t1700-probe-fs.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/t1700-probe-fs.sh b/tests/t1700-probe-fs.sh +index 7ce53d0..0418e73 100755 +--- a/tests/t1700-probe-fs.sh ++++ b/tests/t1700-probe-fs.sh +@@ -22,7 +22,7 @@ require_512_byte_sector_size_ + dev=loop-file + ss=$sector_size_ + +-for type in ext2 ext3 ext4 nilfs2; do ++for type in ext2 ext3 ext4 btrfs xfs nilfs2; do + + ( mkfs.$type -V ) >/dev/null 2>&1 \ + || { warn_ "$ME: no $type support"; continue; } +-- +1.8.3.1 + diff --git a/SOURCES/parted-3.1-tests-Make-sure-dm-UUIDs-are-not-erased.patch b/SOURCES/parted-3.1-tests-Make-sure-dm-UUIDs-are-not-erased.patch new file mode 100644 index 00000000..c24bfaff --- /dev/null +++ b/SOURCES/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: Brian C. Lane +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/SOURCES/parted-3.1-tests-add-t0301-overwrite-gpt-pmbr.sh.patch b/SOURCES/parted-3.1-tests-add-t0301-overwrite-gpt-pmbr.sh.patch new file mode 100644 index 00000000..99b66025 --- /dev/null +++ b/SOURCES/parted-3.1-tests-add-t0301-overwrite-gpt-pmbr.sh.patch @@ -0,0 +1,34 @@ +From 98f1556d8a134f54d62ebdac27e9d16aa7884983 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 20 Mar 2012 17:17:10 -0700 +Subject: [PATCH 2/2] tests: add t0301-overwrite-gpt-pmbr.sh + +Make sure parted checks the PMBR before the GPT partition table. + +* NEWS: Update with new GPT behavior +* tests/Makefile.am: Add new test +* tests/overwrite-gpt-pmbr.sh: new test +--- + NEWS | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +diff --git a/NEWS b/NEWS +index fe0fcdd..b0a0657 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,5 +1,12 @@ + GNU parted NEWS -*- outline -*- + ++* Noteworthy changes in release 3.1-2 (2012-03-21) [Fedora] ++ ++** Bug Fixes ++ ++ libparted: Treat disks without a PMBR as msdos labeled disks ++ even if they have GPT partition tables. ++ + * Noteworthy changes in release 3.1 (2012-03-02) [stable] + + ** New features +-- +1.7.7.6 + diff --git a/SOURCES/parted-3.1-tests-cleanup-losetup-usage.patch b/SOURCES/parted-3.1-tests-cleanup-losetup-usage.patch new file mode 100644 index 00000000..06f13c88 --- /dev/null +++ b/SOURCES/parted-3.1-tests-cleanup-losetup-usage.patch @@ -0,0 +1,137 @@ +From a1aa9eb26f357bb1a5111eb332594dfb7b39ace0 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Mon, 15 Oct 2012 17:27:18 -0700 +Subject: [PATCH 1/2] tests: cleanup losetup usage + +The unsafe_losetup_ function was failing because losetup didn't +recognize that the 'private' /dev/loopX devices were the same as +/dev/loopX, it would fail even if one was in use. Switch to using +losetup --show which is a cleaner solution. +Also use sparse file for loop_setup to save space. +--- + tests/lvm-utils.sh | 24 ++---------------------- + tests/t-lvm.sh | 24 ++---------------------- + tests/t6001-psep.sh | 8 ++------ + tests/t6003-dm-uuid.sh | 3 +-- + 4 files changed, 7 insertions(+), 52 deletions(-) + +diff --git a/tests/lvm-utils.sh b/tests/lvm-utils.sh +index 456d265..a204b08 100644 +--- a/tests/lvm-utils.sh ++++ b/tests/lvm-utils.sh +@@ -16,34 +16,14 @@ export LVM_SUPPRESS_FD_WARNINGS=1 + ME=$(basename "$0") + warn() { echo >&2 "$ME: $@"; } + +-unsafe_losetup_() +-{ +- f=$1 +- +- test -n "$G_dev_" \ +- || fail_ "Internal error: unsafe_losetup_ called before init_root_dir_" +- +- # Iterate through $G_dev_/loop{,/}{0,1,2,3,4,5,6,7,8,9} +- for slash in '' /; do +- for i in 0 1 2 3 4 5 6 7 8 9; do +- dev=$G_dev_/loop$slash$i +- losetup $dev > /dev/null 2>&1 && continue; +- losetup "$dev" "$f" > /dev/null && { echo "$dev"; return 0; } +- break +- done +- done +- +- return 1 +-} +- + loop_setup_() + { + file=$1 +- dd if=/dev/zero of="$file" bs=1M count=1 seek=1000 > /dev/null 2>&1 \ ++ dd if=/dev/null of="$file" bs=1M count=1 seek=1000 > /dev/null 2>&1 \ + || { warn "loop_setup_ failed: Unable to create tmp file $file"; return 1; } + + # NOTE: this requires a new enough version of losetup +- dev=$(unsafe_losetup_ "$file") \ ++ dev=$(losetup --show -f "$file") 2>/dev/null \ + || { warn "loop_setup_ failed: Unable to create loopback device"; return 1; } + + echo "$dev" +diff --git a/tests/t-lvm.sh b/tests/t-lvm.sh +index b08f934..3c7657b 100644 +--- a/tests/t-lvm.sh ++++ b/tests/t-lvm.sh +@@ -16,34 +16,14 @@ export LVM_SUPPRESS_FD_WARNINGS=1 + ME=$(basename "$0") + warn() { echo >&2 "$ME: $@"; } + +-unsafe_losetup_() +-{ +- f=$1 +- +- test -n "$G_dev_" \ +- || error "Internal error: unsafe_losetup_ called before init_root_dir_" +- +- # Iterate through $G_dev_/loop{,/}{0,1,2,3,4,5,6,7,8,9} +- for slash in '' /; do +- for i in 0 1 2 3 4 5 6 7 8 9; do +- dev=$G_dev_/loop$slash$i +- losetup $dev > /dev/null 2>&1 && continue; +- losetup "$dev" "$f" > /dev/null && { echo "$dev"; return 0; } +- break +- done +- done +- +- return 1 +-} +- + loop_setup_() + { + file=$1 +- dd if=/dev/zero of="$file" bs=1M count=1 seek=1000 > /dev/null 2>&1 \ ++ dd if=/dev/null of="$file" bs=1M count=1 seek=1000 > /dev/null 2>&1 \ + || { warn "loop_setup_ failed: Unable to create tmp file $file"; return 1; } + + # NOTE: this requires a new enough version of losetup +- dev=$(unsafe_losetup_ "$file" 2>/dev/null) \ ++ dev=$(losetup --show -f "$file") 2>/dev/null \ + || { warn "loop_setup_ failed: Unable to create loopback device"; return 1; } + + echo "$dev" +diff --git a/tests/t6001-psep.sh b/tests/t6001-psep.sh +index 490c6d2..1859ac9 100644 +--- a/tests/t6001-psep.sh ++++ b/tests/t6001-psep.sh +@@ -44,14 +44,10 @@ cleanup_fn_() { + # create a file of size N bytes + N=10M + +-# create the test file +-f1=$(pwd)/1; dd if=/dev/null of=$f1 bs=1 seek=$N 2> /dev/null || fail=1 +-f2=$(pwd)/2; dd if=/dev/null of=$f2 bs=1 seek=$N 2> /dev/null || fail=1 +- +-d1=$(loop_setup_ "$f1") \ ++f1=$(pwd)/1; d1=$(loop_setup_ "$f1") \ + || skip_ "is this partition mounted with 'nodev'?" + +-d2=$(loop_setup_ "$f2") \ ++f2=$(pwd)/2 ;d2=$(loop_setup_ "$f2") \ + || skip_ "is this partition mounted with 'nodev'?" + + dmsetup_cmd="0 `blockdev --getsz $d1` linear $d1 0" +diff --git a/tests/t6003-dm-uuid.sh b/tests/t6003-dm-uuid.sh +index 1751cb4..f58cb06 100755 +--- a/tests/t6003-dm-uuid.sh ++++ b/tests/t6003-dm-uuid.sh +@@ -36,8 +36,7 @@ cleanup_() { + } + + # 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 ++dev=$(loop_setup_ $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 + +-- +1.7.11.4 + diff --git a/SOURCES/parted-3.1-tests-rewrite-t6001-to-use-dev-mapper.patch b/SOURCES/parted-3.1-tests-rewrite-t6001-to-use-dev-mapper.patch new file mode 100644 index 00000000..0e7884d8 --- /dev/null +++ b/SOURCES/parted-3.1-tests-rewrite-t6001-to-use-dev-mapper.patch @@ -0,0 +1,98 @@ +From 7d4947fd094f1dda491473a57a9275971405684e Mon Sep 17 00:00:00 2001 +From: Fedora Ninjas +Date: Wed, 17 Apr 2013 14:59:36 -0700 +Subject: [PATCH] tests: rewrite t6001 to use /dev/mapper + +This test begain failing because using a private copy of /dev/mapper +confuses the system. This fixes that and generally cleans up the test. + +tests/t6001.sh: update to use /dev/mapper directly +--- + tests/t6001-psep.sh | 43 ++++++++++++++++++------------------------- + 1 file changed, 18 insertions(+), 25 deletions(-) + +diff --git a/tests/t6001-psep.sh b/tests/t6001-psep.sh +index 1859ac9..0c1ab99 100644 +--- a/tests/t6001-psep.sh ++++ b/tests/t6001-psep.sh +@@ -1,4 +1,5 @@ + #!/bin/sh ++ + # ensure that parted names partitions on dm disks correctly + + # Copyright (C) 2011-2012 Free Software Foundation, Inc. +@@ -19,10 +20,7 @@ + . "${srcdir=.}/init.sh"; path_prepend_ ../parted + + require_root_ +-lvm_init_root_dir_ +- +-test "x$ENABLE_DEVICE_MAPPER" = xyes \ +- || skip_ "no device-mapper support" ++(dmsetup --help) > /dev/null 2>&1 || skip_test_ "No dmsetup installed" + + # Device maps names - should be random to not conflict with existing ones on + # the system +@@ -41,25 +39,19 @@ cleanup_fn_() { + rm -f "$f1 $f2"; + } + +-# create a file of size N bytes +-N=10M ++loop_file_1=loop-file-1-$$ ++loop_file_2=loop-file-2-$$ + +-f1=$(pwd)/1; d1=$(loop_setup_ "$f1") \ +- || skip_ "is this partition mounted with 'nodev'?" ++d1=$(loop_setup_ $loop_file_1) || framework_failure ++d1_size=$(blockdev --getsz $d1) ++d2=$(loop_setup_ $loop_file_2) || framework_failure ++d2_size=$(blockdev --getsz $d2) + +-f2=$(pwd)/2 ;d2=$(loop_setup_ "$f2") \ +- || skip_ "is this partition mounted with 'nodev'?" +- +-dmsetup_cmd="0 `blockdev --getsz $d1` linear $d1 0" +-# setup: create a mapping +-echo "$dmsetup_cmd" | dmsetup create "$linear_" || fail=1 +-dev="$DM_DEV_DIR/mapper/$linear_" ++dmsetup create $linear_ --table "0 $d1_size linear $d1 0" || framework_failure ++dev="/dev/mapper/$linear_" + + # Create msdos partition table +-parted -s $dev mklabel msdos > out 2>&1 || fail=1 +-compare /dev/null out || fail=1 +- +-parted -s $dev mkpart primary fat32 1m 5m > out 2>&1 || fail=1 ++parted -s $dev mklabel msdos mkpart primary fat32 1m 5m > out 2>&1 || fail=1 + compare /dev/null out || fail=1 + + #make sure device name is correct +@@ -67,17 +59,18 @@ test -e ${dev}p1 || fail=1 + + #repeat on name not ending in a digit + # setup: create a mapping +-echo "$dmsetup_cmd" | dmsetup create "$linear2_" || fail=1 +-dev="$DM_DEV_DIR/mapper/$linear2_" ++dmsetup create $linear2_ --table "0 $d2_size linear $d2 0" || framework_failure ++dev="/dev/mapper/$linear2_" + + # Create msdos partition table +-parted -s $dev mklabel msdos > out 2>&1 || fail=1 +-compare /dev/null out || fail=1 +- +-parted -s $dev mkpart primary fat32 1m 5m > out 2>&1 || fail=1 ++parted -s $dev mklabel msdos mkpart primary fat32 1m 5m > out 2>&1 || fail=1 + compare /dev/null out || fail=1 + + #make sure device name is correct + test -e ${dev}1 || fail=1 + ++if [ -n "$fail" ]; then ++ ls /dev/mapper ++fi ++ + Exit $fail +-- +1.8.1.4 + diff --git a/SOURCES/pubkey.jim.meyering b/SOURCES/pubkey.jim.meyering new file mode 100644 index 00000000..c23169b1 --- /dev/null +++ b/SOURCES/pubkey.jim.meyering @@ -0,0 +1,371 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.11 (GNU/Linux) + +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 +TsT5hoBVIBulDJ13iotYt5qIhAlhASJs +=Nb2k +-----END PGP PUBLIC KEY BLOCK----- diff --git a/SPECS/parted.spec b/SPECS/parted.spec new file mode 100644 index 00000000..1f453cbd --- /dev/null +++ b/SPECS/parted.spec @@ -0,0 +1,1238 @@ +%define _sbindir /sbin +%define _libdir /%{_lib} + +Summary: The GNU disk partition manipulation program +Name: parted +Version: 3.1 +Release: 29%{?dist} +License: GPLv3+ +Group: Applications/System +URL: http://www.gnu.org/software/parted + +Source0: ftp://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz +Source1: ftp://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz.sig +Source2: pubkey.jim.meyering + +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 +Patch9: parted-3.1-libparted-reallocate-buf-after-_disk_analyse_block_s.patch +Patch10: parted-3.1-tests-cleanup-losetup-usage.patch +Patch11: parted-3.1-libparted-add-support-for-implicit-FBA-DASD-partitions.patch +Patch12: parted-3.1-libparted-add-support-for-EAV-DASD-partitions.patch +Patch13: parted-3.1-libparted-don-t-canonicalize-dev-md-paths.patch +Patch14: parted-3.1-libparted-mklabel-eav.patch +Patch15: parted-3.1-avoid-dasd-as-default-file-image-type.patch +Patch16: parted-3.1-libparted-mklabel-edev.patch +Patch17: parted-3.1-tests-rewrite-t6001-to-use-dev-mapper.patch +Patch18: parted-3.1-libparted-Recognize-btrfs-filesystem.patch +Patch19: parted-3.1-tests-Add-btrfs-and-xfs-to-the-fs-probe-test.patch +Patch20: parted-3.1-libparted-Flush-parent-device-on-open-962611.patch + +# NOTE: Started numbering patches to their order is obvious +Patch21: 0021-tests-Remove-rmmod-loop-from-t8001-1040504.patch +Patch22: 0022-tests-Increase-size-of-container-filesystem-in-t4100.patch +Patch23: 0023-tests-Disable-t4100-dvh-test-for-now-1036093.patch +Patch24: 0024-libparted-make-sure-not-to-treat-percentages-as-exac.patch +Patch25: 0025-tests-Use-mkfs.xfs-to-create-files-1036152.patch +Patch26: 0026-Update-manpage-NAME-so-whatis-will-work-948424.patch +Patch27: 0027-GPT-add-support-for-PReP-GUID-1108196.patch +Patch28: 0028-libparted-reread-part-table-with-0-partitions-113846.patch +Patch29: 0029-tests-Change-minimum-size-to-256MiB.patch +Patch30: 0030-libparted-handle-logical-partitions-starting-immedia.patch +Patch31: 0031-tests-Add-a-test-for-device-mapper-partition-sizes-1.patch +Patch32: 0032-libparted-device-mapper-uses-512b-sectors-1188431.patch +Patch33: 0033-libparted-Use-read-only-when-probing-devices-on-linu.patch +Patch34: 0034-tests-Use-wait_for_dev_to_-functions.patch +Patch35: 0035-tests-Add-udevadm-settle-to-wait_for_-loop-1260664.patch +Patch36: 0036-tests-Add-wait-to-t9042-1257415.patch +Patch37: 0037-tests-Fix-t1700-failing-on-a-host-with-a-4k-xfs-file.patch +Patch38: 0038-libparted-Remove-fdasd-geometry-code-from-alloc_meta.patch +Patch39: 0039-docs-Add-list-of-filesystems-for-fs-type-1311596.patch +Patch40: 0040-partprobe-Open-the-device-once-for-probing-1339705.patch +Patch41: 0041-tests-Stop-timing-t9040-1172675.patch +Patch42: 0042-tests-Set-optimal-blocks-to-64-for-scsi_debug-device.patch +Patch43: 0043-Add-support-for-NVMe-devices.patch +Patch44: 0044-Document-resizepart-command.patch +Patch45: 0045-parted-Add-stub-resize-command-for-backward-compatib.patch +Patch46: 0046-libparted-Backport-partition-resize-code.patch +Patch47: 0047-tests-excersise-resize-command.patch +Patch48: 0048-parted-add-resizepart-command.patch + +Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildRequires: e2fsprogs-devel +BuildRequires: readline-devel +BuildRequires: ncurses-devel +BuildRequires: gettext-devel +BuildRequires: texinfo +BuildRequires: device-mapper-devel +BuildRequires: libselinux-devel +BuildRequires: libuuid-devel +BuildRequires: libblkid-devel >= 2.17 +BuildRequires: gnupg +BuildRequires: git +BuildRequires: autoconf automake +BuildRequires: e2fsprogs +BuildRequires: dosfstools +BuildRequires: bc + +Requires(post): /sbin/ldconfig +Requires(post): /sbin/install-info +Requires(preun): /sbin/install-info +Requires(postun): /sbin/ldconfig + +# bundled gnulib library exception, as per packaging guidelines +# https://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries +Provides: bundled(gnulib) + +%description +The GNU Parted program allows you to create, destroy, resize, move, +and copy hard disk partitions. Parted can be used for creating space +for new operating systems, reorganizing disk usage, and copying data +to new hard disks. + + +%package devel +Summary: Files for developing apps which will manipulate disk partitions +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: pkgconfig + +%description devel +The GNU Parted library is a set of routines for hard disk partition +manipulation. If you want to develop programs that manipulate disk +partitions and filesystems using the routines provided by the GNU +Parted library, you need to install this package. + + +%prep +%setup -q +gpg --import %{SOURCE2} +gpg --verify %{SOURCE1} %{SOURCE0} +git init +git config user.email "parted-owner@fedoraproject.org" +git config user.name "Fedora Ninjas" +git add . +git commit -a -q -m "%{version} baseline." +git am %{patches} +iconv -f ISO-8859-1 -t UTF8 AUTHORS > tmp; touch -r AUTHORS tmp; mv tmp AUTHORS +git commit -a -m "run iconv" + +%build +autoreconf +autoconf +CFLAGS="$RPM_OPT_FLAGS -Wno-unused-but-set-variable"; export CFLAGS +%configure --enable-selinux --disable-static +# Don't use rpath! +%{__sed} -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool +%{__sed} -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool +V=1 %{__make} %{?_smp_mflags} + + +%install +%{__rm} -rf %{buildroot} +%{__make} install DESTDIR=%{buildroot} + +# Move devel package components in to the correct location +%{__mkdir} -p %{buildroot}%{_exec_prefix}/%{_lib} +%{__mv} %{buildroot}%{_libdir}/libparted.so %{buildroot}%{_exec_prefix}/%{_lib} +%{__mv} %{buildroot}%{_libdir}/pkgconfig %{buildroot}%{_exec_prefix}/%{_lib} +pushd %{buildroot}%{_exec_prefix}/%{_lib} +reallibrary="$(readlink libparted.so)" +%{__rm} -f libparted.so +ln -sf ../../%{_lib}/${reallibrary} libparted.so +popd + +# Remove components we do not ship +%{__rm} -rf %{buildroot}%{_libdir}/*.la +%{__rm} -rf %{buildroot}%{_infodir}/dir +%{__rm} -rf %{buildroot}%{_bindir}/label +%{__rm} -rf %{buildroot}%{_bindir}/disk + +%find_lang %{name} + + +%check +export LD_LIBRARY_PATH=$(pwd)/libparted/.libs +make check + + +%clean +%{__rm} -rf %{buildroot} + + +%post +/sbin/ldconfig +if [ -f %{_infodir}/parted.info.gz ]; then + /sbin/install-info %{_infodir}/parted.info.gz %{_infodir}/dir || : +fi + +%preun +if [ $1 = 0 ]; then + /sbin/install-info --delete %{_infodir}/parted.info.gz %{_infodir}/dir >/dev/null 2>&1 || : +fi + +%postun -p /sbin/ldconfig + + +%files -f %{name}.lang +%defattr(-,root,root,-) +%doc AUTHORS BUGS COPYING ChangeLog NEWS README THANKS TODO doc/API doc/FAT +%{_sbindir}/parted +%{_sbindir}/partprobe +%{_mandir}/man8/parted.8.gz +%{_mandir}/man8/partprobe.8.gz +%{_libdir}/libparted.so.* +%{_libdir}/libparted-fs-resize.so* +%{_infodir}/parted.info.gz + +%files devel +%defattr(-,root,root,-) +%{_includedir}/parted +%{_exec_prefix}/%{_lib}/libparted.so +%{_exec_prefix}/%{_lib}/pkgconfig/libparted.pc + + +%changelog +* Thu Aug 10 2017 Brian C. Lane - 3.1-29 +- Add support for NVMe devices + Resolves: rhbz#1316239 +- Backport partition resize command + Resolves: rhbz#1423357 + +* Fri Aug 26 2016 Brian C. Lane - 3.1-28 +- tests: Set optimal blocks to 64 for scsi_debug devices + Resolves: rhbz#1359682 + +* Mon Jul 18 2016 Brian C. Lane - 3.1-27 +- tests: Stop timing t9040 + Resolves: rhbz#1172675 + +* Thu May 26 2016 Brian C. Lane - 3.1-26 +- partprobe: Open the device once for probing + Resolves: rhbz#1339705 + +* Tue Apr 12 2016 Brian C. Lane 3.1-25 +- docs: Add list of filesystems for fs-type + Resolves: rhbz#1311596 +- libparted: Remove fdasd geometry code from alloc_metadata + Resolves: rhbz#1244833 + +* Tue Mar 01 2016 Brian C. Lane 3.1-24 +- tests: Add udevadm settle to wait_for_ loop + Related: rhbz#1260664 +- tests: Add-wait-to-t9042 + Resolves: rhbz#1257415 +- tests: Fix t1700 failing on a host with a 4k xfs file + Related: rhbz#1260664 + +* Wed Aug 05 2015 Brian C. Lane 3.1-23 +- libparted: Use read only when probing devices on linux + Resolves: rhbz#1245144 +- tests: Use wait_for_dev_to_ functions + Related: rhbz#1245144 + +* Wed May 20 2015 Brian C. Lane 3.1-22 +- Use 512b sector size when communicating with device-mapper + Resolves: rhbz#1188431 +- Add a test to make sure partitions are the correct size on device-mapper + Related: rhbz#1188431 + +* Thu Apr 16 2015 Brian C. Lane 3.1-21 +- Backport fix for 1 sector logical partition separation from start of extended + Resolves: rhbz#1212323 + +* Tue Nov 25 2014 Brian C. Lane 3.1-20 +- t1700-fs test: Change minimum size to 256MiB + Resolves: rhbz#1167785 + +* Wed Sep 24 2014 Brian C. Lane 3.1-19 +- Remove dm device when last partition is removed + Resolves: rhbz#1138465 + +* Tue Aug 12 2014 Brian C. Lane 3.1-18 +- Fix manpage NAME so whatis works with parted + Resolves: rhbz#948424 +- GPT add support for PReP GUID + Resolves: rhbz#1108196 + +* Fri Jan 24 2014 Daniel Mach - 3.1-17 +- Mass rebuild 2014-01-24 + +* Wed Jan 22 2014 Brian C. Lane 3.1-16 +- tests: Remove rmmod loop from t8001 + Resolves: rhbz#1040504 +- tests: Increase size of container filesystem in t4100 + Resolves: rhbz#1036149 +- tests: Disable t4100 dvh test for now + Resolves: rhbz#1036093 +- libparted: Make sure not to treat percentages as exact + Resolves: rhbz#1045957 +- tests: Use mkfs.xfs to create files + Resolves: rhbz#1036152 + +* Fri Dec 27 2013 Daniel Mach - 3.1-15 +- Mass rebuild 2013-12-27 + +* Wed Sep 04 2013 Brian C. Lane 3.1-14 +- libparted: Flush parent device on open (#962611) + +* Wed Aug 28 2013 Brian C. Lane 3.1-13 +- libparted: Recognize btrfs filesystem (#857101) +- tests: Add btrfs and xfs to the fs probe test (#857101) + +* Wed Apr 17 2013 Brian C. Lane 3.1-12 +- libparted: mklabel to support EDEV DASD (#953146) +- tests: rewrite t6001 to use /dev/mapper + +* Thu Feb 14 2013 Fedora Release Engineering - 3.1-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Wed Dec 12 2012 Brian C. Lane 3.1-10 +- libparted: mklabel to support EAV DASD (#707032) +- libparted: Avoid dasd as default disk type while probe (#707032) + +* Thu Nov 01 2012 Brian C. Lane 3.1-9 +- don't canonicalize /dev/md/ paths (#872361) + +* Tue Oct 16 2012 Brian C. Lane 3.1-8 +- change partition UUID to use partX-UUID (#858704) +- fixup losetup usage in tests +- add support for implicit FBA DASD partitions (#707027) +- add support for EAV DASD partitions (#707032) + +* Tue Sep 04 2012 Brian C. Lane 3.1-7 +- reallocate buf after _disk_analyse_block_size (#835601) + +* 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 + +* Fri Jun 08 2012 Brian C. Lane 3.1-4 +- Fix crash on ppc64 with GPT (#829960) (rwmj) + +* Tue May 15 2012 Brian C. Lane 3.1-3 +- Added Provides: bundled(gnulib) (#821782) + +* Wed Mar 21 2012 Brian C. Lane 3.1-2 +- libparted: check PMBR before GPT partition table (#805272) +- tests: add a test for the new behavior + +* Tue Mar 13 2012 Brian C. Lane 3.1-1 +- Rebase to upstream parted v3.1 +- removed merged patches +- add new libparted-fs-resize library + +* Fri Feb 03 2012 Brian C. Lane - 3.0-7 +- Update patch for copying flags so that it is generic +- Copy pmbr_boot flag in gpt_duplicate + +* Thu Feb 02 2012 Brian C. Lane - 3.0-6 +- gpt: add commands to manipulate pMBR boot flag (#754850) +- parted: when printing, also print the new disk flags +- tests: update tests for new disk flags output +- tests: add test for GPT PMBR pmbr_boot flag +- doc: update parted documentation + +* Fri Jan 13 2012 Fedora Release Engineering - 3.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Oct 31 2011 Brian C. Lane - 3.0-4 +- Fix ped_disk_duplicate on GPT so that it copies the partition flags (#747947) +- Add new test to check ped_disk_duplicate on msdos, gpt, bsd disk labels +- Add e2fsprogs and dosfstools so that skipped tests will be run + +* Fri Oct 07 2011 Brian C. Lane - 3.0-3 +- Fix handling of zero-length gpt partitions (#728949) +- Fix bug in nilfs2 probe with short partitions (#728949) +- Fix bug in hfs probe code (#714758) +- Make pc98 detection depend on specific signatures (#646053) + +* Wed Jun 29 2011 Richard W.M. Jones - 3.0-2 +- (Re-)apply patch to fix Linux "3.0" problem. + +* Tue Jun 28 2011 Brian C. Lane - 3.0-1 +- Update to parted v3.0 +- Run autoreconf so that patches to .am files will work +- Add patch to Fix snap radius and don't allow values < 1 (#665496) +- Add tests for the snap radius fix. +- Drop patches included in upstream release + +* Sun Jun 5 2011 Richard W.M. Jones - 2.4-2 +- Apply patch which may fix Linux "3.0" problem. + +* Thu May 26 2011 Brian C. Lane - 2.4-1 +- Updating to latest upstream v2.4 +- Drop patches included in upstream + +* Fri Mar 11 2011 Brian C. Lane - 2.3-8 +- Add support for legacy_boot flag for GPT partitions (680562) +- Remove PED_ASSERT for dos geometry calculations (585468) + +* Wed Feb 09 2011 Brian C. Lane - 2.3-7 +- Tell GCC to stop treating unused variable warnings as errors + +* Tue Feb 08 2011 Fedora Release Engineering - 2.3-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Mon Dec 20 2010 Brian C. Lanr - 2.3-5 +- Document the align-check command + Resolves: #642476 +- Default to 1MiB partition alignment + Resolves: #618255 + +* Fri Dec 17 2010 Peter Jones - 2.3-4 +- Handle mac labels with differing physical/logical sector sizes better + +* Wed Sep 29 2010 jkeating - 2.3-3 +- Rebuilt for gcc bug 634757 + +* Fri Sep 17 2010 Brian C. Lane 2.3-2 +- Add patch to handle syncing partition changes when using blkext majors +- Resolves rhbz#634980 +- Related rhbz#629719 + +* Tue Jul 20 2010 Hans de Goede 2.3-1 +- Rebase to new upstream 2.3 release +- Drop all patches (all upstreamed) +- Recognize scsi disks with a high major as such (#611691) + +* Thu May 6 2010 Hans de Goede 2.2-5 +- Also recognize recovery partitions with id 27 / on gpt (#589451) + +* Fri Apr 23 2010 Hans de Goede 2.2-4 +- Properly check dm_task_run return value (#585158) +- Fix mkpartfs (ext2) on partitions >2TB (#585159) + +* Mon Apr 19 2010 Hans de Goede 2.2-3 +- Add a flag for detecting diagnostics / recovery partitions (#583626) + +* Tue Apr 6 2010 Hans de Goede 2.2-2 +- Parted should not canonicalize symlinks under /dev/mapper (#577824) + +* Tue Mar 30 2010 Hans de Goede 2.2-1 +- New upstream version 2.2 (#577478) +- Drop all our patches (all upstreamed) + +* Thu Feb 18 2010 Hans de Goede 2.1-5 +- Copy needs_clobber value in ped_disk_duplicate() (#561976) + +* Wed Feb 10 2010 Hans de Goede 2.1-4 +- Don't crash when reading a DASD disk with PV's on there (#563419) +- Don't overwrite the pmbr when merely printing a gpt table (#563211) + +* Sun Jan 31 2010 Hans de Goede 2.1-3 +- If a drive does not have alignment information available default + to an alignment of 1MiB (#559639) + +* Sun Jan 17 2010 Hans de Goede 2.1-2 +- Fix various memory leaks in error paths (#556012) +- Add %%check section to the specfile, invoking make check + +* Mon Jan 11 2010 Hans de Goede 2.1-1 +- New upstream release 2.1 +- Drop all our patches (all merged upstream) + +* Sun Dec 20 2009 Hans de Goede 1.9.0-25 +- Fix crash when partitioning loopback devices (#546622) +- Drop no-cylinder-align patch: + - its functionality is superseeded by the per disk flags + - its only user (pyparted) has been updated to use those + - this is not upstream so we don't want other programs to start using it + +* Fri Dec 18 2009 Hans de Goede 1.9.0-24 +- Allow partitioning of loopback devices (#546622) +- Add libparted function to query maximum partition length and start + addresses for a given disk (#533417) +- Add per disk flags functions from upstream, this is the way upstream + has implemented the disable cylinder alignment functionality +- Add --align cmdline option to specify how to align new partitions + see the parted man page for details (#361951) +- Make the default alignment for new partitions optimal (#361951) +- When cylinder alignment is disabled, allow use of the last (incomplete) + cylinder of the disk (#533328) +- Don't crash when printing partition tables in Russian (#543029) +- Make parted work correctly with new lvm (#525095) + +* Wed Nov 11 2009 Hans de Goede 1.9.0-23 +- Fix parted not building on s390 + +* Mon Nov 9 2009 Hans de Goede 1.9.0-22 +- Fix error when creating a fresh dasd disk on a dasd device + with a corrupted dasd label (#533808) + +* Fri Nov 6 2009 Hans de Goede 1.9.0-21 +- Fix a compiler warning which is causing build errors (#532425) + +* Tue Nov 3 2009 Hans de Goede 1.9.0-20 +- Fix error when creating a fresh dasd disk (#532425) +- Rewrite dasd disk duplication patches, as the old old ones conflicted + with fixing creating a fresh dasd disk + +* Fri Oct 30 2009 Hans de Goede 1.9.0-19 +- Fix a segfault introduced by -18 when operating on plain files + +* Thu Oct 29 2009 Hans de Goede 1.9.0-18 +- Add functions to query device / partition table alignments (#528030) + +* Thu Oct 8 2009 Hans de Goede 1.9.0-17 +- Only change the partition type to 82 when setting the swap flag on dos + labels, not when resetting it + +* Tue Oct 6 2009 Hans de Goede 1.9.0-16 +- Correctly handle GPT labels on big endian machines + +* Tue Oct 6 2009 Hans de Goede 1.9.0-15 +- ped_partition_is_busy() should not throw exceptions (#527035) +- msdos_partition_is_flag_available() should return 1 for swap flag (#513729) + +* Mon Aug 31 2009 Joel Granados 1.9.0-14 +- Patchs for 'commit to os' for linux. Thx to hansg. + +* Fri Aug 28 2009 Karsten Hopp 1.9.0-13 +- volkey is only 4 chars, don't overflow destination buffer with 84 chars + +* Fri Aug 21 2009 Joel Granados - 1.9.0-12 +- libuuid-devel is now valid for s390 builds. + +* Wed Aug 12 2009 Ville Skyttä - 1.9.0-11 +- Use xz compressed upstream tarball. + +* Wed Aug 12 2009 Joel Granados - 1.9.0-10 +- Make install with exclude docs work without an error message. + +* Wed Jul 29 2009 Joel Granados - 1.9.0-9 +- Add parenthesis where needed (#511907) + +* Mon Jul 27 2009 Joel Granados - 1.9.0-8 +- Add the swap flag to the dos type labels + +* Sat Jul 25 2009 Fedora Release Engineering - 1.9.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Thu Jul 23 2009 Joel Granados - 1.9.0-6 +- Rebuild usiing the official tar.gz at http://ftp.gnu.org/gnu/parted/parted-1.9.0.tar.gz + +* Wed Jul 22 2009 Joel Granados - 1.9.0-5.20090721git980c +- Better handle a duplicate error. + +* Tue Jul 21 2009 Joel Granados - 1.9.0-4.20090721git980c +- New snapshot. +- Add patches to make dasd duplicate disk work. + +* Sat Jul 18 2009 Lubomir Rintel - 1.9.0-3.20090610git32dc +- Fix a typo in the errno patch + +* Mon Jul 13 2009 Joel Granados - 1.9.0-2.20090610git32dc +- Correctly number the snapshot. + +* Fri Jul 10 2009 Joel Granados - 1.9.0-1 +- New version. + +* Thu Mar 26 2009 Joel Granados - 1.8.8-15 +- Begin to identify virtio devices. +- Actually change the partition type in msdos lables (dcantrell). + +* Mon Mar 23 2009 Joel Granados - 1.8.8-14 +- Correct the behavior of upated_mode functions when the ASSERT fails (thx to hansg). + +* Thu Feb 26 2009 Joel Granados - 1.8.8-13 +- Fix parted build for gcc-4.4 + +* Thu Feb 26 2009 Fedora Release Engineering - 1.8.8-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Thu Jan 22 2009 Joel Granados - 1.8.8-12 +- Avoid the calling of stat for strings that don't begin with the "/" char (#353191). + +* Sat Dec 13 2008 Tom "spot" Callaway - 1.8.8-11 +- fix typo in last patch + +* Sat Dec 13 2008 Tom "spot" Callaway - 1.8.8-10 +- enable RAID partition types on sun disklabels for sparc + +* Thu Nov 06 2008 Joel Granados - 1.8.8-9 +- Fix the build for the s390(x) archs (#470211). + +* Thu Jun 05 2008 Peter Jones - 1.8.8-8 +- Fix some of the atvrecv code (and the msftres code) so that the flags + actually stick. + +* Thu Jun 05 2008 Peter Jones - 1.8.8-7 +- Added "atvrecv" flag patch from atv-bootloader project. + +* Thu May 29 2008 Joel Granados - 1.8.8-6 +- Do a better job at recognizing the dos partition. (#246423) + +* Thu Apr 10 2008 David Cantrell - 1.8.8-5 +- Allow RAID or LVM partition types on BSD disklabels. + (jay.estabrook AT hp.com, #427114) + +* Thu Apr 10 2008 Peter Jones - 1.8.8-4 +- Don't interactively ask to fix an AlternateGPT's location when not + at the end of the disk; this is so that disk images written to a + usb-key can work reasonably. + +* Mon Feb 04 2008 David Cantrell - 1.8.8-3 +- Fixes so parted compiles with gcc-4.3 (#431397) + +* Sun Jan 13 2008 David Cantrell - 1.8.8-2 +- Move libparted libraries to /lib (#428420) + +* Wed Jan 02 2008 David Cantrell - 1.8.8-1 +- Upgraded to GNU parted-1.8.8 +- License for GNU parted is now GPLv3+ + +* Thu Dec 13 2007 David Cantrell - 1.8.6-13 +- Modify parted man page to indicate which flags are valid for which + disk labels (#242711) + +* Mon Nov 05 2007 David Cantrell - 1.8.6-12 +- Add KNOWN ISSUES section to parted(8) man page explaining that we cannot + currently do ext3 resizing inside parted (#367101) +- Update the xvd patch to include 'xvd' in the string table that parted + uses when printing device types (#366971) +- Do not install the linux.h or gnu.h headers + +* Tue Oct 30 2007 David Cantrell - 1.8.6-11 +- Do not install fdasd.h and vtoc.h header files + +* Thu Oct 04 2007 David Cantrell - 1.8.6-10 +- Do not install the testsuite tools + +* Thu Oct 04 2007 David Cantrell - 1.8.6-9 +- Always define PED_DEVICE_DM regardless of compile time options + +* Tue Aug 21 2007 David Cantrell - 1.8.6-8 +- Rebuild + +* Wed Aug 08 2007 David Cantrell - 1.8.6-7 +- Update License tag to GPLv2+ + +* Tue Aug 07 2007 David Cantrell - 1.8.6-6 +- Detect Xen virtual block devices and set model name appropriately + +* Thu Apr 19 2007 David Cantrell - 1.8.6-5 +- Spec file cleanups for merge review (#226230) + +* Fri Apr 13 2007 David Cantrell - 1.8.6-4 +- Fix primary partition cylinder alignment error for DOS disk labels (#229745) +- Do not build and package up libparted.a, only the shared library + +* Wed Apr 11 2007 David Cantrell - 1.8.6-3 +- Fix off-by-one bug in parted(8) when displaying disk label (#235901) + +* Wed Mar 21 2007 David Cantrell - 1.8.6-2 +- Do not translate partition name from disk label (#224182) + +* Tue Mar 20 2007 David Cantrell - 1.8.6-1 +- Upgrade to GNU parted-1.8.6, summary of major change(s): + a) Revert linux-swap(new) and linux-swap(old) fs types, it's + linux-swap for all swap types (#233085) + +* Tue Mar 20 2007 David Cantrell - 1.8.5-1 +- Upgrade to GNU parted-1.8.5 (added missing po files) + +* Fri Mar 16 2007 David Cantrell - 1.8.4-1 +- Upgrade to GNU parted-1.8.4, summary of major changes: + a) Update to use newest GNU developer tools + b) Use gnulib, the GNU portability library + c) HFS+ resize support + d) Windows Vista fixes + e) AIX disk label fixes + f) >512 byte logical sector read support on Linux +- Spec file cleanups per Fedora packaging guidelines + +* Thu Feb 08 2007 David Cantrell - 1.8.2-5 +- Remove period from end of summary line (package review) +- Use preferred BuildRoot (package review) +- BR device-mapper-devel + +* Tue Jan 30 2007 David Cantrell - 1.8.2-4 +- Patched parted.8 man page to show partition names apply to GPT disklabels + as well as Mac and PC98 disklabels (#221600) + +* Mon Jan 22 2007 David Cantrell - 1.8.2-3 +- Remove BR for libtermcap-devel +- Specifically preserve starting alignment of 0x800 on Windows Vista + (see http://support.microsoft.com/kb/923332 for details) +- Fix incorrect sector parameter used to initialize a new PedAlignment + +* Thu Jan 18 2007 David Cantrell - 1.8.2-2 +- Preserve starting sector for primary NTFS 3.1 partitions (Windows + Vista) when modifying the DOS disk label. NTFS 3.1 partitions do + not start on the 2nd head of the 1st cylinder at the beginning of + the drive. + +* Fri Jan 12 2007 David Cantrell - 1.8.2-1 +- Upgrade to GNU parted-1.8.2 + +* Fri Dec 15 2006 David Cantrell - 1.8.1-2 +- Fix a segfault when initializing new volumes (pjones) + +* Mon Dec 04 2006 David Cantrell - 1.8.1-1 +- Upgrade to GNU parted-1.8.1 + +* Fri Nov 17 2006 David Cantrell - 1.8.0-1 +- Upgrade to GNU parted-1.8.0 + +* Thu Nov 02 2006 David Cantrell - 1.7.1-18 +- Detect Apple_Boot partition types correctly (#204714) + +* Thu Oct 26 2006 David Cantrell - 1.7.1-17 +- For init_generic() failures on user-mode Linux block devices, goto + error_free_arch_specific instead of error_free_dev. + +* Wed Oct 04 2006 David Cantrell - 1.7.1-16 +- Don't throw PED_EXCEPTION_ERROR in ped_geometry_read() if accessing + sectors outside of partition boundary, since returning false will + shift ped_geometry_check() to the correct sectors. + +* Wed Aug 23 2006 David Cantrell - 1.7.1-15 +- Fixed gpt patch (*asked_already -> asked_already, whoops) + +* Tue Aug 22 2006 David Cantrell - 1.7.1-14 +- Improve error message returned by _parse_header() on GPT-labeled disks + so users actually have an idea of how to correct the problem +- Fix off-by-one error with LastUsableLBA and PartitionEntryLBA overlap + to prevent possible data corruption when using non-parted GPT editing + tools + +* Mon Aug 21 2006 Peter Jones - 1.7.1-13 +- Don't use the "volume name" as the device node name on dm device + partitions, it isn't really what we want at all. + +* Thu Aug 17 2006 David Cantrell - 1.7.1-12 +- Updated O_DIRECT patch to work around s390 problems +- Update LastUsableLBA on GPT-labeled disks after LUN resize (#194238) +- Fix exception when backup GPT table is not in the correction location + and parted tries to move it (#194238) + +* Tue Aug 15 2006 David Cantrell - 1.7.1-11 +- Expand error buffer to 8192 bytes in vtoc_error() +- Do not apply O_DIRECT patch on S/390 or S/390x platforms + +* Mon Aug 14 2006 David Cantrell - 1.7.1-10 +- Removed bad header file patch (#200577) + +* Wed Jul 12 2006 Jesse Keating - 1.7.1-9.1 +- rebuild + +* Wed Jul 5 2006 Peter Jones - 1.7.1-9 +- add ped_exception_get_handler() + +* Mon Jun 26 2006 Florian La Roche - 1.7.1-8 +- remove info files in preun + +* Thu Jun 22 2006 David Cantrell - 1.7.1-7 +- PED_SECTOR_SIZE -> PED_SECTOR_SIZE_DEFAULT + +* Thu Jun 22 2006 David Cantrell - 1.7.1-6 +- Roll dasd patches together +- Use O_DIRECT to prevent first partition corruption on GPT disks + +* Thu Jun 15 2006 Jeremy Katz - 1.7.1-5 +- fix segfaults with dasd devices + +* Wed Jun 7 2006 Jeremy Katz - 1.7.1-4 +- move .so symlink to -devel subpackage + +* Sun May 28 2006 David Cantrell - 1.7.1-3 +- Rebuild + +* Sun May 28 2006 David Cantrell - 1.7.1-2 +- Removed mac-swraid patch (added upstream) +- Updated device-mapper patch for parted-1.7.1 + +* Sat May 27 2006 David Cantrell - 1.7.1-1 +- Upgraded to parted-1.7.1 + +* Fri May 19 2006 David Cantrell - 1.7.0-1 +- Upgraded to parted-1.7.0 + +* Thu Apr 13 2006 David Cantrell - 1.6.25.1-1 +- Upgraded to parted-1.6.25.1 +- BuildRequires libtool + +* Tue Mar 14 2006 Jeremy Katz - 1.6.25-8 +- fix ppc swraid +- BR gettext-devel + +* Wed Feb 22 2006 Peter Jones - 1.6.25-7 +- close /proc/devices correctly + +* Fri Feb 10 2006 Jesse Keating - 1.6.25-6.1 +- bump again for double-long bug on ppc(64) + +* Tue Feb 7 2006 Peter Jones 1.6.25-6 +- Fix dm partition naming. + +* Tue Feb 7 2006 Jesse Keating 1.6.25-5.2 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Fri Dec 9 2005 Jesse Keating +- rebuilt + +* Fri Dec 2 2005 Peter Jones 1.6.25-5 +- rebuild for new device-mapper + +* Thu Dec 1 2005 Peter Jones 1.6.25-4 +- change device-mapper code to call dm_task_update_nodes() after + tasks which change device nodes. + +* Wed Nov 16 2005 Peter Jones 1.6.25-3 +- fix /proc/devices parser bug + +* Tue Nov 15 2005 Peter Jones 1.6.25-2 +- add support for partitions on dm devices + +* Wed Nov 09 2005 Chris Lumens 1.6.25-1 +- Updated to 1.6.25. +- Update DASD, iseries, and SX8 patches. + +* Tue Aug 30 2005 Chris Lumens 1.6.24-1 +- Updated to 1.6.24. + +* Mon Jul 18 2005 Chris Lumens 1.6.23-2 +- Add buildreq for texinfo. + +* Fri Jul 08 2005 Chris Lumens 1.6.23-1 +- Updated to 1.6.23. +- Get rid of separate Mac patches that are now included in upstream. +- Update DASD and AIX patches. + +* Tue Jun 07 2005 Chris Lumens 1.6.22-3 +- Modified Apple_Free patch to take care of the case where the partitions + are unnamed, causing many errors to be printed (#159047). + +* Thu May 05 2005 Chris Lumens 1.6.22-2 +- Added upstream patch to display certain Apple_Free partitions (#154479). + +* Wed Mar 23 2005 Chris Lumens 1.6.22-1 +- Updated to 1.6.22. +- Get rid of separate gc4 patch that's now included upstream. +- Take Mac LVM patch from parted CVS. + +* Mon Mar 14 2005 Chris Lumens 1.6.21-3 +- Include patches from parted CVS for new gcc4 warnings. + +* Sun Feb 20 2005 Paul Nasrat 1.6.21-2 +- Support lvm flags on mac partitions (#121266) + +* Fri Jan 21 2005 Chris Lumens 1.6.21-1 +- Updated to 1.6.21 + +* Wed Jan 12 2005 Tim Waugh 1.6.20-2 +- Rebuilt for new readline. + +* Fri Jan 07 2005 Chris Lumens 1.6.20-1 +- Updated to 1.6.20 (#139257, #142100). +- Updated DASD and AIX patches for 1.6.20. + +* Tue Dec 14 2004 Jeremy Katz - 1.6.19-2 +- add support for Promise SX8 devices + +* Sun Nov 28 2004 Jeremy Katz - 1.6.19-1 +- update to 1.6.19 (#138419) + +* Sun Nov 21 2004 Jeremy Katz - 1.6.18-1 +- update to 1.6.18 + +* Sat Nov 20 2004 Miloslav Trmac - 1.6.16-3 +- Convert pt_BR-parted.8 to UTF-8 + +* Thu Nov 11 2004 Jeremy Katz - 1.6.16-2 +- add patch from Matt Domsch to fix consistency of GPT disk labels + with the EFI specification for disks > 2TB (#138480) +- understand the new Sun UFS partition ID +- merge the new geometry probing from CVS to see if that helps the + assertions people are seeing (#138419) + +* Mon Nov 8 2004 Jeremy Katz - 1.6.16-1 +- update to 1.6.16 +- rebuild for python 2.4 + +* Mon Oct 18 2004 Jeremy Katz - 1.6.15-5 +- add patch from Matt Domsch to add a unique signature to new DOS labels + so that we can later determine which BIOS disk is which (#106674) + +* Fri Oct 15 2004 Phil Knirsch 1.6.15-4 +- Fixed dasd patch (had some duplicate file patches in it) +- Fixed problem with parted segfaulting on SCSI discs on s390 (#133997) + +* Tue Oct 12 2004 Jeremy Katz - 1.6.15-3 +- add patch from peterm to fix printing of the size of large devices (#135468) + +* Thu Oct 07 2004 Phil Knirsch 1.6.15-2 +- Fixed geometry calculation for bios_geo in dasd_init() + +* Mon Sep 20 2004 Jeremy Katz - 1.6.15-1 +- 1.6.15 + +* Fri Sep 10 2004 Jeremy Katz - 1.6.14-1 +- update to 1.6.14 + +* Tue Aug 24 2004 Jeremy Katz - 1.6.12-2 +- fix assertion error when checking flags on non-active partition (#130692) +- buildrequires: gettext-devel + +* Mon Aug 16 2004 Jeremy Katz - 1.6.12-1 +- update to 1.6.12 with major changes to CHS handling to hopefully fix #115980 +- adjust dasd patch accordingly, drop some included patches + +* Mon Jul 19 2004 Karsten Hopp 1.6.11-4 +- update dasd patch for dos-type partitions on mainframes (scsi disks) + +* Fri Jun 25 2004 Jeremy Katz - 1.6.11-3 +- install-info (#77687) + +* Tue Jun 15 2004 Elliot Lee - 1.6.11-2 +- rebuilt + +* Tue Jun 1 2004 Jeremy Katz +- -devel requires main package (#124938) + +* Thu May 13 2004 Jeremy Katz - 1.6.11-1 +- update to 1.6.11 + +* Tue May 11 2004 Jeremy Katz - 1.6.9-4 +- add patch from Matt Domsch to not use the get/set last sector ioctls + with a 2.6 kernel (#121455) + +* Thu Apr 15 2004 David Woodhouse - 1.6.9-3 +- Fix Mac partition detection to close #112937 + +* Tue Apr 13 2004 Jeremy Katz - 1.6.9-2 +- another minor tweak for 2.6's lack of sane geometry handling + +* Mon Apr 12 2004 Jeremy Katz - 1.6.9-1 +- update to 1.6.9 +- need automake17 +- python-devel is superfluous with pyparted as a separate package +- lose the fake-libtool stuff, 1.6.9 was disted with newer auto* + +* Mon Mar 15 2004 Elliot Lee 1.6.6-2 +- Fix parted's "part-static" option to close #118183. Woohoo, a fake-libtool.sh :) + +* Fri Mar 12 2004 Jeremy Katz - 1.6.6-1 +- update to 1.6.6 +- split dasd into a patch instead of included in the tarball +- python module is now in the pyparted package (separate src.rpm) +- ExcludeArch: ppc64 (#118183) + +* Tue Mar 02 2004 Elliot Lee +- rebuilt + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Fri Feb 6 2004 Jeremy Katz +- add automake buildrequires (#115063) + +* Thu Jan 22 2004 Jeremy Katz 1.6.3-33 +- 2.6 removes the geometry fixups that used to be present for IDE disks. + According to Andries, just follow what's in the partition table and don't + worry about what Linux "detects" + +* Thu Nov 6 2003 Jeremy Katz 1.6.3-32 +- rebuild for python 2.3 + +* Mon Oct 27 2003 Jeremy Katz 1.6.3-31 +- add patch from Michael Schwendt for segfault + +* Wed Sep 17 2003 Jeremy Katz 1.6.3-30 +- rebuild + +* Wed Sep 17 2003 Jeremy Katz 1.6.3-29 +- and don't barf on the old (broken) 1.02 gpt rev + +* Tue Sep 16 2003 Jeremy Katz 1.6.3-28 +- rebuild + +* Tue Sep 16 2003 Jeremy Katz 1.6.3-27 +- write out the correct gpt revision (#103664) +- add buildrequires on ncurses-devel + +* Thu Sep 4 2003 Bill Nottingham 1.6.3-26 +- rebuild + +* Thu Sep 4 2003 Bill Nottingham 1.6.3-25 +- don't buildreq libunicode-devel + +* Thu Aug 07 2003 Elliot Lee 1.6.3-24 +- Fix libtool + +* Wed Jul 09 2003 Phil Knirsch 1.6.3-23 +- Fixed dasd_write and dasd_read to support lvm and raid partitions. + +* Wed Jun 18 2003 Phil Knirsch 1.6.3-22 +- Fixed a small bug in VTOC fdasd_check_volume() (#97300). + +* Wed Jun 04 2003 Elliot Lee 1.6.3-21 +- rebuilt + +* Wed Jun 4 2003 Matt Wilson 1.6.3-20 +- don't detect AIX physical volumes as msdos partition tables (#91748) +- added stubbed code for manipulating AIX PVs, enough to clobber the + signature. (#91748) + +* Wed Jun 04 2003 Phil Knirsch 1.6.3-19 +- Added LDL disk layout support for s390(x). + +* Sun May 18 2003 Matt Wilson 1.6.3-18 +- use metadata partitions to protect DASD VTOC +- stash DASD specific data in disk specific areas, not arch specific + areas. + +* Fri May 16 2003 Matt Wilson 1.6.3-18 +- recongnize iseries viodasd (#90449) + +* Thu May 08 2003 Phil Knirsch 1.6.3-17 +- Fixed problem with probing partitions on s390(x) with new partition code. + +* Mon May 05 2003 Phil Knirsch 1.6.3-16 +- Fixed partiton reread code for s390(x). + +* Fri May 02 2003 Phil Knirsch 1.6.3-15 +- Rewrote partition handling for s390(x) dasd devices. No more empty partitions. + +* Wed Mar 12 2003 Phil Knirsch 1.6.3-13 +- Finished updating vtoc and fdasd code to latest s390-utils version. + +* Thu Mar 06 2003 Phil Knirsch 1.6.3-12 +- Fixed vtoc handling on s390(x) dasd devices. + +* Thu Feb 06 2003 Karsten Hopp 1.6.3-11 +- use different define to enable DASD debugging + Otherwise we'll get a lot of dasd debug output because DEBUG is + always defined + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Wed Jan 22 2003 Karsten Hopp 1.6.3-9 +- missed one debug message + +* Tue Jan 21 2003 Karsten Hopp 1.6.3-8 +- add patch from CVS to disable debug messages on s390 + +* Tue Jan 14 2003 Matt Wilson 1.6.3-7 +- updated to a new tarball of parted that includes a fs.probe_specific binding + +* Sun Dec 1 2002 Matt Wilson 1.6.3-6 +- hack in partition.native_type (#78118) + +* Thu Nov 7 2002 Matt Wilson +- added a patch to avoid SIGFPE when fat sector size is 0 + +* Tue Nov 5 2002 Matt Wilson +- use --disable-dynamic-loading + +* Mon Nov 4 2002 Matt Wilson +- add device.disk_new_fresh() + +* Fri Nov 1 2002 Matt Wilson +- 1.6.3 + +* Fri Oct 4 2002 Jeremy Katz 1.4.24-7 +- use make LIBTOOL=/usr/bin/libtool instead of recreating everything +- add patch from Jack Howarth to self host properly +- add patch to treat GPT structs as little-endian always and treat GUIDS + as little-endian blobs +- add patch to recognize hp service partitions + +* Wed Sep 25 2002 Jeremy Katz 1.4.24-6hammer +- libtoolize, etc for x86_64 +- hack to get the python module in the right place until python.m4 + from automake is fixed + +* Fri Jun 21 2002 Tim Powers 1.4.24-6 +- automated rebuild + +* Sun May 26 2002 Tim Powers 1.4.24-5 +- automated rebuild + +* Wed May 22 2002 Jeremy Katz 1.4.24-4 +- rebuild in new environment + +* Fri Mar 22 2002 Matt Wilson 1.4.24-3 +- fixed the probe-with-open behavior (again) + +* Fri Feb 22 2002 Matt Wilson 1.4.24-1 +- rebuild + +* Tue Feb 12 2002 Matt Wilson 1.4.24-1 +- 1.4.24 + +* Wed Jan 09 2002 Tim Powers +- automated rebuild + +* Mon Jan 7 2002 Jeremy Katz 1.4.20-4 +- build with final python 2.2 + +* Wed Dec 12 2001 Jeremy Katz 1.4.20-3 +- update from CVS and rebuild in new environment + +* Thu Oct 25 2001 Jeremy Katz 1.4.20-2 +- build both python1.5 and python2 modules + +* Fri Oct 19 2001 Matt Wilson 1.4.20-1 +- 1.4.20 final + +* Thu Oct 11 2001 Matt Wilson 1.4.20-0.1pre3 +- new dist from CVS with new autoconf and automake +- gpt is in 1.4.20, removed patch1 (gpt support) +- partstatic is in 1.4.20, removed patch2 (partstatic patch) + +* Tue Aug 28 2001 Matt Wilson 1.4.16-8 +- new dist from cvs with changes to the python binding: register + DEVICE_I20 and DEVICE_ATARAID, check to make sure that a partition + exists in the PedDisk when using it to find ped_disk_next_partition + +* Tue Aug 21 2001 Matt Wilson 1.4.16-7 +- really disable pc98 support (SF #51632) + +* Fri Aug 17 2001 Matt Wilson 1.4.16-6 +- added a patch (Patch1) to link the c library in dynamically, the + rest of the libs statically for the parted binary (MF #49358) + +* Tue Aug 7 2001 Matt Wilson +- made a new dist from CVS that includes binding for + disk.get_partition_by_sector and accessing the name of a disk type + +* Mon Aug 6 2001 Matt Wilson 1.4.16-4 +- created a new dist from CVS that fixes ext3 detection when + _probe_with_open is needed (#50292) + +* Fri Jul 20 2001 Matt Wilson +- rewrite scsi id code (#49533) + +* Fri Jul 20 2001 Matt Wilson +- added build requires (#49549) + +* Tue Jul 17 2001 Matt Wilson +- 1.4.16 +- regenerated gpt patch against 1.4.16, incorporated + parted-1.4.15-pre1-gpt-printf.patch into the same patch, removed Patch1 + +* Tue Jul 10 2001 Matt Wilson +- added a new dist tarball that contains python wrappers to get disk types + +* Tue Jul 10 2001 Tim Powers +- run ldconfig on un/install + +* Tue Jul 10 2001 Matt Wilson +- added a fix from clausen for border case when there is an extended + on the last cyl + +* Mon Jul 9 2001 Matt Wilson +- 1.4.15 + +* Thu Jul 5 2001 Matt Wilson +- added patch from Arjan to enable ataraid support + +* Wed Jul 4 2001 Matt Wilson +- imported 1.4.15-pre2 into CVS and made a new dist tarball + +* Tue Jun 26 2001 Matt Wilson +- added a new dist tarball that contains a check in python code to + make sure that a partition exists within a disk before trying to + remove it from the disk +- also changed _probe_with_open to make the first probed filesystem win + +* Tue Jun 26 2001 Bill Nottingham +- fix filesystem type reading on GPT disks + +* Tue Jun 26 2001 Matt Wilson +- added another fix for ext2/ext3 +- added Patch4 to move the crc32 function into its own namespace so + we don't colide with zlib when both are in the same executable space + +* Mon Jun 25 2001 Matt Wilson +- added a new dist tarball from CVS that includes + ext3 probing + +* Wed Jun 6 2001 Matt Wilson +- updated dist with binding for partition.geom.disk + +* Tue Jun 5 2001 Matt Wilson +- make a new dist tarball that has new python binding changes + +* Tue May 29 2001 Bill Nottingham +- add major numbers for cciss +- add libunicode-devel buildprereq + +* Sun May 27 2001 Matthew Wilson +- added type, heads, and sectors to the python binding for PedDevice + +* Fri May 4 2001 Matt Wilson +- added parted-1.4.11-gpt-pmbralign.patch from Matt Domsch + +* Wed May 2 2001 Matt Wilson +- include python binding +- enable shared library (for python binding, we want fpic code) + with --enable-shared +- build parted binary static with --enable-all-static +- don't run libtoolize on this. + +* Wed May 02 2001 Bill Nottingham +- update to 1.4.11 +- add EFI GPT patch from Matt Domsch () +- don't run autoconf, it relies on a newer non-released version + of autoconf... + +* Fri Feb 23 2001 Trond Eivind Glomsrød +- langify + +* Wed Jan 17 2001 Florian La Roche +- update to 1.4.7 + +* Thu Dec 14 2000 Bill Nottingham +- rebuild because of broken fileutils + +* Fri Nov 03 2000 Florian La Roche +- update to 1.2.12 + +* Wed Nov 01 2000 Florian La Roche +- update to 1.2.11 + +* Tue Oct 17 2000 Florian La Roche +- update to 1.2.10 + +* Sun Sep 10 2000 Florian La Roche +- update to 1.2.9 + +* Tue Aug 29 2000 Florian La Roche +- fix bug when just hitting "return" with no user input + +* Sun Aug 20 2000 Florian La Roche +- 1.2.8 +- blksize patch not needed anymore +- move changelog to the end of the spec file + +* Wed Aug 16 2000 Matt Wilson +- 1.2.7 +- patched configure script to ignore the 2.4 blkpg.h header (fixes #15835). + +* Fri Aug 4 2000 Florian La Roche +- update to 1.2.6 + +* Sat Jul 22 2000 Florian La Roche +- update to 1.2.5 +- add more docu + +* Wed Jul 12 2000 Prospector +- automatic rebuild + +* Mon Jun 12 2000 Matt Wilson +- initialization of spec file.