parted/do-not-automatically-correct-GPT.patch

68 lines
2.6 KiB
Diff

From d7d9f2c40c6bb3e83a7e6ea3164b4f4eb7440a47 Mon Sep 17 00:00:00 2001
From: Petr Uzel <petr.uzel@suse.cz>
Date: Fri, 13 Feb 2009 13:27:55 +0100
Subject: [PATCH] gpt: do not automatically "correct" a suspicious GPT partition table
Previously, when parted was invoked on a disk with a GPT partition table
and the backup GPT was not in the last sector of the disk, and even if
the requested operation was just to print the partition table, parted
would "repair" this automatically. This behavior is undesirable in the
following situation:
dm-raid on top of block device. The dm-raid is partitioned with GPT. If
the dm-raid starts on the first block of underlying device (AFAIK this is
the case with FastTrack controllers) and the user runs parted on the
dm-raid, it will identify the physical device as being partitioned with
GPT and see the backup GPT table not to be in the last sector of the
physical device and thus move it to this location (which may lead to
destruction of dm-raid metadata in case they are located at the end of
physical device).
This patch modifies parted's behavior to ignore fixing of backup GPT
position by default.
---
libparted/labels/gpt.c | 25 +++++++++++++++----------
1 files changed, 15 insertions(+), 10 deletions(-)
Index: parted-1.8.8/libparted/labels/gpt.c
===================================================================
--- parted-1.8.8.orig/libparted/labels/gpt.c
+++ parted-1.8.8/libparted/labels/gpt.c
@@ -836,21 +836,26 @@ gpt_read (PedDisk * disk)
char* zeros = ped_malloc (pth_get_size (disk->dev));
#ifndef DISCOVER_ONLY
- if (ped_exception_throw (
+ switch (ped_exception_throw (
PED_EXCEPTION_ERROR,
- PED_EXCEPTION_FIX | PED_EXCEPTION_CANCEL,
+ PED_EXCEPTION_FIX | PED_EXCEPTION_CANCEL | PED_EXCEPTION_IGNORE,
_("The backup GPT table is not at the end of the disk, as it "
"should be. This might mean that another operating system "
"believes the disk is smaller. Fix, by moving the backup "
- "to the end (and removing the old backup)?"))
- == PED_EXCEPTION_CANCEL)
- goto error_free_gpt;
+ "to the end (and removing the old backup)?"))) {
+ case PED_EXCEPTION_CANCEL:
+ goto error_free_gpt;
+ case PED_EXCEPTION_FIX:
+ write_back = 1;
+ memset (zeros, 0, disk->dev->sector_size);
+ ped_device_write (disk->dev, zeros,
+ PED_LE64_TO_CPU (gpt->AlternateLBA),
+ 1);
+ break;
+ default:
+ break;
+ }
- write_back = 1;
- memset (zeros, 0, disk->dev->sector_size);
- ped_device_write (disk->dev, zeros,
- PED_LE64_TO_CPU (gpt->AlternateLBA),
- 1);
#endif /* !DISCOVER_ONLY */
}
} else { /* primary GPT *not* ok */