[Parted-commits] GNU Parted Official Repository: Changes to 'master'

Jim Meyering meyering at alioth.debian.org
Thu Feb 2 16:54:22 UTC 2012


 NEWS                                              |   17 +++
 doc/parted.texi                                   |   31 ++++++
 include/parted/disk.in.h                          |    4 
 libparted/disk.c                                  |    3 
 libparted/labels/gpt.c                            |   60 +++++++++++-
 parted/parted.c                                   |  110 +++++++++++++++++++++-
 parted/ui.c                                       |   29 +++++
 parted/ui.h                                       |    3 
 tests/Makefile.am                                 |    1 
 tests/t0010-script-no-ctrl-chars.sh               |    2 
 tests/t0100-print.sh                              |    6 -
 tests/t0101-print-empty.sh                        |    2 
 tests/t0203-gpt-shortened-device-primary-valid.sh |    2 
 tests/t0209-gpt-pmbr_boot.sh                      |   38 +++++++
 tests/t0210-gpt-resized-partition-entry-array.sh  |    2 
 tests/t0211-gpt-rewrite-header.sh                 |    2 
 tests/t0212-gpt-many-partitions.sh                |    2 
 tests/t0220-gpt-msftres.sh                        |    2 
 tests/t0250-gpt.sh                                |    2 
 tests/t0280-gpt-corrupt.sh                        |    4 
 tests/t2310-dos-extended-2-sector-min-offset.sh   |    2 
 tests/t4000-sun-raid-type.sh                      |    2 
 tests/t4100-dvh-partition-limits.sh               |    6 -
 tests/t4100-msdos-partition-limits.sh             |    6 -
 tests/t4100-msdos-starting-sector.sh              |    4 
 tests/t4200-partprobe.sh                          |    2 
 tests/t5000-tags.sh                               |    6 -
 tests/t6000-dm.sh                                 |    5 -
 tests/t9040-many-partitions.sh                    |    2 
 tests/t9041-undetected-in-use-16th-partition.sh   |    2 
 tests/t9042-dos-partition-limit.sh                |    2 
 31 files changed, 327 insertions(+), 34 deletions(-)

New commits:
commit c56edfb7b98593282dc1db1c3912616a470257b2
Author: Brian C. Lane <bcl at redhat.com>
Date:   Wed Feb 1 13:12:00 2012 -0800

    doc: update parted documentation
    
    * doc/parted.text: Add disk_set command.

diff --git a/doc/parted.texi b/doc/parted.texi
index e866b44..6561d0e 100644
--- a/doc/parted.texi
+++ b/doc/parted.texi
@@ -415,6 +415,7 @@ GNU Parted provides the following commands:
 
 @menu
 * align-check::
+* disk_set::
 * help::
 * mklabel::
 * mkpart::
@@ -458,6 +459,36 @@ Example:
 
 @end deffn
 
+ at node disk_set
+ at subsection disk_set
+ at cindex disk_set, command description
+ at cindex command description, disk_set
+
+ at deffn Command disk_set @var{flag} @var{state}
+
+Changes a flag on the disk.  A flag can be either ``on'' or ``off''.
+Some or all of these flags will be available, depending on what disk
+label you are using:
+
+ at table @samp
+
+ at item pmbr_boot
+(GPT) - this flag enables the boot flag on the GPT's protective MBR
+partition.
+
+ at end table
+
+The disk's flags are displayed by the print command on the "Disk Flags:"
+line.  They are also output as the last field of the disk information
+in machine mode.
+
+ at example
+(parted) @kbd{disk_set pmbr_boot on}
+ at end example
+
+Set the PMBR's boot flag.
+ at end deffn
+
 @node help
 @subsection help
 @cindex help, command description

commit 103ef008a504a2397ce1c91f5f1b75f6d3abdf85
Author: Brian C. Lane <bcl at redhat.com>
Date:   Wed Feb 1 13:11:59 2012 -0800

    tests: add test for GPT PMBR pmbr_boot flag
    
    * tests/t0209-gpt-pmbr_boot.sh: New test
    * tests/Makefile.am: Add new test
    * NEWS: Add information about the GPT PMBR pmbr_boot flag

diff --git a/NEWS b/NEWS
index 484034b..0bfcf6a 100644
--- a/NEWS
+++ b/NEWS
@@ -79,6 +79,23 @@ GNU parted NEWS                                    -*- outline -*-
   this patch, parted and dmraid will both create duplicate partition devices
   named /dev/mapper/foo1 and /dev/mapper/foop1.
 
+  Add the ability to set the boot flag on the GPT PMBR. This is needed
+  for some BIOS systems that refuse to boot from GPT unless this is set.
+  disk_set and disk_toggle commands can be used to set the pmbr_boot
+  flag on the disk.
+
+  The flag is also displayed in a new line, 'Disk Flags:' like this:
+
+    Model:  (file)
+    Disk /home/bcl/disk.img: 4295MB
+    Sector size (logical/physical): 512B/512B
+    Partition Table: gpt
+    Disk Flags: pmbr_boot
+
+  Using -m the flags are added after the model name field:
+
+    /root/disk.img:4295MB:file:512:512:gpt::pmbr_boot;
+
 ** Build-related
 
   "make dist" no longer builds .tar.gz files.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 17486e2..a7a1633 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -20,6 +20,7 @@ TESTS = \
   t0206-gpt-print-with-corrupt-primary-clobbers-pmbr.sh \
   t0207-IEC-binary-notation.sh \
   t0208-mkpart-end-in-IEC.sh \
+  t0209-gpt-pmbr_boot.sh \
   t0210-gpt-resized-partition-entry-array.sh \
   t0211-gpt-rewrite-header.sh \
   t0212-gpt-many-partitions.sh \
diff --git a/tests/t0209-gpt-pmbr_boot.sh b/tests/t0209-gpt-pmbr_boot.sh
new file mode 100755
index 0000000..b15cc9c
--- /dev/null
+++ b/tests/t0209-gpt-pmbr_boot.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+# Ensure that pmbr_boot flag can be set
+
+# 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 <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ../parted
+
+N=2M
+dev=loop-file
+# create a file large enough to hold a GPT partition table
+dd if=/dev/null of=$dev bs=1 seek=$N || framework_failure
+
+# create a GPT partition table
+parted -s $dev mklabel gpt > out 2>&1 || fail=1
+# expect no output
+compare out /dev/null || fail=1
+
+# Set the pmbr_boot flag on the PMBR
+parted -s $dev disk_set pmbr_boot on
+
+# Check to see if the flag is set
+parted -m -s $dev u s p > out 2> err || fail=1
+grep "$dev:.*:gpt::pmbr_boot;" out || { cat out; fail=1; }
+
+Exit $fail

commit 489d85a5c610b961e772278b750dca523216768d
Author: Brian C. Lane <bcl at redhat.com>
Date:   Wed Feb 1 13:11:58 2012 -0800

    tests: update tests for new disk flags output
    
    * tests/t0010-script-no-ctrl-chars.sh: Updated
    * tests/t0100-print.sh: Updated
    * tests/t0101-print-empty.sh: Updated
    * tests/t0220-gpt-msftres.sh: Updated
    * tests/t0250-gpt.sh: Updated
    * tests/t0280-gpt-corrupt.sh: Updated
    * tests/t2310-dos-extended-2-sector-min-offset.sh: Updated
    * tests/t4000-sun-raid-type.sh: Updated
    * tests/t4100-dvh-partition-limits.sh: Updated
    * tests/t4100-msdos-partition-limits.sh: Updated
    * tests/t4100-msdos-starting-sector.sh: Updated
    * tests/t4200-partprobe.sh: Updated
    * tests/t5000-tags.sh: Updated
    * tests/t6000-dm.sh: Updated
    * tests/t9040-many-partitions.sh: Updated
    * tests/t9041-undetected-in-use-16th-partition.sh: Updated

diff --git a/tests/t0010-script-no-ctrl-chars.sh b/tests/t0010-script-no-ctrl-chars.sh
index a717225..7ee43a1 100755
--- a/tests/t0010-script-no-ctrl-chars.sh
+++ b/tests/t0010-script-no-ctrl-chars.sh
@@ -32,7 +32,7 @@ compare /dev/null out || fail=1
 TERM=xterm parted -m -s $dev u s p > out 2>&1 || fail=1
 
 sed "s,.*/$dev:,$dev:," out > k && mv k out || fail=1
-printf "BYT;\n$dev:${n_sectors}s:file:$ss:$ss:msdos:;\n" > exp || fail=1
+printf "BYT;\n$dev:${n_sectors}s:file:$ss:$ss:msdos::;\n" > exp || fail=1
 
 compare exp out || fail=1
 
diff --git a/tests/t0100-print.sh b/tests/t0100-print.sh
index a951995..41d4060 100755
--- a/tests/t0100-print.sh
+++ b/tests/t0100-print.sh
@@ -27,6 +27,7 @@ Model:  (file)
 Disk .../$dev: 8s
 Sector size (logical/physical): ${ss}B/${ss}B
 Partition Table: msdos
+Disk Flags:
 
 Number  Start  End  Size  Type  File system  Flags
 
@@ -46,10 +47,11 @@ msdos_magic='\125\252'
 { dd if=/dev/zero  bs=510 count=1; printf "$msdos_magic"
   dd if=/dev/zero bs=$(expr 8 '*' $ss - 510) count=1; } > $dev || fail=1
 
-# print the empty table' \
+# print the empty table
 parted -s $dev unit s print >out 2>&1 || fail=1
 
-# prepare actual and expected output' \
+# prepare actual and expected output
+sed 's/ $//' out > k && mv k out || fail=1 # Remove trailing blank.
 mv out o2 && sed "s,^Disk .*/$dev:,Disk .../$dev:," o2 > out || fail=1
 
 # check for expected output
diff --git a/tests/t0101-print-empty.sh b/tests/t0101-print-empty.sh
index cdd0b10..7833a6d 100755
--- a/tests/t0101-print-empty.sh
+++ b/tests/t0101-print-empty.sh
@@ -28,6 +28,7 @@ Model:  (file)
 Disk .../$dev: 8s
 Sector size (logical/physical): ${ss}B/${ss}B
 Partition Table: unknown
+Disk Flags:
 EOF
 } > exp || framework_failure
 
@@ -38,6 +39,7 @@ dd if=/dev/zero of=$dev bs=$(expr 8 '*' $ss) count=1 >/dev/null 2>&1 || fail=1
 parted -s $dev unit s print >out 2>&1 && fail=1
 
 # prepare actual and expected output
