[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [PATCH] Improve support for mac partition tables with logical sector size != 512



On 12/16/2010 04:01 PM, Peter Jones wrote:
On mac partition tables which specify a sector size larger than the
physical sector size, we need to reallocate the buffer after we
determine the correct sector size.

This appears to be a normal condition on disks in the wild that are>2TB
and use Mac partition tables (for example, the rescue image for the
MacBookAir3,1), so also don't raise an exception in _disk_analyse_block_size()
when we find that.

This paragraph is wrong.  I'll send a reply with a corrected patch.

Also simplify the code in _disk_analyse_block_size() a bit since there's
no reason to ever do the byteswapping more than once or convert everything to
512-byte multiples since we neither load nor store it that way.
---
  libparted/labels/mac.c |   44 ++++++++++++++++++++++++++------------------
  1 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/libparted/labels/mac.c b/libparted/labels/mac.c
index 49a236e..418343e 100644
--- a/libparted/labels/mac.c
+++ b/libparted/labels/mac.c
@@ -643,35 +643,22 @@ _rawpart_get_partmap_size (MacRawPartition* raw_part, PedDisk* disk)
  static int
  _disk_analyse_block_size (PedDisk* disk, MacRawDisk* raw_disk)
  {
-	PedSector	block_size;
+	PedSector	block_size = PED_BE16_TO_CPU(raw_disk->block_size);

-	if (PED_BE16_TO_CPU (raw_disk->block_size) % 512) {
+	if (block_size % 512) {
  #ifndef DISCOVER_ONLY
  		ped_exception_throw (
  			PED_EXCEPTION_ERROR,
  			PED_EXCEPTION_CANCEL,
  			_("Weird block size on device descriptor: %d bytes is "
  			  "not divisible by 512."),
-			(int) PED_BE16_TO_CPU (raw_disk->block_size));
+			(int) block_size);
  #endif
  		goto error;
  	}

-	block_size = PED_BE16_TO_CPU (raw_disk->block_size) / 512;
-	if (block_size != disk->dev->sector_size / 512) {
-#ifndef DISCOVER_ONLY
-		if (ped_exception_throw (
-			PED_EXCEPTION_WARNING,
-			PED_EXCEPTION_IGNORE_CANCEL,
-			_("The driver descriptor says the physical block size "
-			  "is %d bytes, but Linux says it is %d bytes."),
-			(int) block_size * 512,
-			(int) disk->dev->sector_size)
-				!= PED_EXCEPTION_IGNORE)
-			goto error;
-#endif
-		disk->dev->sector_size = block_size * 512;
-	}
+	if (block_size != disk->dev->sector_size)
+		disk->dev->sector_size = block_size;

  	return 1;

@@ -729,6 +716,7 @@ mac_read (PedDisk* disk)
  	PedPartition*		part;
  	int			num;
  	PedSector		ghost_size;
+	PedSector		sector_size;
  	PedConstraint*		constraint_exact;
  	int			last_part_entry_num = 0;

@@ -746,8 +734,28 @@ mac_read (PedDisk* disk)
  	if (!_check_signature (raw_disk))
  		goto error;

+	sector_size = disk->dev->sector_size;
  	if (!_disk_analyse_block_size (disk, raw_disk))
  		goto error;
+	
+	/* If dev->sector_size changed when we did ptt_read_sector(),
+	   then the buffer size is wrong and we'll take a segfault
+	   down the line unless we re-allocate it here. */
+	if (disk->dev->sector_size != sector_size) {
+		free(buf);
+		buf = 0;
+		if (!ptt_read_sector(disk->dev, 0,&buf))
+			return 0;
+
+		MacRawDisk *raw_disk = (MacRawDisk *) buf;
+
+		if (!_check_signature (raw_disk))
+			goto error;
+
+		if (!_disk_analyse_block_size (disk, raw_disk))
+			goto error;
+	}
+
  	if (!_disk_analyse_ghost_size (disk))
  		goto error;
  	ghost_size = mac_disk_data->ghost_size;


--
        Peter

Growth for the sake of growth is the ideology of the cancer cell.

01234567890123456789012345678901234567890123456789012345678901234567890123456789


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]