OSDN Git Service

gpt: do not automatically "correct" a suspicious GPT partition table
authorPetr Uzel <petr.uzel@suse.cz>
Fri, 13 Feb 2009 12:27:55 +0000 (13:27 +0100)
committerJim Meyering <meyering@redhat.com>
Tue, 17 Feb 2009 11:46:55 +0000 (12:46 +0100)
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

index 13d2e88..eea562d 100644 (file)
@@ -831,21 +831,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 */