Skip to content
Snippets Groups Projects
Commit d1efb644 authored by Stephen Warren's avatar Stephen Warren Committed by Tom Rini
Browse files

disk: part_dos: don't claim whole-disk FAT filesystems


Logically, a disk that contains a raw FAT filesystem does not in fact
have a partition table. However, test_part_dos() was claiming that such
disks did in fact have a DOS-style partition table. This caused
get_device_and_partition() not to return a whole-disk disk_partition_t,
since part_type != PART_TYPE_UNKNOWN.

part_dos.c's print_partition_extended() detected the raw FAT filesystem
condition and printed a fake partition table that encompassed the whole
disk.

However, part_dos.c's get_partition_info_extended() did not return any
valid partitions in this case. This combination caused
get_device_and_partition() not to find any valid partitions, and hence
to return an error.

Fix test_part_dos() not to claim that raw FAT filesystems are DOS
partition tables. In turn, this causes get_device_and_partition() to
return a whole-disk disk_partition_t, and hence the following commands
work:

fatls mmc 0 /
fatls mmc 0:auto /

An alternative would be to modify print_partition_extended() to detect
raw FAT filesystems, just like print_partition_extended() does, and to
return a fake partition in this case. However, this seems logically
incorrect, and also duplicates code, since get_device_and_partition()
falls back to returning a whole-disk partition when there is no partition
table on the device.

Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
parent bd1a7e30
No related branches found
No related tags found
No related merge requests found
...@@ -94,12 +94,13 @@ int test_part_dos (block_dev_desc_t *dev_desc) ...@@ -94,12 +94,13 @@ int test_part_dos (block_dev_desc_t *dev_desc)
{ {
ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz); ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
if ((dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *) buffer) != 1) || if (dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *) buffer) != 1)
(buffer[DOS_PART_MAGIC_OFFSET + 0] != 0x55) || return -1;
(buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) ) {
return (-1); if (test_block_type(buffer) != DOS_MBR)
} return -1;
return (0);
return 0;
} }
/* Print a partition that is relative to its Extended partition table /* Print a partition that is relative to its Extended partition table
...@@ -117,17 +118,13 @@ static void print_partition_extended (block_dev_desc_t *dev_desc, int ext_part_s ...@@ -117,17 +118,13 @@ static void print_partition_extended (block_dev_desc_t *dev_desc, int ext_part_s
return; return;
} }
i=test_block_type(buffer); i=test_block_type(buffer);
if(i==-1) { if (i != DOS_MBR) {
printf ("bad MBR sector signature 0x%02x%02x\n", printf ("bad MBR sector signature 0x%02x%02x\n",
buffer[DOS_PART_MAGIC_OFFSET], buffer[DOS_PART_MAGIC_OFFSET],
buffer[DOS_PART_MAGIC_OFFSET + 1]); buffer[DOS_PART_MAGIC_OFFSET + 1]);
return; return;
} }
if(i==DOS_PBR) {
printf (" 1\t\t 0\t%10ld\t%2x\n",
dev_desc->lba, buffer[DOS_PBR_MEDIA_TYPE_OFFSET]);
return;
}
/* Print all primary/logical partitions */ /* Print all primary/logical partitions */
pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET); pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
for (i = 0; i < 4; i++, pt++) { for (i = 0; i < 4; i++, pt++) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment