]> err.no Git - util-linux/commitdiff
fdisk: update MBR after ID change
authorKarel Zak <kzak@redhat.com>
Mon, 9 Aug 2010 11:03:02 +0000 (13:03 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 9 Aug 2010 11:08:33 +0000 (13:08 +0200)
Reported-by: Bernard Pidoux <bpidoux@free.fr>
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisk/fdisk.c
tests/expected/fdisk/id [new file with mode: 0644]
tests/ts/fdisk/id [new file with mode: 0755]

index 6572c51dd677eb593d3503c47cfa6586dce1f507..af95bcc64b483a220013c7f56bcecb608a5f8f16 100644 (file)
@@ -180,6 +180,8 @@ static int type_open = O_RDWR;
  */
 unsigned char *MBRbuffer;
 
+int MBRbuffer_changed;
+
 /*
  * per partition table entry data
  *
@@ -934,6 +936,7 @@ dos_set_mbr_id(void) {
                return;
 
        dos_write_mbr_id(MBRbuffer, new_id);
+       MBRbuffer_changed = 1;
        dos_print_mbr_id();
 }
 
@@ -2553,10 +2556,18 @@ write_table(void) {
        int i;
 
        if (dos_label) {
-               for (i=0; i<3; i++)
-                       if (ptes[i].changed)
-                               ptes[3].changed = 1;
-               for (i = 3; i < partitions; i++) {
+               /* MBR (primary partitions) */
+               if (!MBRbuffer_changed) {
+                       for (i = 0; i < 4; i++)
+                               if (ptes[i].changed)
+                                       MBRbuffer_changed = 1;
+               }
+               if (MBRbuffer_changed) {
+                       write_part_table_flag(MBRbuffer);
+                       write_sector(fd, 0, MBRbuffer);
+               }
+               /* EBR (logical partitions) */
+               for (i = 4; i < partitions; i++) {
                        struct pte *pe = &ptes[i];
 
                        if (pe->changed) {
diff --git a/tests/expected/fdisk/id b/tests/expected/fdisk/id
new file mode 100644 (file)
index 0000000..4801f81
--- /dev/null
@@ -0,0 +1,5 @@
+Initialize empty image
+Create MBR with ID=0x1
+Disk identifier: 0x00000001
+Create MBR with ID=0x2
+Disk identifier: 0x00000002
diff --git a/tests/ts/fdisk/id b/tests/ts/fdisk/id
new file mode 100755 (executable)
index 0000000..99840a2
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+#
+# This file is part of util-linux-ng.
+#
+# This file 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 2 of the License, or
+# (at your option) any later version.
+#
+# This file 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.
+#
+
+TS_TOPDIR="$(dirname $0)/../.."
+TS_DESC="doslabel tests"
+
+. $TS_TOPDIR/functions.sh
+ts_init "$*"
+
+FDISK_CMD_ID1="x\ni\n0x1\nr\nw\n"
+FDISK_CMD_ID2="x\ni\n0x2\nr\nw\n"
+
+ts_log "Initialize empty image"
+TEST_IMAGE_NAME=$(ts_image_init 10)
+
+ts_log "Create MBR with ID=0x1"
+echo -e "${FDISK_CMD_ID1}" | $TS_CMD_FDISK ${TEST_IMAGE_NAME} &> /dev/null
+$TS_CMD_FDISK -l ${TEST_IMAGE_NAME} | grep identifier >> $TS_OUTPUT
+
+ts_log "Create MBR with ID=0x2"
+echo -e "${FDISK_CMD_ID2}" | $TS_CMD_FDISK ${TEST_IMAGE_NAME} &> /dev/null
+$TS_CMD_FDISK -l ${TEST_IMAGE_NAME} | grep identifier >> $TS_OUTPUT
+
+ts_finalize