FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > CentOS > CentOS

 
 
LinkBack Thread Tools
 
Old 12-17-2010, 01:17 PM
Peter Jones
 
Default 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.

01234567890123456789012345678901234567890123456789 012345678901234567890123456789

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 03:46 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org