+sed 's/ $//' out > k && mv k out || fail=1 # Remove trailing blank.
 mv out o2 && sed "s,^Disk .*/$dev:,Disk .../$dev:,; \
                   s,^Error: .*/$dev:,Error: .../$dev:," o2 > out || fail=1
 
diff --git a/tests/t0203-gpt-shortened-device-primary-valid.sh b/tests/t0203-gpt-shortened-device-primary-valid.sh
index 27f2c5f..f59d869 100755
--- a/tests/t0203-gpt-shortened-device-primary-valid.sh
+++ b/tests/t0203-gpt-shortened-device-primary-valid.sh
@@ -41,7 +41,7 @@ Error: end of file while reading $dev
 Error: The backup GPT table is corrupt, but the primary appears OK, so that will be used.
 EOF
 
-echo "$dev:98s:file:$ss:$ss:gpt:;" > out.exp || fail=1
+echo "$dev:98s:file:$ss:$ss:gpt::;" > out.exp || fail=1
 
 compare err.exp err || fail=1
 compare out.exp out || fail=1
diff --git a/tests/t0210-gpt-resized-partition-entry-array.sh b/tests/t0210-gpt-resized-partition-entry-array.sh
index fd373b4..29efa16 100755
--- a/tests/t0210-gpt-resized-partition-entry-array.sh
+++ b/tests/t0210-gpt-resized-partition-entry-array.sh
@@ -35,7 +35,7 @@ gpt-header-munge --sector-size=$ss --n=9 $dev || fail=1
 
 parted -m -s $dev u s p > out 2>&1 || fail=1
 sed 's/.*:gpt:/:gpt:/' out > k && mv k out
-printf 'BYT;\n:gpt:;\n' > exp || fail=1
+printf 'BYT;\n:gpt::;\n' > exp || fail=1
 compare exp out || fail=1
 
 Exit $fail
diff --git a/tests/t0211-gpt-rewrite-header.sh b/tests/t0211-gpt-rewrite-header.sh
index 475c3db..cfc9de6 100644
--- a/tests/t0211-gpt-rewrite-header.sh
+++ b/tests/t0211-gpt-rewrite-header.sh
@@ -59,7 +59,7 @@ parted ---pretend-input-tty $dev u s p < in || fail=1
 
 printf '%s\n' \
     'BYT;' \
-    "...:${ns2}s:file:$ss:$ss:gpt:;" \
+    "...:${ns2}s:file:$ss:$ss:gpt::;" \
     '1:34s:34s:1s::p1:;' \
     '2:35s:35s:1s::p2:;' \
     '3:36s:36s:1s::p3:;' \
diff --git a/tests/t0212-gpt-many-partitions.sh b/tests/t0212-gpt-many-partitions.sh
index d0fc72e..cf0a45d 100644
--- a/tests/t0212-gpt-many-partitions.sh
+++ b/tests/t0212-gpt-many-partitions.sh
@@ -40,7 +40,7 @@ parted -m -a min -s $dev mklabel gpt $cmd u s p > out 2>&1 || fail=1
 
 nl='
 '
-exp=$(printf '%s\n' 'BYT;' "...:${ns}s:file:$ss:$ss:gpt:;")"$nl"
+exp=$(printf '%s\n' 'BYT;' "...:${ns}s:file:$ss:$ss:gpt::;")"$nl"
 
 i=1
 while :; do
diff --git a/tests/t0220-gpt-msftres.sh b/tests/t0220-gpt-msftres.sh
index 8bfa17c..d522aec 100755
--- a/tests/t0220-gpt-msftres.sh
+++ b/tests/t0220-gpt-msftres.sh
@@ -52,7 +52,7 @@ parted -s $dev mklabel gpt > out 2>&1 || fail=1
 # expect no output
 compare /dev/null out || fail=1
 
-printf "BYT;\n$dev:${n_sectors}s:file:$ss:$ss:gpt:;\n" > exp
+printf "BYT;\n$dev:${n_sectors}s:file:$ss:$ss:gpt::;\n" > exp
 i=1
 for type in $fs_types; do
   end=$(expr $start + $part_size - 1)
diff --git a/tests/t0250-gpt.sh b/tests/t0250-gpt.sh
index 07dac1f..2ab0b69 100755
--- a/tests/t0250-gpt.sh
+++ b/tests/t0250-gpt.sh
@@ -35,7 +35,7 @@ parted -m -s $dev unit s print > t 2>&1 || fail=1
 sed "s,.*/$dev:,$dev:," t > out || fail=1
 
 # check for expected output
-printf "BYT;\n$dev:${n_sectors}s:file:$sector_size_:$sector_size_:gpt:;\n" \
+printf "BYT;\n$dev:${n_sectors}s:file:$sector_size_:$sector_size_:gpt::;\n" \
   > exp || fail=1
 compare exp out || fail=1
 
diff --git a/tests/t0280-gpt-corrupt.sh b/tests/t0280-gpt-corrupt.sh
index 978d4a0..f646a68 100755
--- a/tests/t0280-gpt-corrupt.sh
+++ b/tests/t0280-gpt-corrupt.sh
@@ -34,7 +34,7 @@ parted -m -s $dev unit s print > t 2>&1 || fail=1
 sed "s,.*/$dev:,$dev:," t > out || fail=1
 
 # check for expected output
