[PATCH 15/26] efi: block: fix sector size mismatch in block device registration and ops

Ahmad Fatoum a.fatoum at barebox.org
Fri Jun 26 01:42:26 PDT 2026


efi_bio_read/efi_bio_write use a hardcoded 512 byte multiplier for the
block sizes, while registration happens with whatever block size the EFI
Block I/O protocol had reported.

Drop the hardcoded 512 byte sector sizes and while at it, use
block_size_bits(), so invalid block sizes are rejected early.

Assisted-by: Codex:gpt-5.5
Signed-off-by: Ahmad Fatoum <a.fatoum at barebox.org>
---
 drivers/block/efi-block-io.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/block/efi-block-io.c b/drivers/block/efi-block-io.c
index 8955a8c2b585..5f38409fb76d 100644
--- a/drivers/block/efi-block-io.c
+++ b/drivers/block/efi-block-io.c
@@ -34,7 +34,7 @@ static int efi_bio_read(struct block_device *blk, void *buffer, sector_t block,
 	efi_status_t efiret;
 
 	efiret = priv->protocol->read(priv->protocol, priv->media_id,
-			block, num_blocks * 512, buffer);
+			block, num_blocks << blk->blockbits, buffer);
 
 	if (EFI_ERROR(efiret))
 		return -efi_errno(efiret);
@@ -49,7 +49,7 @@ static int efi_bio_write(struct block_device *blk,
 	efi_status_t efiret;
 
 	efiret = priv->protocol->write(priv->protocol, priv->media_id,
-			block, num_blocks * 512, (void *)buffer);
+			block, num_blocks << blk->blockbits, (void *)buffer);
 	if (EFI_ERROR(efiret))
 		return -efi_errno(efiret);
 
@@ -115,7 +115,7 @@ static bool is_bio_usbdev(struct efi_device *efidev)
 static int efi_bio_probe(struct efi_device *efidev)
 {
 	bool is_usbdev;
-	int instance;
+	int blockbits, instance;
 	struct efi_bio_priv *priv;
 	struct efi_block_io_media *media;
 	struct device *dev = &efidev->dev;
@@ -124,13 +124,22 @@ static int efi_bio_probe(struct efi_device *efidev)
 
 	BS->handle_protocol(efidev->handle, &efi_block_io_protocol_guid,
 			(void **)&priv->protocol);
-	if (!priv->protocol)
+	if (!priv->protocol) {
+		free(priv);
 		return -ENODEV;
+	}
+
+
+	media = priv->protocol->media;
+	blockbits = block_size_bits(dev, media->block_size);
+	if (blockbits < 0) {
+		free(priv);
+		return blockbits;
+	}
 
 	dev->priv = priv;
 	devinfo_add(dev, efi_bio_print_info);
 
-	media = priv->protocol->media;
 	if (__is_defined(DEBUG))
 		efi_bio_print_info(dev);
 	priv->dev = &efidev->dev;
@@ -147,7 +156,7 @@ static int efi_bio_probe(struct efi_device *efidev)
 		priv->blk.cdev.name = xasprintf("disk%d", instance);
 	}
 
-	priv->blk.blockbits = ffs(media->block_size) - 1;
+	priv->blk.blockbits = blockbits;
 	priv->blk.num_blocks = media->last_block + 1;
 	priv->blk.ops = &efi_bio_ops;
 	priv->blk.dev = &efidev->dev;
-- 
2.47.3




More information about the barebox mailing list