[block] Add basic multipath support

Add basic support for multipath block devices.  The "sanboot" and
"sanhook" commands now accept a list of SAN URIs.  We open all URIs
concurrently.  The first connection to become available for issuing
block device commands is marked as the active path and used for all
subsequent commands; all other connections are then closed.  Whenever
the active path fails, we reopen all URIs and repeat the process.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2017-03-26 15:12:11 +03:00
parent c212597336
commit bb5a54b79a
10 changed files with 327 additions and 128 deletions

View File

@@ -109,7 +109,8 @@ const struct setting skip_san_boot_setting __setting ( SETTING_SANBOOT_EXTRA,
* Boot from filename and root-path URIs
*
* @v filename Filename
* @v root_path Root path
* @v root_paths Root path(s)
* @v root_path_count Number of root paths
* @v drive SAN drive (if applicable)
* @v flags Boot action flags
* @ret rc Return status code
@@ -120,14 +121,14 @@ const struct setting skip_san_boot_setting __setting ( SETTING_SANBOOT_EXTRA,
* provide backwards compatibility for the "keep-san" and
* "skip-san-boot" options.
*/
int uriboot ( struct uri *filename, struct uri *root_path, int drive,
unsigned int flags ) {
int uriboot ( struct uri *filename, struct uri **root_paths,
unsigned int root_path_count, int drive, unsigned int flags ) {
struct image *image;
int rc;
/* Hook SAN device, if applicable */
if ( root_path ) {
drive = san_hook ( root_path, drive );
if ( root_path_count ) {
drive = san_hook ( drive, root_paths, root_path_count );
if ( drive < 0 ) {
rc = drive;
printf ( "Could not open SAN device: %s\n",
@@ -396,7 +397,8 @@ int netboot ( struct net_device *netdev ) {
}
/* Boot using next server, filename and root path */
if ( ( rc = uriboot ( filename, root_path, san_default_drive(),
if ( ( rc = uriboot ( filename, &root_path, ( root_path ? 1 : 0 ),
san_default_drive(),
( root_path ? 0 : URIBOOT_NO_SAN ) ) ) != 0 )
goto err_uriboot;

View File

@@ -378,7 +378,7 @@ int pxe_menu_boot ( struct net_device *netdev ) {
return -ENOMEM;
/* Attempt boot */
rc = uriboot ( uri, NULL, 0, URIBOOT_NO_SAN );
rc = uriboot ( uri, NULL, 0, 0, URIBOOT_NO_SAN );
uri_put ( uri );
return rc;
}