-printf "BYT;\n$dev:${n_sectors}s:file:$sector_size_:$sector_size_:gpt:;\n" \
+printf "BYT;\n$dev:${n_sectors}s:file:$sector_size_:$sector_size_:gpt::;\n" \
   > exp || fail=1
 compare exp out || fail=1
 
@@ -90,7 +90,7 @@ parted -m -s $dev u s print > out 2>&1 || fail=1
 
 # check for expected output
 printf "BYT;\nfile\n1:2048s:4095s:2048s::foo:;\n" > exp || fail=1
-sed "s/.*gpt:;/file/" out > k && mv k out || fail=1
+sed "s/.*gpt::;/file/" out > k && mv k out || fail=1
 compare exp out || fail=1
 
 Exit $fail
diff --git a/tests/t2310-dos-extended-2-sector-min-offset.sh b/tests/t2310-dos-extended-2-sector-min-offset.sh
index 5ae8611..89453ae 100644
--- a/tests/t2310-dos-extended-2-sector-min-offset.sh
+++ b/tests/t2310-dos-extended-2-sector-min-offset.sh
@@ -33,7 +33,7 @@ p5=${scsi_dev}5
 
 cat <<EOF > exp || framework_failure
 BYT;
-$scsi_dev:2048s:scsi:512:512:msdos:Linux scsi_debug;
+$scsi_dev:2048s:scsi:512:512:msdos:Linux scsi_debug:;
 1:64s:128s:65s:::lba;
 5:66s:128s:63s:::;
 EOF
diff --git a/tests/t4000-sun-raid-type.sh b/tests/t4000-sun-raid-type.sh
index 84106bf..a38000f 100755
--- a/tests/t4000-sun-raid-type.sh
+++ b/tests/t4000-sun-raid-type.sh
@@ -24,7 +24,7 @@ ss=$sector_size_
 
 N=2000 # number of sectors
 dev=sun-disk-file
-exp="BYT;\n---:${N}s:file:$ss:$ss:sun:;\n1:0s:127s:128s"
+exp="BYT;\n---:${N}s:file:$ss:$ss:sun::;\n1:0s:127s:128s"
 # create an empty file as a test disk
 dd if=/dev/zero of=$dev bs=${ss}c count=$N 2> /dev/null || fail=1
 
diff --git a/tests/t4100-dvh-partition-limits.sh b/tests/t4100-dvh-partition-limits.sh
index 25ef5e3..d885502 100755
--- a/tests/t4100-dvh-partition-limits.sh
+++ b/tests/t4100-dvh-partition-limits.sh
@@ -129,9 +129,10 @@ do_mkpart_start_and_len $(echo 2^32-1|bc) 1000 || fail=1
 # FIXME: In the long run, figure out if it's sensible.
 cat > exp <<EOF
 Model:  (file)
-Disk: 4294970342s
+Disk $dev: 4294970342s
 Sector size (logical/physical): ${ss}B/${ss}B
 Partition Table: $table_type
+Disk Flags:
 
 Number  Start        End          Size   Type      File system  Name  Flags
  9      0s           4095s        4096s  extended
@@ -141,7 +142,8 @@ EOF
 
 # print the result
 parted -s $dev unit s p > out 2>&1 || fail=1
-sed "s/Disk .*:/Disk:/;s/ *$//" out > k && mv k out || fail=1
+sed "s/^Disk .*\($dev: [0-9][0-9]*s\)$/Disk \1/;s/ *$//" out > k \
+    && mv k out || fail=1
 compare exp out || fail=1
 
 # a partition start sector number of 2^32 must fail
diff --git a/tests/t4100-msdos-partition-limits.sh b/tests/t4100-msdos-partition-limits.sh
index 49da864..ec1854f 100755
--- a/tests/t4100-msdos-partition-limits.sh
+++ b/tests/t4100-msdos-partition-limits.sh
@@ -116,9 +116,10 @@ do_mkpart_start_and_len $(echo 2^32-1|bc) 1000 || fail=1
 
 cat > exp <<EOF
 Model:  (file)
-Disk: 4294970342s
+Disk $dev: 4294970342s
 Sector size (logical/physical): ${ss}B/${ss}B
 Partition Table: $table_type
+Disk Flags:
 
 Number  Start        End          Size   Type     File system  Flags
  1      4294967295s  4294968294s  1000s  primary
@@ -127,7 +128,8 @@ EOF
 
 # print the result
 parted -s $dev unit s p > out 2>&1 || fail=1
-sed "s/Disk .*:/Disk:/;s/ *$//" out > k && mv k out  || fail=1
+sed "s/^Disk .*\($dev: [0-9][0-9]*s\)$/Disk \1/;s/ *$//" out > k \
+    && mv k out || fail=1
 compare exp out || fail=1
 
 # a partition start sector number of 2^32 must fail
diff --git a/tests/t4100-msdos-starting-sector.sh b/tests/t4100-msdos-starting-sector.sh
index 1a99611..d4facfe 100755
--- a/tests/t4100-msdos-starting-sector.sh
+++ b/tests/t4100-msdos-starting-sector.sh
@@ -38,7 +38,7 @@ compare /dev/null out || fail=1
 # Test the output of print free with no partitions.
 cat <<EOF > exp || fail=1
 BYT;
-path:${N}s:file:$ss:$ss:msdos:;
+path:${N}s:file:$ss:$ss:msdos::;
 1:32s:4095s:4064s:free;
 EOF
 
