Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (170 commits) [SCSI] scsi_dh_rdac: Add MD36xxf into device list [SCSI] scsi_debug: add consecutive medium errors [SCSI] libsas: fix ata list corruption issue [SCSI] hpsa: export resettable host attribute [SCSI] hpsa: move device attributes to avoid forward declarations [SCSI] scsi_debug: Logical Block Provisioning (SBC3r26) [SCSI] sd: Logical Block Provisioning update [SCSI] Include protection operation in SCSI command trace [SCSI] hpsa: fix incorrect PCI IDs and add two new ones (2nd try) [SCSI] target: Fix volume size misreporting for volumes > 2TB [SCSI] bnx2fc: Broadcom FCoE offload driver [SCSI] fcoe: fix broken fcoe interface reset [SCSI] fcoe: precedence bug in fcoe_filter_frames() [SCSI] libfcoe: Remove stale fcoe-netdev entries [SCSI] libfcoe: Move FCOE_MTU definition from fcoe.h to libfcoe.h [SCSI] libfc: introduce __fc_fill_fc_hdr that accepts fc_hdr as an argument [SCSI] fcoe, libfc: initialize EM anchors list and then update npiv EMs [SCSI] Revert "[SCSI] libfc: fix exchange being deleted when the abort itself is timed out" [SCSI] libfc: Fixing a memory leak when destroying an interface [SCSI] megaraid_sas: Version and Changelog update ... Fix up trivial conflicts due to whitespace differences in drivers/scsi/libsas/{sas_ata.c,sas_scsi_host.c}
This commit is contained in:
@@ -667,6 +667,30 @@ void scsi_release_buffers(struct scsi_cmnd *cmd)
|
||||
}
|
||||
EXPORT_SYMBOL(scsi_release_buffers);
|
||||
|
||||
static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
switch(host_byte(result)) {
|
||||
case DID_TRANSPORT_FAILFAST:
|
||||
error = -ENOLINK;
|
||||
break;
|
||||
case DID_TARGET_FAILURE:
|
||||
cmd->result |= (DID_OK << 16);
|
||||
error = -EREMOTEIO;
|
||||
break;
|
||||
case DID_NEXUS_FAILURE:
|
||||
cmd->result |= (DID_OK << 16);
|
||||
error = -EBADE;
|
||||
break;
|
||||
default:
|
||||
error = -EIO;
|
||||
break;
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function: scsi_io_completion()
|
||||
*
|
||||
@@ -737,7 +761,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
req->sense_len = len;
|
||||
}
|
||||
if (!sense_deferred)
|
||||
error = -EIO;
|
||||
error = __scsi_error_from_host_byte(cmd, result);
|
||||
}
|
||||
|
||||
req->resid_len = scsi_get_resid(cmd);
|
||||
@@ -796,7 +820,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
if (scsi_end_request(cmd, error, good_bytes, result == 0) == NULL)
|
||||
return;
|
||||
|
||||
error = -EIO;
|
||||
error = __scsi_error_from_host_byte(cmd, result);
|
||||
|
||||
if (host_byte(result) == DID_RESET) {
|
||||
/* Third party bus reset or reset for error recovery
|
||||
@@ -843,6 +867,13 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
description = "Host Data Integrity Failure";
|
||||
action = ACTION_FAIL;
|
||||
error = -EILSEQ;
|
||||
/* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */
|
||||
} else if ((sshdr.asc == 0x20 || sshdr.asc == 0x24) &&
|
||||
(cmd->cmnd[0] == UNMAP ||
|
||||
cmd->cmnd[0] == WRITE_SAME_16 ||
|
||||
cmd->cmnd[0] == WRITE_SAME)) {
|
||||
description = "Discard failure";
|
||||
action = ACTION_FAIL;
|
||||
} else
|
||||
action = ACTION_FAIL;
|
||||
break;
|
||||
@@ -1038,6 +1069,7 @@ static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev,
|
||||
cmd->request = req;
|
||||
|
||||
cmd->cmnd = req->cmd;
|
||||
cmd->prot_op = SCSI_PROT_NORMAL;
|
||||
|
||||
return cmd;
|
||||
}
|
||||
|
Reference in New Issue
Block a user