• Christof Schmitt's avatar
    [SCSI] zfcp: Dont fail SCSI commands when transitioning to blocked fc_rport · 8830271c
    Christof Schmitt authored
    If an error occurs that triggers the call to fc_remote_port_delete,
    ideally this call would happen before any I/O is passed back to the
    SCSI midlayer through scsi_done. The SCSI midlayer will retry the
    commands and fc_remote_port_chkready will return the correct status
    code.  But with the delay between calling scsi_done in softirq context
    and the call to fc_remote_port_delete from the workqueue, there is a
    window where zfcp returns DID_ERROR. This leads to SCSI error recovery
    which then leads to offline SCSI devices since all recovery actions
    will fail with the rport now being blocked.
    
    In this window, zfcp has to return DID_IMM_RETRY just as the FC
    transport class would do in fc_remote_port_chkready for the blocked
    fc_rport. As soon as the fc_rport is BLOCKED, fc_remote_port_chkready
    will do the right thing.
    
    Additionally, there are two more cases to catch in zfcp_scsi_queuecommand:
    - After the port has been opened, the unit has to be opened. During
      this period I/O has to be retried. This can also be handled with
      DID_IMM_RETRY.
    - If the access to the unit fails, but the port is good, then
      this single unit cannot be accessed and I/O to this unit has to fail
      without involving the FC transport class.
    Reviewed-by: default avatarSwen Schillig <swen@vnet.ibm.com>
    Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    8830271c
zfcp_scsi.c 19.5 KB