@@ -54,7 +54,7 @@ compare exp out || fail=1
 # Test the output of print free with one partition.
 cat <<EOF > exp || fail=1
 BYT;
-path:${N}s:file:$ss:$ss:msdos:;
+path:${N}s:file:$ss:$ss:msdos::;
 1:32s:2047s:2016s:free;
 1:2048s:4095s:2048s:::;
 EOF
diff --git a/tests/t4200-partprobe.sh b/tests/t4200-partprobe.sh
index 5407f9e..26f0e7e 100755
--- a/tests/t4200-partprobe.sh
+++ b/tests/t4200-partprobe.sh
@@ -33,7 +33,7 @@ dvhtool -d $dev --unix-to-vh d data || fail=1
 
 # Here's sample output from the parted...print command below:
 # BYT;
-# /dev/sdd:128880s:scsi:512:512:dvh: Flash Disk;
+# /dev/sdd:128880s:scsi:512:512:dvh: Flash Disk:;
 # 9:0s:4095s:4096s:::;
 # 17:4s:11s:8s::data:;
 
diff --git a/tests/t5000-tags.sh b/tests/t5000-tags.sh
index baba4de..a5e49a1 100755
--- a/tests/t5000-tags.sh
+++ b/tests/t5000-tags.sh
@@ -44,7 +44,7 @@ parted -m -s $dev unit s print > t 2>&1 || fail=1
 sed "s,.*/$dev:,$dev:," t > out || fail=1
 
 # check for expected output
-printf "BYT;\n$dev:${N}s:file:$ss:$ss:gpt:;\n" > exp || fail=1
+printf "BYT;\n$dev:${N}s:file:$ss:$ss:gpt::;\n" > exp || fail=1
 compare exp out || fail=1
 
 # add a partition
@@ -66,10 +66,10 @@ gen_exp()
 {
   cat <<EOF
 BYT;
-$dev:${N}s:file:$ss:$ss:gpt:;
+$dev:${N}s:file:$ss:$ss:gpt::;
 1:${start_sector}s:${end_sector}s:${part_sectors}s::name1:;
 BYT;
-$dev:${N}s:file:$ss:$ss:gpt:;
+$dev:${N}s:file:$ss:$ss:gpt::;
 1:${start_sector}s:${end_sector}s:${part_sectors}s::name1:bios_grub;
 EOF
 }
diff --git a/tests/t6000-dm.sh b/tests/t6000-dm.sh
index 76242f6..8ba0c3e 100755
--- a/tests/t6000-dm.sh
+++ b/tests/t6000-dm.sh
@@ -72,14 +72,15 @@ for type in linear ; do
   compare /dev/null out || fail=1
 
   parted -s "$dev" print > out 2>&1 || fail=1
-  sed 's/^Disk .*: /Disk DEV: /' out > k; mv k out
+  sed 's/ $//' out > k && mv k out || fail=1 # Remove trailing blank.
 
   # Create expected output file.
   cat <<EOF >> exp || fail=1
 Model: Linux device-mapper ($type) (dm)
-Disk DEV: 524kB
+Disk $dev: 524kB
 Sector size (logical/physical): 512B/512B
 Partition Table: msdos
+Disk Flags:
 
 Number  Start  End  Size  Type  File system  Flags
 
diff --git a/tests/t9040-many-partitions.sh b/tests/t9040-many-partitions.sh
index db065f4..8949310 100644
--- a/tests/t9040-many-partitions.sh
+++ b/tests/t9040-many-partitions.sh
@@ -40,7 +40,7 @@ scsi_debug_setup_ sector_size=$ss dev_size_mb=$n_MiB > dev-name ||
 scsi_dev=$(cat dev-name)
 
 n=$((n_MiB * sectors_per_MiB))
-printf "BYT;\n$scsi_dev:${n}s:scsi:$ss:$ss:gpt:Linux scsi_debug;\n" \
+printf "BYT;\n$scsi_dev:${n}s:scsi:$ss:$ss:gpt:Linux scsi_debug:;\n" \
   > exp || fail=1
 
 cmd=
diff --git a/tests/t9041-undetected-in-use-16th-partition.sh b/tests/t9041-undetected-in-use-16th-partition.sh
index 08baf35..6ddc7d8 100644
--- a/tests/t9041-undetected-in-use-16th-partition.sh
+++ b/tests/t9041-undetected-in-use-16th-partition.sh
@@ -40,7 +40,7 @@ scsi_debug_setup_ sector_size=$ss dev_size_mb=$n_MiB > dev-name ||
 scsi_dev=$(cat dev-name)
 
 n=$((n_MiB * sectors_per_MiB))
-printf "BYT;\n$scsi_dev:${n}s:scsi:$ss:$ss:gpt:Linux scsi_debug;\n" \
+printf "BYT;\n$scsi_dev:${n}s:scsi:$ss:$ss:gpt:Linux scsi_debug:;\n" \
   > exp || fail=1
 
 parted -s $scsi_dev mklabel gpt || fail=1
diff --git a/tests/t9042-dos-partition-limit.sh b/tests/t9042-dos-partition-limit.sh
index fe783c7..67ea86d 100644
--- a/tests/t9042-dos-partition-limit.sh
+++ b/tests/t9042-dos-partition-limit.sh
@@ -40,7 +40,7 @@ scsi_dev=$(cat dev-name)
 
 n=$((n_MiB * sectors_per_MiB))
 printf '%s\n' "BYT;" \
