summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2024-03-05 13:50:25 +0100
committerMichael Brown2024-03-05 14:17:35 +0100
commit8da22a59eecda30087504efa2153ceddacda08fd (patch)
tree1bdcb92b77150b7f4d239f85dfb95b8127219e59
parent[efi] Generalise block device boot to support arbitrary EFI handles (diff)
downloadipxe-8da22a59eecda30087504efa2153ceddacda08fd.tar.gz
ipxe-8da22a59eecda30087504efa2153ceddacda08fd.tar.xz
ipxe-8da22a59eecda30087504efa2153ceddacda08fd.zip
[block] Allow for iteration over SAN device list in drive number order
Maintain the SAN device list in order of drive number, and provide sandev_next() to locate the first SAN device at or above a given drive number. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/core/sanboot.c25
-rw-r--r--src/include/ipxe/sanboot.h1
2 files changed, 24 insertions, 2 deletions
diff --git a/src/core/sanboot.c b/src/core/sanboot.c
index 7e3a09e4..5b7a2165 100644
--- a/src/core/sanboot.c
+++ b/src/core/sanboot.c
@@ -108,6 +108,22 @@ struct san_device * sandev_find ( unsigned int drive ) {
}
/**
+ * Find next SAN device by drive number
+ *
+ * @v drive Minimum drive number
+ * @ret sandev SAN device, or NULL
+ */
+struct san_device * sandev_next ( unsigned int drive ) {
+ struct san_device *sandev;
+
+ list_for_each_entry ( sandev, &san_devices, list ) {
+ if ( sandev->drive >= drive )
+ return sandev;
+ }
+ return NULL;
+}
+
+/**
* Free SAN device
*
* @v refcnt Reference count
@@ -870,6 +886,7 @@ struct san_device * alloc_sandev ( struct uri **uris, unsigned int count,
*/
int register_sandev ( struct san_device *sandev, unsigned int drive,
unsigned int flags ) {
+ struct san_device *before;
int rc;
/* Check that drive number is not in use */
@@ -903,8 +920,12 @@ int register_sandev ( struct san_device *sandev, unsigned int drive,
if ( ( rc = sandev_parse_iso9660 ( sandev ) ) != 0 )
goto err_iso9660;
- /* Add to list of SAN devices */
- list_add_tail ( &sandev->list, &san_devices );
+ /* Add to list of SAN devices, in drive order */
+ for_each_sandev ( before ) {
+ if ( before->drive > sandev->drive )
+ break;
+ }
+ list_add_tail ( &sandev->list, &before->list );
DBGC ( sandev->drive, "SAN %#02x registered\n", sandev->drive );
return 0;
diff --git a/src/include/ipxe/sanboot.h b/src/include/ipxe/sanboot.h
index b163a94b..a1b6d7f3 100644
--- a/src/include/ipxe/sanboot.h
+++ b/src/include/ipxe/sanboot.h
@@ -234,6 +234,7 @@ static inline int sandev_needs_reopen ( struct san_device *sandev ) {
}
extern struct san_device * sandev_find ( unsigned int drive );
+extern struct san_device * sandev_next ( unsigned int drive );
extern int sandev_reopen ( struct san_device *sandev );
extern int sandev_reset ( struct san_device *sandev );
extern int sandev_read ( struct san_device *sandev, uint64_t lba,