From f9936f4dc0cd50d1040f7e855ef091db0edd1f64 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 9 Aug 2010 13:03:02 +0200 Subject: [PATCH] fdisk: update MBR after ID change Reported-by: Bernard Pidoux Signed-off-by: Karel Zak --- fdisk/fdisk.c | 19 +++++++++++++++---- tests/expected/fdisk/id | 5 +++++ tests/ts/fdisk/id | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 tests/expected/fdisk/id create mode 100755 tests/ts/fdisk/id diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c index 6572c51d..af95bcc6 100644 --- a/fdisk/fdisk.c +++ b/fdisk/fdisk.c @@ -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 index 00000000..4801f816 --- /dev/null +++ b/tests/expected/fdisk/id @@ -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 index 00000000..99840a25 --- /dev/null +++ b/tests/ts/fdisk/id @@ -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 -- 2.39.5