-    "$scsi_dev:${n}s:scsi:$ss:$ss:msdos:Linux scsi_debug;" \
+    "$scsi_dev:${n}s:scsi:$ss:$ss:msdos:Linux scsi_debug:;" \
     "1:$((start-2))s:$((n-1))s:$((n-start+2))s:::lba;" \
   > exp || fail=1
 

commit c8bfc459ecc6b3809dd17df55918174bfc68c07d
Author: Brian C. Lane <bcl at redhat.com>
Date:   Fri Jan 27 16:59:03 2012 -0800

    parted: when printing, also print the new disk flags
    
    This adds a 'Disk Flags:' line the displays the active disk flags.
    In machine mode this is appended to the disk info line, after the
    device model.
    
    * parted/parted.c (disk_print_flags): New function
    (_print_disk_info): Add Disk Flags information.

diff --git a/parted/parted.c b/parted/parted.c
index eb91835..a1b8c2f 100644
--- a/parted/parted.c
+++ b/parted/parted.c
@@ -900,6 +900,43 @@ partition_print (PedPartition* part)
         return 1;
 }
 
+static char*
+disk_print_flags (PedDisk const *disk)
+{
+        PedDiskFlag     flag;
+        int             first_flag;
+        const char*     name;
+        char*           res = ped_malloc(1);
+        void*           _res = res;
+
+        *res = '\0';
+        if (!disk)
+            return res;
+
+        first_flag = 1;
+        for (flag = ped_disk_flag_next (0); flag;
+             flag = ped_disk_flag_next (flag)) {
+                if (ped_disk_get_flag (disk, flag)) {
+                        if (first_flag)
+                                first_flag = 0;
+                        else {
+                                _res = res;
+                                ped_realloc (&_res, strlen (res) + 1 + 2);
+                                res = _res;
+                                strncat (res, ", ", 2);
+                        }
+
+                        name = _(ped_disk_flag_get_name (flag));
+                        _res = res;
+                        ped_realloc (&_res, strlen (res) + 1 + strlen (name));
+                        res = _res;
+                        strcat(res, name);
+                }
+        }
+
+        return res;
+}
+
 static void
 _print_disk_geometry (const PedDevice *dev)
 {
@@ -937,6 +974,7 @@ _print_disk_info (const PedDevice *dev, const PedDisk *disk)
                                        default_unit == PED_UNIT_CYLINDER));
 
         const char* pt_name = disk ? disk->type->name : "unknown";
+        char *disk_flags = disk_print_flags (disk);
 
         if (opt_machine_mode) {
             switch (default_unit) {
@@ -948,10 +986,10 @@ _print_disk_info (const PedDevice *dev, const PedDisk *disk)
                                         break;
 
             }
-            printf ("%s:%s:%s:%lld:%lld:%s:%s;\n",
+            printf ("%s:%s:%s:%lld:%lld:%s:%s:%s;\n",
                     dev->path, end, transport[dev->type],
                     dev->sector_size, dev->phys_sector_size,
-                    pt_name, dev->model);
+                    pt_name, dev->model, disk_flags);
         } else {
             printf (_("Model: %s (%s)\n"),
                     dev->model, transport[dev->type]);
@@ -969,7 +1007,9 @@ _print_disk_info (const PedDevice *dev, const PedDisk *disk)
 
         if (!opt_machine_mode) {
             printf (_("Partition Table: %s\n"), pt_name);
+            printf (_("Disk Flags: %s\n"), disk_flags);
         }
+        free (disk_flags);
 }
 
 static int

commit a73918ea6d9477ac3e8dad11ed62c87aecc49714
Author: Matthew Garrett <mjg at redhat.com>
Date:   Wed Feb 1 15:12:20 2012 +0100

    gpt: add commands to manipulate pMBR boot flag
    
    Some BIOS systems will only boot from GPT partitions if the boot flag is
    set on the protective MBR partition. This adds the ability to set this
    flag using the disk_set and disk_toggle commands.
    * include/parted/disk.in.h (_PedDiskFlag): Add PED_DISK_GPT_PMBR_BOOT
    * libparted/disk.c (ped_disk_flag_get_name): Add PED_DISK_GPT_PMBR_BOOT
    * libparted/labels/gpt.c (_GPTDiskData): Add pmbr_boot flag.
    (gpt_alloc): Init pmbr_boot to 0.
    (gpt_read_headers): Set pmbr_boot state from PMBR boot flag.
    (_write_pmbr): Add pmbr_boot flag and set PMBR boot flag from it.
    (gpt_write): Pass pmbr_boot flag through to _write_pmbr
    (gpt_disk_set_flag): New function
    (gpt_disk_is_flag_available): New function
    (gpt_disk_get_flag): New function
    (gpt_disk_ops): Add disk_set_flag, disk_get_flag, disk_is_flag_available
    * parted/parted.c (do_disk_set): New function
    (do_disk_toggle): New function
    (_init_commands): Add do_disk_set and do_disk_toggle
    * parted/ui.c (command_line_get_disk_flag): New function
    * parted/ui.h: Add command_line_get_disk_flag prototype.

diff --git a/include/parted/disk.in.h b/include/parted/disk.in.h
index 46bde3f..9734edd 100644
--- a/include/parted/disk.in.h
+++ b/include/parted/disk.in.h
@@ -36,9 +36,11 @@ enum _PedDiskFlag {
            This flag is available for msdos and sun disklabels (for sun labels
            it only controls the aligning of the end of the partition) */
         PED_DISK_CYLINDER_ALIGNMENT=1,
+        /* This flag controls whether the boot flag of a GPT PMBR is set */
+        PED_DISK_GPT_PMBR_BOOT=2,
 };
 #define PED_DISK_FIRST_FLAG             PED_DISK_CYLINDER_ALIGNMENT
-#define PED_DISK_LAST_FLAG              PED_DISK_CYLINDER_ALIGNMENT
+#define PED_DISK_LAST_FLAG              PED_DISK_GPT_PMBR_BOOT
 
 /**
  * Partition types
diff --git a/libparted/disk.c b/libparted/disk.c
index f64f0fc..f9b5fd2 100644
--- a/libparted/disk.c
+++ b/libparted/disk.c
@@ -836,7 +836,8 @@ ped_disk_flag_get_name(PedDiskFlag flag)
         switch (flag) {
         case PED_DISK_CYLINDER_ALIGNMENT:
                 return N_("cylinder_alignment");
-
+        case PED_DISK_GPT_PMBR_BOOT:
+                return N_("pmbr_boot");
         default:
                 ped_exception_throw (
                         PED_EXCEPTION_BUG,
diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
index bad9ed4..4a5d357 100644
--- a/libparted/labels/gpt.c
+++ b/libparted/labels/gpt.c
@@ -264,6 +264,7 @@ struct __attribute__ ((packed)) _GPTDiskData
   PedGeometry data_area;
   int entry_count;
   efi_guid_t uuid;
+  int pmbr_boot;
 };
 
 /* uses libparted's disk_specific field in PedPartition, to store our info */
@@ -535,6 +536,7 @@ gpt_alloc (const PedDevice *dev)
   gpt_disk_data->entry_count = GPT_DEFAULT_PARTITION_ENTRIES;
   uuid_generate ((unsigned char *) &gpt_disk_data->uuid);
   swap_uuid_and_efi_guid ((unsigned char *) (&gpt_disk_data->uuid));
+  gpt_disk_data->pmbr_boot = 0;
   return disk;
 
 error_free_disk:
@@ -842,6 +844,15 @@ gpt_read_headers (PedDisk const *disk,
   *primary_gpt = NULL;
   *backup_gpt = NULL;
   PedDevice const *dev = disk->dev;
+  GPTDiskData *gpt_disk_data = disk->disk_specific;
+  LegacyMBR_t *mbr;
+
+  if (!ptt_read_sector (dev, 0, (void *)&mbr))
+    return 1;
+
+  if (mbr->PartitionRecord[0].BootIndicator == 0x80)
+    gpt_disk_data->pmbr_boot = 1;
+  free (mbr);
 
   void *s1;
   if (!ptt_read_sector (dev, 1, &s1))
@@ -1079,7 +1090,7 @@ error:
 #ifndef DISCOVER_ONLY
 /* Write the protective MBR (to keep DOS happy) */
 static int
-_write_pmbr (PedDevice *dev)
+_write_pmbr (PedDevice *dev, bool pmbr_boot)
 {
   /* The UEFI spec is not clear about what to do with the following
      elements of the Protective MBR (pmbr): BootCode (0-440B),
@@ -1104,6 +1115,8 @@ _write_pmbr (PedDevice *dev)
     pmbr->PartitionRecord[0].SizeInLBA = PED_CPU_TO_LE32 (0xFFFFFFFF);
   else
     pmbr->PartitionRecord[0].SizeInLBA = PED_CPU_TO_LE32 (dev->length - 1UL);
+  if (pmbr_boot)
+    pmbr->PartitionRecord[0].BootIndicator = 0x80;
 
   int write_ok = ped_device_write (dev, pmbr, GPT_PMBR_LBA,
                                    GPT_PMBR_SECTORS);
@@ -1221,7 +1234,7 @@ gpt_write (const PedDisk *disk)
   ptes_crc = efi_crc32 (ptes, ptes_bytes);
 
   /* Write protective MBR */
-  if (!_write_pmbr (disk->dev))
+  if (!_write_pmbr (disk->dev, gpt_disk_data->pmbr_boot))
     goto error_free_ptes;
 
   /* Write PTH and PTEs */
@@ -1509,6 +1522,46 @@ gpt_partition_enumerate (PedPartition *part)
 }
 
 static int
+gpt_disk_set_flag (PedDisk *disk, PedDiskFlag flag, int state)
+{
+  GPTDiskData *gpt_disk_data = disk->disk_specific;
+  switch (flag)
+    {
+    case PED_DISK_GPT_PMBR_BOOT:
+      gpt_disk_data->pmbr_boot = state;
+      return 1;
+    default:
+      return 0;
+    }
+}
+
+static int
+gpt_disk_is_flag_available(const PedDisk *disk, PedDiskFlag flag)
+{
+  switch (flag)
+    {
+    case PED_DISK_GPT_PMBR_BOOT:
+      return 1;
+    default:
+      return 0;
+    }
+}
+
+static int
+gpt_disk_get_flag (const PedDisk *disk, PedDiskFlag flag)
+{
+  GPTDiskData *gpt_disk_data = disk->disk_specific;
+  switch (flag)
+    {
+    case PED_DISK_GPT_PMBR_BOOT:
+      return gpt_disk_data->pmbr_boot;
+      break;
+    default:
+      return 0;
+    }
+}
+
+static int
 gpt_partition_set_flag (PedPartition *part, PedPartitionFlag flag, int state)
 {
   GPTPartitionData *gpt_part_data;
@@ -1796,6 +1849,9 @@ static PedDiskOps gpt_disk_ops =
 
   partition_set_name:		gpt_partition_set_name,
   partition_get_name:		gpt_partition_get_name,
+  disk_set_flag:		gpt_disk_set_flag,
+  disk_get_flag:		gpt_disk_get_flag,
+  disk_is_flag_available:	gpt_disk_is_flag_available,
 
   PT_op_function_initializers (gpt)
 };
diff --git a/parted/parted.c b/parted/parted.c
index 02c5fdb..eb91835 100644
--- a/parted/parted.c
+++ b/parted/parted.c
@@ -1560,6 +1560,43 @@ error:
 }
 
 static int
