Revert "libata-eh: Set 'information' field for autosense"
This reverts commit a1524f226a
.
As implemented, ACS-4 sense reporting for ATA devices bypasses error
diagnosis and handling in libata degrading EH behavior significantly.
Revert the related changes for now.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Hannes Reinecke <hare@suse.de>
Cc: stable@vger.kernel.org #v4.1+
This commit is contained in:
parent
8b34fe593e
commit
fe16d4f202
|
@ -694,11 +694,11 @@ static int ata_rwcmd_protocol(struct ata_taskfile *tf, struct ata_device *dev)
|
||||||
* RETURNS:
|
* RETURNS:
|
||||||
* Block address read from @tf.
|
* Block address read from @tf.
|
||||||
*/
|
*/
|
||||||
u64 ata_tf_read_block(const struct ata_taskfile *tf, struct ata_device *dev)
|
u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev)
|
||||||
{
|
{
|
||||||
u64 block = 0;
|
u64 block = 0;
|
||||||
|
|
||||||
if (!dev || tf->flags & ATA_TFLAG_LBA) {
|
if (tf->flags & ATA_TFLAG_LBA) {
|
||||||
if (tf->flags & ATA_TFLAG_LBA48) {
|
if (tf->flags & ATA_TFLAG_LBA48) {
|
||||||
block |= (u64)tf->hob_lbah << 40;
|
block |= (u64)tf->hob_lbah << 40;
|
||||||
block |= (u64)tf->hob_lbam << 32;
|
block |= (u64)tf->hob_lbam << 32;
|
||||||
|
|
|
@ -1864,7 +1864,6 @@ void ata_eh_analyze_ncq_error(struct ata_link *link)
|
||||||
ata_dev_dbg(dev, "NCQ Autosense %02x/%02x/%02x\n",
|
ata_dev_dbg(dev, "NCQ Autosense %02x/%02x/%02x\n",
|
||||||
sense_key, asc, ascq);
|
sense_key, asc, ascq);
|
||||||
ata_scsi_set_sense(qc->scsicmd, sense_key, asc, ascq);
|
ata_scsi_set_sense(qc->scsicmd, sense_key, asc, ascq);
|
||||||
ata_scsi_set_sense_information(qc->scsicmd, &qc->result_tf);
|
|
||||||
qc->flags |= ATA_QCFLAG_SENSE_VALID;
|
qc->flags |= ATA_QCFLAG_SENSE_VALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1907,8 +1906,6 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
|
||||||
tmp = ata_eh_request_sense(qc, qc->scsicmd);
|
tmp = ata_eh_request_sense(qc, qc->scsicmd);
|
||||||
if (tmp)
|
if (tmp)
|
||||||
qc->err_mask |= tmp;
|
qc->err_mask |= tmp;
|
||||||
else
|
|
||||||
ata_scsi_set_sense_information(qc->scsicmd, tf);
|
|
||||||
} else {
|
} else {
|
||||||
ata_dev_warn(qc->dev, "sense data available but port frozen\n");
|
ata_dev_warn(qc->dev, "sense data available but port frozen\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -280,18 +280,6 @@ void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
|
||||||
scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq);
|
scsi_build_sense_buffer(0, cmd->sense_buffer, sk, asc, ascq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ata_scsi_set_sense_information(struct scsi_cmnd *cmd,
|
|
||||||
const struct ata_taskfile *tf)
|
|
||||||
{
|
|
||||||
u64 information;
|
|
||||||
|
|
||||||
if (!cmd)
|
|
||||||
return;
|
|
||||||
|
|
||||||
information = ata_tf_read_block(tf, NULL);
|
|
||||||
scsi_set_sense_information(cmd->sense_buffer, information);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr,
|
ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
|
|
|
@ -67,8 +67,7 @@ extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag);
|
||||||
extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
|
extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
|
||||||
u64 block, u32 n_block, unsigned int tf_flags,
|
u64 block, u32 n_block, unsigned int tf_flags,
|
||||||
unsigned int tag);
|
unsigned int tag);
|
||||||
extern u64 ata_tf_read_block(const struct ata_taskfile *tf,
|
extern u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev);
|
||||||
struct ata_device *dev);
|
|
||||||
extern unsigned ata_exec_internal(struct ata_device *dev,
|
extern unsigned ata_exec_internal(struct ata_device *dev,
|
||||||
struct ata_taskfile *tf, const u8 *cdb,
|
struct ata_taskfile *tf, const u8 *cdb,
|
||||||
int dma_dir, void *buf, unsigned int buflen,
|
int dma_dir, void *buf, unsigned int buflen,
|
||||||
|
@ -139,8 +138,6 @@ extern int ata_scsi_add_hosts(struct ata_host *host,
|
||||||
extern void ata_scsi_scan_host(struct ata_port *ap, int sync);
|
extern void ata_scsi_scan_host(struct ata_port *ap, int sync);
|
||||||
extern int ata_scsi_offline_dev(struct ata_device *dev);
|
extern int ata_scsi_offline_dev(struct ata_device *dev);
|
||||||
extern void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq);
|
extern void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq);
|
||||||
extern void ata_scsi_set_sense_information(struct scsi_cmnd *cmd,
|
|
||||||
const struct ata_taskfile *tf);
|
|
||||||
extern void ata_scsi_media_change_notify(struct ata_device *dev);
|
extern void ata_scsi_media_change_notify(struct ata_device *dev);
|
||||||
extern void ata_scsi_hotplug(struct work_struct *work);
|
extern void ata_scsi_hotplug(struct work_struct *work);
|
||||||
extern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
|
extern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
#include <asm/unaligned.h>
|
|
||||||
|
|
||||||
#include <scsi/scsi.h>
|
#include <scsi/scsi.h>
|
||||||
#include <scsi/scsi_cmnd.h>
|
#include <scsi/scsi_cmnd.h>
|
||||||
|
@ -2523,33 +2522,3 @@ void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(scsi_build_sense_buffer);
|
EXPORT_SYMBOL(scsi_build_sense_buffer);
|
||||||
|
|
||||||
/**
|
|
||||||
* scsi_set_sense_information - set the information field in a
|
|
||||||
* formatted sense data buffer
|
|
||||||
* @buf: Where to build sense data
|
|
||||||
* @info: 64-bit information value to be set
|
|
||||||
*
|
|
||||||
**/
|
|
||||||
void scsi_set_sense_information(u8 *buf, u64 info)
|
|
||||||
{
|
|
||||||
if ((buf[0] & 0x7f) == 0x72) {
|
|
||||||
u8 *ucp, len;
|
|
||||||
|
|
||||||
len = buf[7];
|
|
||||||
ucp = (char *)scsi_sense_desc_find(buf, len + 8, 0);
|
|
||||||
if (!ucp) {
|
|
||||||
buf[7] = len + 0xa;
|
|
||||||
ucp = buf + 8 + len;
|
|
||||||
}
|
|
||||||
ucp[0] = 0;
|
|
||||||
ucp[1] = 0xa;
|
|
||||||
ucp[2] = 0x80; /* Valid bit */
|
|
||||||
ucp[3] = 0;
|
|
||||||
put_unaligned_be64(info, &ucp[4]);
|
|
||||||
} else if ((buf[0] & 0x7f) == 0x70) {
|
|
||||||
buf[0] |= 0x80;
|
|
||||||
put_unaligned_be64(info, &buf[3]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(scsi_set_sense_information);
|
|
||||||
|
|
|
@ -28,7 +28,6 @@ extern int scsi_get_sense_info_fld(const u8 * sense_buffer, int sb_len,
|
||||||
u64 * info_out);
|
u64 * info_out);
|
||||||
|
|
||||||
extern void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq);
|
extern void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq);
|
||||||
extern void scsi_set_sense_information(u8 *buf, u64 info);
|
|
||||||
|
|
||||||
extern int scsi_ioctl_reset(struct scsi_device *, int __user *);
|
extern int scsi_ioctl_reset(struct scsi_device *, int __user *);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue