• Mike Christie's avatar
    target: fix SAM_STAT_BUSY/TASK_SET_FULL handling · 402242c9
    Mike Christie authored
    If the scsi status was not SAM_STAT_GOOD or there was no transport
    sense, we would ignore the scsi status and do a generic not ready
    LUN communication failure check condition failure.
    
    The problem is that LUN COMM failure is treated as a hard error
    sometimes and will cause apps to get IO errors instead of the OS's SCSI
    layer retrying. For example, the tcmu daemon will return SAM_STAT_QUEUE_FULL
    when memory runs low and can still make progress but wants the initiator to
    reduce the work load. Windows will fail this error directly the app
    instead of retrying.
    
    This patch is based on Nick's "target/iblock: Use -EAGAIN/-ENOMEM to
    propigate SAM BUSY/TASK_SET_FULL" patch here:
    
    http://comments.gmane.org/gmane.linux.scsi.target.devel/11301
    
    but instead of only setting SAM_STAT_GOOD, SAM_STAT_TASK_SET_FULL
    and SAM_STAT_BUSY as success, it sets all non check condition status
    as success so they are passed back to the initiator, so passthrough
    type backends can return all SCSI status codes. Since only passthrough
    uses this, I was not sure if we wanted to add checks for non-passthrough
    and specific codes.
    Signed-off-by: default avatarMike Christie <mchristi@redhat.com>
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    402242c9
target_core_transport.c 92 KB