]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[block] Retry reopening indefinitely for multipath devices
authorMichael Brown <mcb30@ipxe.org>
Mon, 27 Mar 2017 10:18:14 +0000 (13:18 +0300)
committerMichael Brown <mcb30@ipxe.org>
Mon, 27 Mar 2017 12:41:22 +0000 (15:41 +0300)
For multipath SAN devices, verify that the device is capable of being
opened (i.e. that all URIs are parseable and that at least one path is
alive) and thereafter retry indefinitely to reopen the device as
needed.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/sanboot.c

index efab3d02fe81f0649f1a278c29b9168c44de6dfb..8eb54b7cce6f7d202c6874177655771ec954e7ce 100644 (file)
@@ -498,12 +498,18 @@ sandev_command ( struct san_device *sandev,
                        /* Delay reopening attempts */
                        sleep_fixed ( SAN_REOPEN_DELAY_SECS );
 
+                       /* Retry opening indefinitely for multipath devices */
+                       if ( sandev->paths <= 1 )
+                               retries++;
+
                        continue;
                }
 
                /* Initiate command */
-               if ( ( rc = command ( sandev, params ) ) != 0 )
+               if ( ( rc = command ( sandev, params ) ) != 0 ) {
+                       retries++;
                        continue;
+               }
 
                /* Start expiry timer */
                start_timer_fixed ( &sandev->timer, SAN_COMMAND_TIMEOUT );
@@ -513,12 +519,14 @@ sandev_command ( struct san_device *sandev,
                        step();
 
                /* Check command status */
-               if ( ( rc = sandev->command_rc ) != 0 )
+               if ( ( rc = sandev->command_rc ) != 0 ) {
+                       retries++;
                        continue;
+               }
 
                return 0;
 
-       } while ( ++retries <= san_retries );
+       } while ( retries <= san_retries );
 
        /* Sanity check */
        assert ( ! timer_running ( &sandev->timer ) );
@@ -728,6 +736,13 @@ int register_sandev ( struct san_device *sandev ) {
                return -EADDRINUSE;
        }
 
+       /* Check that device is capable of being opened (i.e. that all
+        * URIs are well-formed and that at least one path is
+        * working).
+        */
+       if ( ( rc = sandev_reopen ( sandev ) ) != 0 )
+               return rc;
+
        /* Read device capacity */
        if ( ( rc = sandev_command ( sandev, sandev_command_read_capacity,
                                     NULL ) ) != 0 )