aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2008-07-17 04:28:31 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-07-26 15:14:54 -0400
commitdb007fc5e20c00b356e9ffe2d0e007398c65c837 (patch)
treeab0483beff7abaddb9648bc0b2ef1ceacfeb02a9 /drivers/scsi
parent4469f9878059f1707f021512e6b34252c4096ee7 (diff)
[SCSI] Command protection operation
Controllers that support DMA of protection information must be told explicitly how to handle the I/O. The controller has no knowledge of the protection capabilities of the target device so this information must be passed in the scsi_cmnd. - The protection operation tells the HBA whether to generate, strip or verify protection information. - The protection type tells the HBA which layout the target is formatted with. This is necessary because the controller must be able to correctly interpret the included protection information in order to verify it. - When a scsi_cmnd is reused for error handling the protection operation must be cleared and saved while error handling is in progress. - prot_op and prot_type are placed in an existing hole in scsi_cmnd and don't cause the structure to grow. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/scsi_error.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 006a95916f72..a69397fd314a 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -664,7 +664,9 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
664 ses->sdb = scmd->sdb; 664 ses->sdb = scmd->sdb;
665 ses->next_rq = scmd->request->next_rq; 665 ses->next_rq = scmd->request->next_rq;
666 ses->result = scmd->result; 666 ses->result = scmd->result;
667 ses->prot_op = scmd->prot_op;
667 668
669 scmd->prot_op = SCSI_PROT_NORMAL;
668 scmd->cmnd = ses->eh_cmnd; 670 scmd->cmnd = ses->eh_cmnd;
669 memset(scmd->cmnd, 0, BLK_MAX_CDB); 671 memset(scmd->cmnd, 0, BLK_MAX_CDB);
670 memset(&scmd->sdb, 0, sizeof(scmd->sdb)); 672 memset(&scmd->sdb, 0, sizeof(scmd->sdb));
@@ -722,6 +724,7 @@ void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, struct scsi_eh_save *ses)
722 scmd->sdb = ses->sdb; 724 scmd->sdb = ses->sdb;
723 scmd->request->next_rq = ses->next_rq; 725 scmd->request->next_rq = ses->next_rq;
724 scmd->result = ses->result; 726 scmd->result = ses->result;
727 scmd->prot_op = ses->prot_op;
725} 728}
726EXPORT_SYMBOL(scsi_eh_restore_cmnd); 729EXPORT_SYMBOL(scsi_eh_restore_cmnd);
727 730