Bring git up to 0.6.6 release version.
diff --git a/gpt.cc b/gpt.cc
index a407d37..9b1faf6 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -608,7 +608,6 @@
// store disk information....
diskSize = myDisk.DiskSize(&err);
blockSize = (uint32_t) myDisk.GetBlockSize();
- sectorAlignment = myDisk.FindAlignment();
device = deviceFilename;
PartitionScan(); // Check for partition types, load GPT, & print summary
@@ -928,28 +927,24 @@
// Do it!
if (allOK) {
- // First, write the protective MBR...
- allOK = protectiveMBR.WriteMBRData(&myDisk);
-
- if (allOK && myDisk.OpenForWrite(device)) {
- // Now write the main GPT header...
- allOK = SaveHeader(&mainHeader, myDisk, 1);
-
- // Now write the main partition tables...
- if (allOK) {
- allOK = SavePartitionTable(myDisk, mainHeader.partitionEntriesLBA);
- } // if (allOK)
-
- // Now seek to near the end to write the secondary GPT....
+ if (myDisk.OpenForWrite(device)) {
+ // As per UEFI specs, write the secondary table and GPT first....
allOK = SavePartitionTable(myDisk, secondHeader.partitionEntriesLBA);
if (!allOK)
cerr << "Unable to save backup partition table! Perhaps the 'e' option on the experts'\n"
<< "menu will resolve this problem.\n";
// Now write the secondary GPT header...
- if (allOK) {
- allOK = SaveHeader(&secondHeader, myDisk, mainHeader.backupLBA);
- } // if (allOK)
+ allOK = allOK && SaveHeader(&secondHeader, myDisk, mainHeader.backupLBA);
+
+ // Now write the main partition tables...
+ allOK = allOK && SavePartitionTable(myDisk, mainHeader.partitionEntriesLBA);
+
+ // Now write the main GPT header...
+ allOK = allOK && SaveHeader(&mainHeader, myDisk, 1);
+
+ // To top it off, write the protective MBR...
+ allOK = allOK && protectiveMBR.WriteMBRData(&myDisk);
// re-read the partition table
if (allOK) {
@@ -960,9 +955,9 @@
cout << "The operation has completed successfully.\n";
} else {
cerr << "Warning! An error was reported when writing the partition table! This error\n"
- << "MIGHT be harmless, but you may have trashed the disk! Use parted and, if\n"
- << "necessary, restore your original partition table.\n";
+ << "MIGHT be harmless, but you may have trashed the disk!\n";
} // if/else
+
myDisk.Close();
} else {
cerr << "Unable to open device " << device << " for writing! Errno is "
@@ -1259,6 +1254,7 @@
cout << "First usable sector is " << mainHeader.firstUsableLBA
<< ", last usable sector is " << mainHeader.lastUsableLBA << "\n";
totalFree = FindFreeBlocks(&i, &temp);
+ cout << "Partitions will be aligned on " << sectorAlignment << "-sector boundaries\n";
cout << "Total free space is " << totalFree << " sectors ("
<< BytesToSI(totalFree * (uint64_t) blockSize) << ")\n";
cout << "\nNumber Start (sector) End (sector) Size Code Name\n";
@@ -1752,6 +1748,7 @@
for (i = 0; i < GPT_RESERVED; i++) {
mainHeader.reserved2[i] = '\0';
} // for
+ sectorAlignment = DEFAULT_ALIGNMENT;
// Now some semi-static items (computed based on end of disk)
mainHeader.backupLBA = diskSize - UINT64_C(1);
@@ -1878,14 +1875,16 @@
// Otherwise, notify the user that it couldn't be done....
if (sectorOK == 1) {
cout << "Information: Moved requested sector from " << original << " to "
- << *sector << " for\nalignment purposes.\n";
+ << *sector << " in\norder to align on " << sectorAlignment
+ << "-sector boundaries.\n";
if (!beQuiet)
cout << "Use 'l' on the experts' menu to adjust alignment\n";
} else {
cout << "Information: Sector not aligned on " << sectorAlignment
<< "-sector boundary and could not be moved.\n"
<< "If you're using a Western Digital Advanced Format or similar disk with\n"
- << "underlying 4096-byte sectors, performance may suffer.\n";
+ << "underlying 4096-byte sectors or certain types of RAID array, performance\n"
+ << "may suffer.\n";
retval = 0;
} // if/else
} // if
@@ -2139,26 +2138,25 @@
sectorAlignment = n;
l2 = (uint32_t) log2(n);
- if (PowerOf2(l2) != n)
- cout << "Information: Your alignment value is not a power of 2.\n";
} // GPTData::SetAlignment()
// Compute sector alignment based on the current partitions (if any). Each
// partition's starting LBA is examined, and if it's divisible by a power-of-2
-// value less than the maximum found so far (or 2^31 for the first partition
-// found), then the alignment value is adjusted down. If the computed
-// alignment is less than 8 and the disk is bigger than SMALLEST_ADVANCED_FORMAT,
-// resets it to 8. This is a safety measure for WD Advanced Format and
-// similar drives. If no partitions are defined, the alignment value is set
-// to DEFAULT_ALIGNMENT (2048). The result is that new drives are aligned to
-// 2048-sector multiples but the program won't complain about other alignments
-// on existing disks unless a smaller-than-8 alignment is used on small disks
-// (as safety for WD Advanced Format drives).
+// value less than or equal to the DEFAULT_ALIGNMENT value, but not by the
+// previously-located alignment value, then the alignment value is adjusted
+// down. If the computed alignment is less than 8 and the disk is bigger than
+// SMALLEST_ADVANCED_FORMAT, resets it to 8. This is a safety measure for WD
+// Advanced Format and similar drives. If no partitions are defined, the
+// alignment value is set to DEFAULT_ALIGNMENT (2048). The result is that new
+// drives are aligned to 2048-sector multiples but the program won't complain
+// about other alignments on existing disks unless a smaller-than-8 alignment
+// is used on small disks (as safety for WD Advanced Format drives).
// Returns the computed alignment value.
uint32_t GPTData::ComputeAlignment(void) {
uint32_t i = 0, found, exponent = 31;
uint64_t align = DEFAULT_ALIGNMENT;
+ exponent = (uint32_t) log2(DEFAULT_ALIGNMENT);
for (i = 0; i < mainHeader.numParts; i++) {
if (partitions[i].IsUsed()) {
found = 0;
@@ -2174,7 +2172,6 @@
} // for
if ((align < 8) && (diskSize >= SMALLEST_ADVANCED_FORMAT))
align = 8;
-// cout << "Setting alignment to " << align << "\n";
SetAlignment(align);
return align;
} // GPTData::ComputeAlignment()