[PATCH master 23/39] efi: loader: initialize block IO ops before installing protocol

Ahmad Fatoum a.fatoum at pengutronix.de
Mon Feb 16 00:44:23 PST 2026


efi_disk_add_cdev() installs the EFI_BLOCK_IO_PROTOCOL with
efi_install_multiple_protocol_interfaces() before populating the ops
structure and media fields. Between installation and initialization,
any consumer of the protocol (e.g., efi_simple_file_system() called
immediately after) would see zeroed-out function pointers.

Move the ops, media, and cdev initialization before the protocol
installation so the interface is fully populated when it becomes
visible.

Co-Authored-By: Claude Opus 4.6 <noreply at anthropic.com>
Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
 efi/loader/protocols/disk.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/efi/loader/protocols/disk.c b/efi/loader/protocols/disk.c
index b4a3a7ab0c97..5494f9197cb4 100644
--- a/efi/loader/protocols/disk.c
+++ b/efi/loader/protocols/disk.c
@@ -248,6 +248,18 @@ static efi_status_t efi_disk_add_cdev(efi_handle_t parent,
 		diskobj->dp = efi_dp_from_cdev(cdev, true);
 	}
 
+	diskobj->media.removable_media = removable;
+	diskobj->media.media_present = true;
+	diskobj->media.read_only = cdev->flags & DEVFS_PARTITION_READONLY;
+	diskobj->media.block_size = 512;
+	diskobj->media.io_align = 512;
+	diskobj->media.last_block = cdev->size / diskobj->media.block_size - 1;
+
+	diskobj->ops = block_io_disk_template;
+	diskobj->ops.media = &diskobj->media;
+
+	diskobj->cdev = cdev;
+
 	/*
 	 * Install the device path and the block IO protocol.
 	 *
@@ -272,18 +284,6 @@ static efi_status_t efi_disk_add_cdev(efi_handle_t parent,
 			return ret;
 	}
 
-	diskobj->media.removable_media = removable;
-	diskobj->media.media_present = true;
-	diskobj->media.read_only = cdev->flags & DEVFS_PARTITION_READONLY;
-	diskobj->media.block_size = 512;
-	diskobj->media.io_align = 512;
-	diskobj->media.last_block = cdev->size / diskobj->media.block_size - 1;
-
-	diskobj->ops = block_io_disk_template;
-	diskobj->ops.media = &diskobj->media;
-
-	diskobj->cdev = cdev;
-
 	if (disk)
 		*disk = diskobj;
 
-- 
2.47.3




More information about the barebox mailing list