Module Name:    src
Committed By:   jmcneill
Date:           Sat Nov 28 15:24:05 UTC 2020

Modified Files:
        src/sys/stand/efiboot: efiblock.c

Log Message:
Deal with devices that report either 512 or 2048 as logical block size
for CD9660 file-systems.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/stand/efiboot/efiblock.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/stand/efiboot/efiblock.c
diff -u src/sys/stand/efiboot/efiblock.c:1.9 src/sys/stand/efiboot/efiblock.c:1.10
--- src/sys/stand/efiboot/efiblock.c:1.9	Sun Oct 18 18:05:48 2020
+++ src/sys/stand/efiboot/efiblock.c	Sat Nov 28 15:24:05 2020
@@ -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 <[email protected]>
@@ -127,28 +127,43 @@ efi_block_find_partitions_cd9660(struct 
 	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
 		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
 		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);

Reply via email to