[U-Boot] [PATCH v4 5/5] efi_loader: disk: install file system protocol to a whole disk

Heinrich Schuchardt xypron.glpk at gmx.de
Sat Oct 12 19:43:33 UTC 2019


On 10/7/19 7:59 AM, AKASHI Takahiro wrote:
> Currently, a whole disk without any partitions is not associated
> with EFI_SIMPLE_FILE_SYSTEM_PROTOCOL. So even if it houses some
> file system, there is a chance that we may not be able to access
> it, particularly, when accesses are to be attempted after searching
> that protocol against a device handle.
>
> With this patch, EFI_SIMPLE_FILE_SYSTEM_PROTOCOL is installed
> to such a disk if part_get_info() shows there is no partition
> table installed on it.

That is what I would expect. But it is not what this patch really does.
See below.

>
> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
> ---
>   lib/efi_loader/efi_disk.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
> index 861fcaf3747f..7ee4ed26a2ea 100644
> --- a/lib/efi_loader/efi_disk.c
> +++ b/lib/efi_loader/efi_disk.c
> @@ -337,7 +337,8 @@ static efi_status_t efi_disk_add_dev(
>   			       diskobj->dp);
>   	if (ret != EFI_SUCCESS)
>   		return ret;
> -	if (part >= 1 && efi_fs_exists(desc, part)) {
> +	/* partitions or whole disk without partitions */
> +	if (efi_fs_exists(desc, part)) {

Function efi_fs_exists() does not check if there is a partition table.
It only checks if there is a file system.

For creating a test image you can use the following commands:

cat > partioning << EOF
label: dos
label-id: 0x6fe3a999
device: image
unit: sectors
image1: start=    1024, size= 524288, type=0c
EOF
dd if=/dev/zero of=test.img count=1 bs=1MiB
/usr/sbin/sfdisk test.img < partioning
dd if=test.img of=partition.tbl bs=8 count=9 skip=55
/usr/sbin/mkfs.vfat test.img 1024
dd conv=fsync,notrunc if=partition.tbl of=test.img bs=8 count=9 seek=55
sudo losetup -o 524288 --sizelimit 524288 /dev/loop1 test.img
sudo mkfs.vfat /dev/loop1
sudo losetup -D /dev/loop1
sudo mount test.img /mnt
sudo sh -c "echo 'file system on block device' > /mnt/description.txt"
sudo umount /mnt
sudo mount test.img /mnt -o offset=524288
sudo sh -c "echo 'file system on partition 1' > /mnt/description.txt"
sudo umount /mnt

Without your patch I get

UEFI Interactive Shell v2.2
EDK II
UEFI v2.80 (Das U-Boot, 0x20191000)
Mapping table
       FS0: Alias(s):HD0a0b:;BLK1:

/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/Scsi(0,0)/HD(1,MBR,0x6fe3a999,0x400,0x400)
      BLK0: Alias(s):
           /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/Scsi(0,0)
Press ESC in 4 seconds to skip startup.nsh or any other key to continue.
Shell> fs0:
FS0:\> cat description.txt
file system on partition 1

With your patch:

UEFI Interactive Shell v2.2
EDK II
UEFI v2.80 (Das U-Boot, 0x20191000)
Mapping table
       FS0: Alias(s):F0a0:;BLK0:
           /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/Scsi(0,0)
       FS1: Alias(s):HD0a0b:;BLK1:

/VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/Scsi(0,0)/HD(1,MBR,0x6fe3a999,0x400,0x400)
Press ESC in 4 seconds to skip startup.nsh or any other key to continue.
Shell> fs0:
FS0:\> cat description.txt
file system on block device

FS0:\> fs1:
FS1:\> cat description.txt
file system on partition 1

So though a partition table is discovered a file system is mounted on
the block device. In my special case the file system on the block device
really existed and was well separated from partition 1. But typically
expect that there is no file system on the block device if there is a
partition table.

For your convenience I have uploaded the image file to
https://github.com/U-Boot-EFI/test_file_system

Best regards

Heinrich

>   		diskobj->volume = efi_simple_file_system(desc, part,
>   							 diskobj->dp);
>   		ret = efi_add_protocol(&diskobj->header,
>


More information about the U-Boot mailing list