Message ID | 1492077174-31148-6-git-send-email-patrick.delaunay@st.com |
---|---|
State | Superseded |
Delegated to: | Tom Rini |
Headers | show |
On 13 April 2017 at 03:52, Patrick Delaunay <patrick.delaunay@st.com> wrote: > the value for partition_entry_lba of secondary GPT (last usable lba + 1) > is not correct with MTD support as last usable LBA need to be erase size > aligned > > The correct location of partition entry is always recomputed with > the formula : > partition_entry_lba = > alternate_lba - > num_pte * sizeof_partition_entry / lba_size > > Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> > Reviewed-by: Christophe KERELLO <christophe.kerello@st.com> > --- > the device mapping is > > 1/ for block case: > > last_usable_lba -> partition_entry_lba - 1 > partition_entry_lba -> PTE table (num * sizeof(PTE)) > alternate_lba -> secondary GPT > -> end of device > > 2/ for MTD case : end of the last good block > > ------------- > > last_usable_lba -> last good erase block - 1 > -------------erase BLOCK aligned > XXXXXXXXXXXXXXXXXX -> skipped LBA for MTD case > partition_entry_lba -> PTE table (num * sizeof(PTE)) > alternate_lba -> secondary GPT > -------------erase BLOCK aligned > xxxxx skipping bad block > ->end of device > > Changes in v5: None > Changes in v4: None > Changes in v3: None > Changes in v2: None > > disk/part_efi.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) Reviewed-by: Simon Glass <sjg@chromium.org>
diff --git a/disk/part_efi.c b/disk/part_efi.c index d5cd161..1f3f0ca 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -155,7 +155,8 @@ static int validate_gpt_entries(gpt_header *gpt_h, gpt_entry *gpt_e) return 0; } -static void prepare_backup_gpt_header(gpt_header *gpt_h) +static void prepare_backup_gpt_header(gpt_header *gpt_h, + const int pte_blk_cnt) { uint32_t calc_crc32; uint64_t val; @@ -164,8 +165,7 @@ static void prepare_backup_gpt_header(gpt_header *gpt_h) val = le64_to_cpu(gpt_h->alternate_lba); gpt_h->alternate_lba = gpt_h->my_lba; gpt_h->my_lba = cpu_to_le64(val); - gpt_h->partition_entry_lba = - cpu_to_le64(le64_to_cpu(gpt_h->last_usable_lba) + 1); + gpt_h->partition_entry_lba = cpu_to_le64(val - pte_blk_cnt); gpt_h->header_crc32 = 0; calc_crc32 = efi_crc32((const unsigned char *)gpt_h, @@ -389,7 +389,7 @@ int write_gpt_table(struct blk_desc *dev_desc, pte_blk_cnt, gpt_e) != pte_blk_cnt) goto err; - prepare_backup_gpt_header(gpt_h); + prepare_backup_gpt_header(gpt_h, pte_blk_cnt); if (blk_dwrite(dev_desc, (lbaint_t)le64_to_cpu(gpt_h->last_usable_lba) + 1, pte_blk_cnt, gpt_e) != pte_blk_cnt) @@ -804,7 +804,7 @@ int write_mbr_and_gpt_partitions(struct blk_desc *dev_desc, void *buf) return 1; } - prepare_backup_gpt_header(gpt_h); + prepare_backup_gpt_header(gpt_h, gpt_e_blk_cnt); /* write Backup GPT */ lba = le64_to_cpu(gpt_h->partition_entry_lba);