EFI: Fix ReadBlocks API reading incorrect sector for UCLASS_PARTITION devices
authorPaul Barbieri <plb365@gmail.com>
Thu, 30 Jun 2022 11:02:04 +0000 (07:02 -0400)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 2 Jul 2022 12:19:12 +0000 (14:19 +0200)
commit7a85f32413a34b18a2f84c865d7b448790200b13
tree11d8e3b55ca47d4bbcaaab11fddcd560f82f41db
parent054de212cef6a5bfc2b91083d10451c892ce7714
EFI: Fix ReadBlocks API reading incorrect sector for UCLASS_PARTITION devices

The requsted partition disk sector incorrectly has the parition start
sector added in twice for UCLASS_PARTITION devices. The efi_disk_rw_blocks()
routine adds the diskobj->offset to the requested lba. When the device
is a UCLASS_PARTITION, the dev_read() or dev_write() routine is called
which adds part-gpt_part_info.start. This causes I/O to the wrong sector.

Takahiro Akashi suggested removing the offset field from the efi_disk_obj
structure since disk-uclass.c handles the partition start biasing. Device
types other than UCLASS_PARTITION set the diskobj->offset field to zero
which makes the field unnecessary. This change removes the offset field
from the structure and removes all references from the code which is
isolated to the lib/efi_loader/efi_disk.c module.

This change also adds a test for the EFI ReadBlocks() API in the EFI
selftest code. There is already a test for reading a FAT file. The new
test uses ReadBlocks() to read the same "disk" block and compare it to
the data read from the file system API.

Signed-Off-by: Paul Barbieri <plb365@gmail.com>
Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>
Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
lib/efi_loader/efi_disk.c
lib/efi_selftest/efi_selftest_block_device.c