aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 */