diff options
| author | jmcneill <jmcneill@NetBSD.org> | 2020-11-28 15:24:05 +0000 |
|---|---|---|
| committer | jmcneill <jmcneill@NetBSD.org> | 2020-11-28 15:24:05 +0000 |
| commit | bb91bcced2b2983bc08a675bcf0e7bab328de139 (patch) | |
| tree | c7eaba3eb4db31d5b93ec666b430f71134ef792f /sys/stand | |
| parent | aa56c0c16fbeefb1140941abba8723cc672dc8e7 (diff) | |
Deal with devices that report either 512 or 2048 as logical block size
for CD9660 file-systems.
Diffstat (limited to 'sys/stand')
| -rw-r--r-- | sys/stand/efiboot/efiblock.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/sys/stand/efiboot/efiblock.c b/sys/stand/efiboot/efiblock.c index b674189e983..edfeeb44c9d 100644 --- a/sys/stand/efiboot/efiblock.c +++ b/sys/stand/efiboot/efiblock.c @@ -1,4 +1,4 @@ -/* $NetBSD: efiblock.c,v 1.9 2020/10/18 18:05:48 tnn Exp $ */ +/* $NetBSD: efiblock.c,v 1.10 2020/11/28 15:24:05 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <nonaka@netbsd.org> @@ -127,28 +127,43 @@ efi_block_find_partitions_cd9660(struct efi_block_dev *bdev) EFI_LBA lba; UINT32 sz; + if (bdev->bio->Media->BlockSize != DEV_BSIZE && + bdev->bio->Media->BlockSize != ISO_DEFAULT_BLOCK_SIZE) { + return ENXIO; + } + sz = __MAX(sizeof(*vd), bdev->bio->Media->BlockSize); sz = roundup(sz, bdev->bio->Media->BlockSize); - if ((buf = efi_block_allocate_device_buffer(bdev, sz, &buf_start)) == NULL) + if ((buf = efi_block_allocate_device_buffer(bdev, sz, &buf_start)) == NULL) { return ENOMEM; + } for (lba = 16;; lba++) { - status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, bdev->bio, bdev->media_id, - lba, sz, buf_start); - if (EFI_ERROR(status)) + status = uefi_call_wrapper(bdev->bio->ReadBlocks, 5, + bdev->bio, + bdev->media_id, + lba * ISO_DEFAULT_BLOCK_SIZE / bdev->bio->Media->BlockSize, + sz, + buf_start); + if (EFI_ERROR(status)) { goto io_error; + } vd = (struct iso_primary_descriptor *)buf_start; - if (memcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0) + if (memcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0) { goto io_error; - if (isonum_711(vd->type) == ISO_VD_END) + } + if (isonum_711(vd->type) == ISO_VD_END) { goto io_error; - if (isonum_711(vd->type) == ISO_VD_PRIMARY) + } + if (isonum_711(vd->type) == ISO_VD_PRIMARY) { break; + } } - if (isonum_723(vd->logical_block_size) != ISO_DEFAULT_BLOCK_SIZE) + if (isonum_723(vd->logical_block_size) != ISO_DEFAULT_BLOCK_SIZE) { goto io_error; + } bpart = alloc(sizeof(*bpart)); bpart->index = 0; @@ -593,6 +608,7 @@ efi_block_strategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf, dblk += le64toh(bpart->gpt.ent.ent_lba_start); break; case EFI_BLOCK_PART_CD9660: + dblk *= ISO_DEFAULT_BLOCK_SIZE / bpart->bdev->bio->Media->BlockSize; break; default: return EINVAL; @@ -603,8 +619,9 @@ efi_block_strategy(void *devdata, int rw, daddr_t dblk, size_t size, void *buf, allocated_buf = NULL; aligned_buf = buf; } else if ((allocated_buf = efi_block_allocate_device_buffer(bpart->bdev, - size, &aligned_buf)) == NULL) + size, &aligned_buf)) == NULL) { return ENOMEM; + } status = uefi_call_wrapper(bpart->bdev->bio->ReadBlocks, 5, bpart->bdev->bio, bpart->bdev->media_id, dblk, size, aligned_buf); |
