[U-Boot] [PATCH] fastboot: getvar: fix broken 'fastboot flash' when partition has slots
Eugeniu Rosca
erosca at de.adit-jv.com
Wed Mar 27 01:02:40 UTC 2019
With eMMC partitioning [1], 'fastboot getvar has-slot:<part-name>'
returns 'yes' only for 'system' and 'boot', while it is clear that [1]
has more partitions featuring slots (i.e. dtb, dtbo, vbmeta and vendor).
One not so obvious consequence is that
'fastboot flash {dtb,dtbo,vbmeta,vendor} img' will fail [2], while
'fastboot flash {boot,system} img' will succeed [3]. This is because
'fastboot flash' relies on the outcome of
'fastboot has-slot:<part-name>' behind the scene.
Assuming that the list of partitions featuring slots is vendor-
specific, U-Boot fastboot driver is not the best place for such list.
To avoid creating __weak functions overridden by board code, one simple
solution seems to be taking the user-provided partition as base, append
the "_a" suffix and checking if the result is a valid partition name.
This approach assumes that the 'has-slot:' API is specifically
designed to work with partition names chopped of their slot suffixes.
Reviewing the usage of 'has-slot' in upstream fastboot [4], this
assumption seems to be fortified, but to be 100% sure we need an Ack
from a fastboot expert.
[1] R-Car-H3 eMMC partitioning used for testing:
(bootloader) Created new GPT partition table:
(bootloader) /misc (512 KiB, raw)
(bootloader) /pst (512 KiB, raw)
(bootloader) /vbmeta_a (512 KiB, raw)
(bootloader) /vbmeta_b (512 KiB, raw)
(bootloader) /dtb_a (1024 KiB, raw)
(bootloader) /dtb_b (1024 KiB, raw)
(bootloader) /dtbo_a (512 KiB, raw)
(bootloader) /dtbo_b (512 KiB, raw)
(bootloader) /boot_a (16384 KiB, raw)
(bootloader) /boot_b (16384 KiB, raw)
(bootloader) /metadata (16384 KiB, raw)
(bootloader) /system_a (2301952 KiB, ext4)
(bootloader) /system_b (2301952 KiB, ext4)
(bootloader) /vendor_a (262144 KiB, ext4)
(bootloader) /vendor_b (262144 KiB, ext4)
(bootloader) /userdata (2451951 KiB, ext4)
[2] fastboot flash vbmeta vbmeta.img
target reported max download size of 16777216 bytes
Sending 'vbmeta' (4 KB)...
OKAY [ 0.025s]
Writing 'vbmeta'...
FAILED (remote: cannot find partition)
Finished. Total time: 0.332s
[3] fastboot flash boot boot.img
target reported max download size of 16777216 bytes
Sending 'boot_a' (16384 KB)...
OKAY [ 1.586s]
Writing 'boot_a'...
OKAY [ 0.379s]
Finished. Total time: 2.054s
[4] core (f959fffc1c8c) git grep -l has-slot
fastboot/constants.h
fastboot/fastboot.cpp
fastboot/fuzzy_fastboot/main.cpp
fs_mgr/tests/adb-remount-test.sh
Fixes: f73a7df984a9 ("net: fastboot: Merge AOSP UDP fastboot")
Signed-off-by: Eugeniu Rosca <erosca at de.adit-jv.com>
---
drivers/fastboot/fb_getvar.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/fastboot/fb_getvar.c b/drivers/fastboot/fb_getvar.c
index 4d264c985d7e..03bcd7162b37 100644
--- a/drivers/fastboot/fb_getvar.c
+++ b/drivers/fastboot/fb_getvar.c
@@ -130,8 +130,17 @@ static void getvar_slot_suffixes(char *var_parameter, char *response)
static void getvar_has_slot(char *part_name, char *response)
{
- if (part_name && (!strcmp(part_name, "boot") ||
- !strcmp(part_name, "system")))
+ struct blk_desc *dev_desc;
+ disk_partition_t info;
+ char name[32];
+
+ if (!part_name || !strcmp(part_name, ""))
+ return;
+
+ strlcpy(name, part_name, sizeof(name) - 2);
+ strcat(name, "_a");
+
+ if (fastboot_mmc_get_part_info(name, &dev_desc, &info, response) >= 0)
fastboot_okay("yes", response);
else
fastboot_okay("no", response);
--
2.21.0
More information about the U-Boot
mailing list