[U-Boot] [PATCH] disk: part_dos: fix part_get_info_extended() function
Shawn Guo
shawnguo at kernel.org
Thu Nov 2 08:46:34 UTC 2017
From: Shawn Guo <shawn.guo at linaro.org>
The check in part_get_info_extended() for a successful partition
searching misses a condition for extended partition. In case of
(ext_part_sector == 0), we should anyway mark the partition as found,
even if it's an extended partition, i.e. (is_extended(pt->sys_ind) == 0).
Otherwise, the extended partition (type 0x0f) will never be identified,
and the following recursive call to part_get_info_extended() will get a
wrong 'part_num' and 'which_part' parameter. In the end, all those
partitions in extended table will not be identified.
Let's add the missing OR condition of (ext_part_sector == 0) for
is_extended() check to fix the problem.
The issue is discovered by running fastboot flash to an extended
partition on eMMC.
$ fastboot flash mmcsda5 cache.img
target reported max download size of 536870912 bytes
sending 'mmcsda5' (18796 KB)...
OKAY [ 2.144s]
writing 'mmcsda5'...
FAILED (remote: cannot find partition)
finished. total time: 2.261s
Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
---
disk/part_dos.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/disk/part_dos.c b/disk/part_dos.c
index 1a36be0446ac..4485eb704852 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -210,7 +210,7 @@ static int part_get_info_extended(struct blk_desc *dev_desc,
if (((pt->boot_ind & ~0x80) == 0) &&
(pt->sys_ind != 0) &&
(part_num == which_part) &&
- (is_extended(pt->sys_ind) == 0)) {
+ (ext_part_sector == 0 || is_extended(pt->sys_ind) == 0)) {
info->blksz = DOS_PART_DEFAULT_SECTOR;
info->start = (lbaint_t)(ext_part_sector +
le32_to_int(pt->start4));
--
1.9.1
More information about the U-Boot
mailing list