Skip to content

Commit

Permalink
[block] Retry reopening indefinitely for multipath devices
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Mar 27, 2017
1 parent 164378f commit ee35b03
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions src/core/sanboot.c
Expand Up @@ -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 );
Expand All @@ -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 ) );
Expand Down Expand Up @@ -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 )
Expand Down

0 comments on commit ee35b03

Please sign in to comment.