mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 04:21:09 -04:00
Merge branch 'for-7.0-fixes' into for-7.1
This commit is contained in:
@@ -4188,7 +4188,11 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
|
||||
{ "ST3320[68]13AS", "SD1[5-9]", ATA_QUIRK_NONCQ |
|
||||
ATA_QUIRK_FIRMWARE_WARN },
|
||||
|
||||
/* ADATA devices with LPM issues. */
|
||||
{ "ADATA SU680", NULL, ATA_QUIRK_NOLPM },
|
||||
|
||||
/* Seagate disks with LPM issues */
|
||||
{ "ST1000DM010-2EP102", NULL, ATA_QUIRK_NOLPM },
|
||||
{ "ST2000DM008-2FR102", NULL, ATA_QUIRK_NOLPM },
|
||||
|
||||
/* drives which fail FPDMA_AA activation (some may freeze afterwards)
|
||||
@@ -4231,6 +4235,7 @@ static const struct ata_dev_quirks_entry __ata_dev_quirks[] = {
|
||||
/* Devices that do not need bridging limits applied */
|
||||
{ "MTRON MSP-SATA*", NULL, ATA_QUIRK_BRIDGE_OK },
|
||||
{ "BUFFALO HD-QSU2/R5", NULL, ATA_QUIRK_BRIDGE_OK },
|
||||
{ "QEMU HARDDISK", "2.5+", ATA_QUIRK_BRIDGE_OK },
|
||||
|
||||
/* Devices which aren't very happy with higher link speeds */
|
||||
{ "WD My Book", NULL, ATA_QUIRK_1_5_GBPS },
|
||||
@@ -6274,10 +6279,6 @@ static void ata_port_detach(struct ata_port *ap)
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure the deferred qc work finished. */
|
||||
cancel_work_sync(&ap->deferred_qc_work);
|
||||
WARN_ON(ap->deferred_qc);
|
||||
|
||||
/* Tell EH to disable all devices */
|
||||
ap->pflags |= ATA_PFLAG_UNLOADING;
|
||||
ata_port_schedule_eh(ap);
|
||||
@@ -6288,9 +6289,11 @@ static void ata_port_detach(struct ata_port *ap)
|
||||
/* wait till EH commits suicide */
|
||||
ata_port_wait_eh(ap);
|
||||
|
||||
/* it better be dead now */
|
||||
/* It better be dead now and not have any remaining deferred qc. */
|
||||
WARN_ON(!(ap->pflags & ATA_PFLAG_UNLOADED));
|
||||
WARN_ON(ap->deferred_qc);
|
||||
|
||||
cancel_work_sync(&ap->deferred_qc_work);
|
||||
cancel_delayed_work_sync(&ap->hotplug_task);
|
||||
cancel_delayed_work_sync(&ap->scsi_rescan_task);
|
||||
|
||||
|
||||
@@ -648,12 +648,29 @@ int ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *ap,
|
||||
set_host_byte(scmd, DID_OK);
|
||||
|
||||
ata_qc_for_each_raw(ap, qc, i) {
|
||||
if (qc->flags & ATA_QCFLAG_ACTIVE &&
|
||||
qc->scsicmd == scmd)
|
||||
if (qc->scsicmd != scmd)
|
||||
continue;
|
||||
if ((qc->flags & ATA_QCFLAG_ACTIVE) ||
|
||||
qc == ap->deferred_qc)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i < ATA_MAX_QUEUE) {
|
||||
if (i < ATA_MAX_QUEUE && qc == ap->deferred_qc) {
|
||||
/*
|
||||
* This is a deferred command that timed out while
|
||||
* waiting for the command queue to drain. Since the qc
|
||||
* is not active yet (deferred_qc is still set, so the
|
||||
* deferred qc work has not issued the command yet),
|
||||
* simply signal the timeout by finishing the SCSI
|
||||
* command and clear the deferred qc to prevent the
|
||||
* deferred qc work from issuing this qc.
|
||||
*/
|
||||
WARN_ON_ONCE(qc->flags & ATA_QCFLAG_ACTIVE);
|
||||
ap->deferred_qc = NULL;
|
||||
cancel_work(&ap->deferred_qc_work);
|
||||
set_host_byte(scmd, DID_TIME_OUT);
|
||||
scsi_eh_finish_cmd(scmd, &ap->eh_done_q);
|
||||
} else if (i < ATA_MAX_QUEUE) {
|
||||
/* the scmd has an associated qc */
|
||||
if (!(qc->flags & ATA_QCFLAG_EH)) {
|
||||
/* which hasn't failed yet, timeout */
|
||||
|
||||
@@ -1699,6 +1699,7 @@ void ata_scsi_requeue_deferred_qc(struct ata_port *ap)
|
||||
*/
|
||||
if (qc) {
|
||||
ap->deferred_qc = NULL;
|
||||
cancel_work(&ap->deferred_qc_work);
|
||||
ata_scsi_qc_done(qc, true, DID_SOFT_ERROR << 16);
|
||||
}
|
||||
}
|
||||
@@ -3596,7 +3597,7 @@ static unsigned int ata_scsiop_maint_in(struct ata_device *dev,
|
||||
|
||||
if (cdb[2] != 1 && cdb[2] != 3) {
|
||||
ata_dev_warn(dev, "invalid command format %d\n", cdb[2]);
|
||||
ata_scsi_set_invalid_field(dev, cmd, 1, 0xff);
|
||||
ata_scsi_set_invalid_field(dev, cmd, 2, 0xff);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user