aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi/scsi_cmnd.h
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-06-11 05:09:57 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-06-11 16:06:42 -0400
commit8846bab180fa2bcfe02d4ba5288fbaba12c8f4f3 (patch)
tree9f5535d5685289e38ebce9f4fbea295cfbe01552 /include/scsi/scsi_cmnd.h
parent2426bd456a61407388b6e61fc5f98dbcbebc50e2 (diff)
scsi_cmnd: Introduce scsi_transfer_length helper
In case protection information exists on the wire scsi transports should include it in the transfer byte count (even if protection information does not exist in the host memory space). This helper will compute the total transfer length from the scsi command data length and protection attributes. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Cc: stable@vger.kernel.org # 3.15+ Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'include/scsi/scsi_cmnd.h')
-rw-r--r--include/scsi/scsi_cmnd.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index dd7c998221b3..a100c6e266c7 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -7,6 +7,7 @@
7#include <linux/types.h> 7#include <linux/types.h>
8#include <linux/timer.h> 8#include <linux/timer.h>
9#include <linux/scatterlist.h> 9#include <linux/scatterlist.h>
10#include <scsi/scsi_device.h>
10 11
11struct Scsi_Host; 12struct Scsi_Host;
12struct scsi_device; 13struct scsi_device;
@@ -306,4 +307,20 @@ static inline void set_driver_byte(struct scsi_cmnd *cmd, char status)
306 cmd->result = (cmd->result & 0x00ffffff) | (status << 24); 307 cmd->result = (cmd->result & 0x00ffffff) | (status << 24);
307} 308}
308 309
310static inline unsigned scsi_transfer_length(struct scsi_cmnd *scmd)
311{
312 unsigned int xfer_len = blk_rq_bytes(scmd->request);
313 unsigned int prot_op = scsi_get_prot_op(scmd);
314 unsigned int sector_size = scmd->device->sector_size;
315
316 switch (prot_op) {
317 case SCSI_PROT_NORMAL:
318 case SCSI_PROT_WRITE_STRIP:
319 case SCSI_PROT_READ_INSERT:
320 return xfer_len;
321 }
322
323 return xfer_len + (xfer_len >> ilog2(sector_size)) * 8;
324}
325
309#endif /* _SCSI_SCSI_CMND_H */ 326#endif /* _SCSI_SCSI_CMND_H */