From 8da22a59eecda30087504efa2153ceddacda08fd Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 5 Mar 2024 12:50:25 +0000 Subject: [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 --- src/core/sanboot.c | 25 +++++++++++++++++++++++-- src/include/ipxe/sanboot.h | 1 + 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 @@ -107,6 +107,22 @@ struct san_device * sandev_find ( unsigned int drive ) { return NULL; } +/** + * 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 * @@ -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, -- cgit v1.2.3-55-g7522