aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Grodzovsky <andrey2805@gmail.com>2016-11-10 09:35:27 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2016-11-12 10:25:37 -0500
commit18f6084a989ba1b38702f9af37a2e4049a924be6 (patch)
tree410beda3e855a9bd33ce1ecf1c5adea8019cb4f1
parent5e5ec1759dd663a1d5a2f10930224dd009e500e8 (diff)
scsi: mpt3sas: Fix secure erase premature termination
This is a work around for a bug with LSI Fusion MPT SAS2 when perfoming secure erase. Due to the very long time the operation takes, commands issued during the erase will time out and will trigger execution of the abort hook. Even though the abort hook is called for the specific command which timed out, this leads to entire device halt (scsi_state terminated) and premature termination of the secure erase. Set device state to busy while ATA passthrough commands are in progress. [mkp: hand applied to 4.9/scsi-fixes, tweaked patch description] Signed-off-by: Andrey Grodzovsky <andrey2805@gmail.com> Acked-by: Sreekanth Reddy <Sreekanth.Reddy@broadcom.com> Cc: <linux-scsi@vger.kernel.org> Cc: Sathya Prakash <sathya.prakash@broadcom.com> Cc: Chaitra P B <chaitra.basappa@broadcom.com> Cc: Suganath Prabu Subramani <suganath-prabu.subramani@broadcom.com> Cc: Sreekanth Reddy <Sreekanth.Reddy@broadcom.com> Cc: Hannes Reinecke <hare@suse.de> Cc: <stable@vger.kernel.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_scsih.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 8aa769a2d919..91b70bc46e7f 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -4010,7 +4010,10 @@ _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
4010 SAM_STAT_CHECK_CONDITION; 4010 SAM_STAT_CHECK_CONDITION;
4011} 4011}
4012 4012
4013 4013static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd)
4014{
4015 return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16);
4016}
4014 4017
4015/** 4018/**
4016 * scsih_qcmd - main scsi request entry point 4019 * scsih_qcmd - main scsi request entry point
@@ -4038,6 +4041,13 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
4038 if (ioc->logging_level & MPT_DEBUG_SCSI) 4041 if (ioc->logging_level & MPT_DEBUG_SCSI)
4039 scsi_print_command(scmd); 4042 scsi_print_command(scmd);
4040 4043
4044 /*
4045 * Lock the device for any subsequent command until command is
4046 * done.
4047 */
4048 if (ata_12_16_cmd(scmd))
4049 scsi_internal_device_block(scmd->device);
4050
4041 sas_device_priv_data = scmd->device->hostdata; 4051 sas_device_priv_data = scmd->device->hostdata;
4042 if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { 4052 if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
4043 scmd->result = DID_NO_CONNECT << 16; 4053 scmd->result = DID_NO_CONNECT << 16;
@@ -4613,6 +4623,9 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
4613 if (scmd == NULL) 4623 if (scmd == NULL)
4614 return 1; 4624 return 1;
4615 4625
4626 if (ata_12_16_cmd(scmd))
4627 scsi_internal_device_unblock(scmd->device, SDEV_RUNNING);
4628
4616 mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); 4629 mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
4617 4630
4618 if (mpi_reply == NULL) { 4631 if (mpi_reply == NULL) {