Skip to content

Commit 18f6084

Browse files
andrey2805martinkpetersen
authored andcommitted
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>
1 parent 5e5ec17 commit 18f6084

1 file changed

Lines changed: 14 additions & 1 deletion

File tree

drivers/scsi/mpt3sas/mpt3sas_scsih.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4010,7 +4010,10 @@ _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
40104010
SAM_STAT_CHECK_CONDITION;
40114011
}
40124012

4013-
4013+
static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd)
4014+
{
4015+
return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16);
4016+
}
40144017

40154018
/**
40164019
* scsih_qcmd - main scsi request entry point
@@ -4038,6 +4041,13 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
40384041
if (ioc->logging_level & MPT_DEBUG_SCSI)
40394042
scsi_print_command(scmd);
40404043

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+
40414051
sas_device_priv_data = scmd->device->hostdata;
40424052
if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
40434053
scmd->result = DID_NO_CONNECT << 16;
@@ -4613,6 +4623,9 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
46134623
if (scmd == NULL)
46144624
return 1;
46154625

4626+
if (ata_12_16_cmd(scmd))
4627+
scsi_internal_device_unblock(scmd->device, SDEV_RUNNING);
4628+
46164629
mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
46174630

46184631
if (mpi_reply == NULL) {

0 commit comments

Comments
 (0)