summaryrefslogtreecommitdiffstats
path: root/fdisk/fdisk.c
diff options
context:
space:
mode:
authorKarel Zak2010-08-09 13:03:02 +0200
committerKarel Zak2010-08-09 13:08:33 +0200
commitf9936f4dc0cd50d1040f7e855ef091db0edd1f64 (patch)
treef54149025595dc1863f4778b671e361b68466bf1 /fdisk/fdisk.c
parentcfdisk: fix n+1 bug in error message (diff)
downloadkernel-qcow2-util-linux-f9936f4dc0cd50d1040f7e855ef091db0edd1f64.tar.gz
kernel-qcow2-util-linux-f9936f4dc0cd50d1040f7e855ef091db0edd1f64.tar.xz
kernel-qcow2-util-linux-f9936f4dc0cd50d1040f7e855ef091db0edd1f64.zip
fdisk: update MBR after ID change
Reported-by: Bernard Pidoux <bpidoux@free.fr> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'fdisk/fdisk.c')
-rw-r--r--fdisk/fdisk.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c
index 6572c51dd..af95bcc64 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) {