• Finn Thain's avatar
    ncr5380: Fix autosense bugs · f27db8eb
    Finn Thain authored
    NCR5380_information_transfer() may re-queue a command for autosense,
    after calling scsi_eh_prep_cmnd(). This creates several possibilities:
    
    1. Reselection may intervene before the re-queued command gets processed.
       If the reconnected command then undergoes autosense, this causes the
       scsi_eh_save data from the previous command to be overwritten.
    
    2. After NCR5380_information_transfer() calls scsi_eh_prep_cmnd(),
       a new REQUEST SENSE command may arrive. This would be queued ahead
       of any command already undergoing autosense, which means the
       scsi_eh_save data might be restored to the wrong command.
    
    3. After NCR5380_information_transfer() calls scsi_eh_prep_cmnd(),
       eh_abort_handler() may abort the command. But the scsi_eh_save data is
       not discarded, which means the scsi_eh_save data might be incorrectly
       restored to the next REQUEST SENSE command issued.
    
    This patch adds a new autosense list so that commands that are re-queued
    because of a CHECK CONDITION result can be kept apart from the REQUEST
    SENSE commands that arrive via queuecommand.
    
    This patch also adds a function dedicated to dequeueing and preparing the
    next command for processing. By refactoring the main loop in this way,
    scsi_eh_save takes place when an autosense command is dequeued rather
    than when re-queued.
    Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
    Tested-by: default avatarOndrej Zary <linux@rainbow-software.org>
    Tested-by: default avatarMichael Schmitz <schmitzmic@gmail.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    f27db8eb
NCR5380.h 13.7 KB