Patchwork [U-Boot,2/2] disk: part_dos: don't claim whole-disk FAT filesystems

login
register
mail settings
Submitter Stephen Warren
Date Oct. 5, 2012, 11:17 p.m.
Message ID <1349479060-3211-2-git-send-email-swarren@wwwdotorg.org>
Download mbox | patch
Permalink /patch/189626/
State Accepted
Delegated to: Tom Rini
Headers show

Comments

Stephen Warren - Oct. 5, 2012, 11:17 p.m.
From: Stephen Warren <swarren@nvidia.com>

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: Stephen Warren <swarren@nvidia.com>
---
 disk/part_dos.c |   21 +++++++++------------
 1 files changed, 9 insertions(+), 12 deletions(-)
Tom Rini - Oct. 8, 2012, 6:47 p.m.
On Fri, Oct 05, 2012 at 01:17:40PM -0000, Stephen Warren wrote:

> From: Stephen Warren <swarren@nvidia.com>
> 
> 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: Stephen Warren <swarren@nvidia.com>

Applied to u-boot/master, thanks!

Patch

diff --git a/disk/part_dos.c b/disk/part_dos.c
index c9a3e2b..5c454e6 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -94,12 +94,13 @@  int test_part_dos (block_dev_desc_t *dev_desc)
 {
 	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
 
-	if ((dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *) buffer) != 1) ||
-	    (buffer[DOS_PART_MAGIC_OFFSET + 0] != 0x55) ||
-	    (buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) ) {
-		return (-1);
-	}
-	return (0);
+	if (dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *) buffer) != 1)
+		return -1;
+
+	if (test_block_type(buffer) != DOS_MBR)
+		return -1;
+
+	return 0;
 }
 
 /*  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
 		return;
 	}
 	i=test_block_type(buffer);
-	if(i==-1) {
+	if (i != DOS_MBR) {
 		printf ("bad MBR sector signature 0x%02x%02x\n",
 			buffer[DOS_PART_MAGIC_OFFSET],
 			buffer[DOS_PART_MAGIC_OFFSET + 1]);
 		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 */
 	pt = (dos_partition_t *) (buffer + DOS_PART_TBL_OFFSET);
 	for (i = 0; i < 4; i++, pt++) {