[infiniband] Allow SRP reconnection attempts even after reporting failures
authorMichael Brown <mcb30@etherboot.org>
Mon, 10 Aug 2009 01:20:21 +0000 (02:20 +0100)
committerMichael Brown <mcb30@etherboot.org>
Mon, 10 Aug 2009 21:30:56 +0000 (22:30 +0100)
With iSCSI, connection attempts are expensive; it may take many
seconds to determine that a connection will fail.  SRP connection
attempts are much less expensive, so we may as well avoid the
"optimisation" of declaring a state of permanent failure after a
certain number of attempts.  This allows a gPXE SRP initiator to
resume operations after an arbitrary amount of SRP target downtime.

src/drivers/block/srp.c
src/include/gpxe/srp.h

index f50f194..1d0799a 100644 (file)
@@ -80,19 +80,16 @@ static void srp_fail ( struct srp_device *srp, int rc ) {
        /* Clear session state */
        srp->state = 0;
 
-       /* Increment retry count */
-       srp->retry_count++;
-
-       /* If we have reached the retry limit, permanently abort the
-        * session.
-        */
+       /* If we have reached the retry limit, report the failure */
        if ( srp->retry_count >= SRP_MAX_RETRIES ) {
-               srp->instant_rc = rc;
                srp_scsi_done ( srp, rc );
                return;
        }
 
-       /* Otherwise, try to reopen the connection */
+       /* Otherwise, increment the retry count and try to reopen the
+        * connection
+        */
+       srp->retry_count++;
        srp_login ( srp );
 }
 
@@ -445,10 +442,6 @@ static int srp_command ( struct scsi_device *scsi,
        struct srp_device *srp =
                container_of ( scsi->backend, struct srp_device, refcnt );
 
-       /* Return instant failure, if we have already aborted the session */
-       if ( srp->instant_rc )
-               return srp->instant_rc;
-
        /* Store SCSI command */
        if ( srp->command ) {
                DBGC ( srp, "SRP %p cannot handle concurrent SCSI commands\n",
index 75ec7b8..85f39b9 100644 (file)
@@ -828,12 +828,6 @@ struct srp_device {
        unsigned int state;
        /** Retry counter */
        unsigned int retry_count;
-       /** Instant return status code
-        *
-        * Used to avoid retrying the connection on every new SCSI
-        * command after the retry count has been exceeded.
-        */
-       int instant_rc;
        /** Current SCSI command */
        struct scsi_command *command;