|
@@ -498,12 +498,18 @@ sandev_command ( struct san_device *sandev,
|
498
|
498
|
/* Delay reopening attempts */
|
499
|
499
|
sleep_fixed ( SAN_REOPEN_DELAY_SECS );
|
500
|
500
|
|
|
501
|
+ /* Retry opening indefinitely for multipath devices */
|
|
502
|
+ if ( sandev->paths <= 1 )
|
|
503
|
+ retries++;
|
|
504
|
+
|
501
|
505
|
continue;
|
502
|
506
|
}
|
503
|
507
|
|
504
|
508
|
/* Initiate command */
|
505
|
|
- if ( ( rc = command ( sandev, params ) ) != 0 )
|
|
509
|
+ if ( ( rc = command ( sandev, params ) ) != 0 ) {
|
|
510
|
+ retries++;
|
506
|
511
|
continue;
|
|
512
|
+ }
|
507
|
513
|
|
508
|
514
|
/* Start expiry timer */
|
509
|
515
|
start_timer_fixed ( &sandev->timer, SAN_COMMAND_TIMEOUT );
|
|
@@ -513,12 +519,14 @@ sandev_command ( struct san_device *sandev,
|
513
|
519
|
step();
|
514
|
520
|
|
515
|
521
|
/* Check command status */
|
516
|
|
- if ( ( rc = sandev->command_rc ) != 0 )
|
|
522
|
+ if ( ( rc = sandev->command_rc ) != 0 ) {
|
|
523
|
+ retries++;
|
517
|
524
|
continue;
|
|
525
|
+ }
|
518
|
526
|
|
519
|
527
|
return 0;
|
520
|
528
|
|
521
|
|
- } while ( ++retries <= san_retries );
|
|
529
|
+ } while ( retries <= san_retries );
|
522
|
530
|
|
523
|
531
|
/* Sanity check */
|
524
|
532
|
assert ( ! timer_running ( &sandev->timer ) );
|
|
@@ -728,6 +736,13 @@ int register_sandev ( struct san_device *sandev ) {
|
728
|
736
|
return -EADDRINUSE;
|
729
|
737
|
}
|
730
|
738
|
|
|
739
|
+ /* Check that device is capable of being opened (i.e. that all
|
|
740
|
+ * URIs are well-formed and that at least one path is
|
|
741
|
+ * working).
|
|
742
|
+ */
|
|
743
|
+ if ( ( rc = sandev_reopen ( sandev ) ) != 0 )
|
|
744
|
+ return rc;
|
|
745
|
+
|
731
|
746
|
/* Read device capacity */
|
732
|
747
|
if ( ( rc = sandev_command ( sandev, sandev_command_read_capacity,
|
733
|
748
|
NULL ) ) != 0 )
|