+do_disk_set (PedDevice** dev)
+{
+    PedDisk*    disk;
+    PedDiskFlag flag;
+    int         state;
+
+    disk = ped_disk_new (*dev);
+    if (!disk)
+        goto error;
+
+    if (!command_line_get_disk_flag (_("Flag to Invert?"), disk, &flag))
+        goto error_destroy_disk;
+    state = (ped_disk_get_flag (disk, flag) == 0 ? 1 : 0);
+
+    if (!is_toggle_mode) {
+        if (!command_line_get_state (_("New state?"), &state))
+            goto error_destroy_disk;
+    }
+
+    if (!ped_disk_set_flag (disk, flag, state))
+        goto error_destroy_disk;
+    if (!ped_disk_commit (disk))
+        goto error_destroy_disk;
+    ped_disk_destroy (disk);
+
+    if ((*dev)->type != PED_DEVICE_FILE)
+        disk_is_modified = 1;
+
+    return 1;
+
+error_destroy_disk:
+    ped_disk_destroy (disk);
+error:
+    return 0;
+}
+
+static int
 do_set (PedDevice** dev)
 {
         PedDisk*                disk;
@@ -1600,6 +1637,18 @@ error:
 }
 
 static int
+do_disk_toggle (PedDevice **dev)
+{
+    int result;
+
+    is_toggle_mode = 1;
+    result = do_disk_set (dev);
+    is_toggle_mode = 0;
+
+    return result;
+}
+
+static int
 do_toggle (PedDevice **dev)
 {
         int result;
@@ -1836,6 +1885,23 @@ NULL),
         str_list_create (_(device_msg), NULL), 1));
 
 command_register (commands, command_create (
+        str_list_create_unique ("disk_set", _("disk_set"), NULL),
+        do_disk_set,
+        str_list_create (
+_("disk_set FLAG STATE                      change the FLAG on selected device"),
+NULL),
+        str_list_create (flag_msg, _(state_msg), NULL), 1));
+
+command_register (commands, command_create (
+        str_list_create_unique ("disk_toggle", _("disk_toggle"), NULL),
+        do_disk_toggle,
+        str_list_create (
+_("disk_toggle [FLAG]                       toggle the state of FLAG on "
+"selected device"),
+NULL),
+        str_list_create (flag_msg, NULL), 1));
+
+command_register (commands, command_create (
 		str_list_create_unique ("set", _("set"), NULL),
 		do_set,
 		str_list_create (
diff --git a/parted/ui.c b/parted/ui.c
index a0f8820..d00c65a 100644
--- a/parted/ui.c
+++ b/parted/ui.c
@@ -1116,6 +1116,35 @@ command_line_get_disk_type (const char* prompt, const PedDiskType*(* value))
 }
 
 int
+command_line_get_disk_flag (const char* prompt, const PedDisk* disk,
+                            PedDiskFlag* flag)
+{
+        StrList*            opts = NULL;
+        PedPartitionFlag    walk = 0;
+        char*               flag_name;
+
+        while ( (walk = ped_disk_flag_next (walk)) ) {
+                if (ped_disk_is_flag_available (disk, walk)) {
+                        const char*        walk_name;
+
+                        walk_name = ped_disk_flag_get_name (walk);
+                        opts = str_list_append (opts, walk_name);
+                        opts = str_list_append_unique (opts, _(walk_name));
+                }
+        }
+
+        flag_name = command_line_get_word (prompt, NULL, opts, 1);
+        str_list_destroy (opts);
+
+        if (flag_name) {
+                *flag = ped_disk_flag_get_by_name (flag_name);
+                free (flag_name);
+                return 1;
+        } else
+                return 0;
+}
+
+int
 command_line_get_part_flag (const char* prompt, const PedPartition* part,
                             PedPartitionFlag* flag)
 {
diff --git a/parted/ui.h b/parted/ui.h
index c39afb9..9c8605a 100644
--- a/parted/ui.h
+++ b/parted/ui.h
@@ -63,6 +63,9 @@ extern int command_line_get_fs_type (const char* prompt,
 				     const PedFileSystemType*(* value));
 extern int command_line_get_disk_type (const char* prompt,
 				       const PedDiskType*(* value));
+extern int command_line_get_disk_flag (const char* prompt,
+				       const PedDisk* disk,
+				       PedDiskFlag* flag);
 extern int command_line_get_part_flag (const char* prompt,
 				       const PedPartition* part,
 				       PedPartitionFlag* flag);



More information about the Parted-commits mailing list