]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[block] Allow for iteration over SAN device list in drive number order
authorMichael Brown <mcb30@ipxe.org>
Tue, 5 Mar 2024 12:50:25 +0000 (12:50 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 5 Mar 2024 13:17:35 +0000 (13:17 +0000)
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>
src/core/sanboot.c
src/include/ipxe/sanboot.h

index 7e3a09e45c87d0b5ea7655facb637054346d0814..5b7a21657b8a5c996ff30054fba246cadc624cdf 100644 (file)
@@ -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;
index b163a94b8ee823d4ce944450f75a640e92715ada..a1b6d7f3d99309e1518c5ec1f11cc5c0af3616f5 100644 (file)
@@ -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,