[SCSI] fc-transport: Close state transition-window during rport deletion.

Andrew Vasquez wrote:
> fc-transport: Close state transition-window during rport deletion.
>
> After an rport's state has transitioned to FC_PORTSTATE_BLOCKED,
> but, prior to making the upcall to 'block' the scsi-target
> associated with an rport, queued commands can recycle and
> ultimately run out of retries causing failures to propagate to
> upper-level drivers. Close this transition-window by returning
> the non-'retries' modifying DID_IMM_RETRY status for submitted
> I/Os.

The same can happen for iscsi when transitioning from logged in
to failed and blocking the sdevs.

This patch converts iscsi and fc's transitions back to use DID_IMM_RETRY
instead of DID_TRANSPORT_DISRUPTED which has a limited number of retries
that we do not want to use for handling this race.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
[Addition of iscsi and fc port online devloss case conversion by Mike Christie]
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>

authored by Andrew Vasquez and committed by James Bottomley 9a1a69a1 c53a284f

+3 -3
+1 -1
drivers/scsi/scsi_transport_iscsi.c
··· 357 357 err = 0; 358 358 break; 359 359 case ISCSI_SESSION_FAILED: 360 - err = DID_TRANSPORT_DISRUPTED << 16; 360 + err = DID_IMM_RETRY << 16; 361 361 break; 362 362 case ISCSI_SESSION_FREE: 363 363 err = DID_TRANSPORT_FAILFAST << 16;
+2 -2
include/scsi/scsi_transport_fc.h
··· 680 680 if (rport->roles & FC_PORT_ROLE_FCP_TARGET) 681 681 result = 0; 682 682 else if (rport->flags & FC_RPORT_DEVLOSS_PENDING) 683 - result = DID_TRANSPORT_DISRUPTED << 16; 683 + result = DID_IMM_RETRY << 16; 684 684 else 685 685 result = DID_NO_CONNECT << 16; 686 686 break; ··· 688 688 if (rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT) 689 689 result = DID_TRANSPORT_FAILFAST << 16; 690 690 else 691 - result = DID_TRANSPORT_DISRUPTED << 16; 691 + result = DID_IMM_RETRY << 16; 692 692 break; 693 693 default: 694 694 result = DID_NO_CONNECT << 16;