From ee1a5bd78a21fb978f11ded32c54dad24ad9d699 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Fri, 8 Nov 2024 16:30:56 +0100 Subject: [PATCH] image-hd: set the first usable lba correctly Before this, the begining of the first partition was used. This leaves some unusable space between the partition table and the first partition and causes some Windows versions to alter the GPT. So set the first usable lba correctly: Set it to the first lba after the last non-partition data before the first partition. This will either be directly behind the GPT entry array or, for example after a bootloader that is placed between the partition table and the first partition. Signed-off-by: Michael Olbrich --- image-hd.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/image-hd.c b/image-hd.c index 3d14262..a115aeb 100644 --- a/image-hd.c +++ b/image-hd.c @@ -483,7 +483,7 @@ static int hdimage_insert_gpt(struct image *image, struct list_head *partitions) const char *outfile = imageoutfile(image); struct gpt_header header; struct gpt_partition_entry table[GPT_ENTRIES]; - unsigned long long smallest_offset = ~0ULL; + unsigned long long smallest_offset = ~0ULL, extra_offset = 0; struct partition *part; unsigned i, j; int ret; @@ -526,10 +526,21 @@ static int hdimage_insert_gpt(struct image *image, struct list_head *partitions) i++; } - if (smallest_offset == ~0ULL) - smallest_offset = hd->gpt_location + (GPT_SECTORS - 1)*512; - header.first_usable_lba = htole64(smallest_offset / 512); + /* + * Find the last non-partition data before the first partition. + * This can be a bootloader of the GPT partition table. + * */ + list_for_each_entry(part, partitions, list) { + unsigned long long end; + if (part->in_partition_table) + continue; + + end = part->offset + part->size; + if (end <= smallest_offset && end > extra_offset) + extra_offset = end; + } + header.first_usable_lba = htole64(roundup(extra_offset, 512) / 512); header.table_crc = htole32(crc32(table, sizeof(table)));