diff options
-rw-r--r-- | include/scsi/scsi_cmnd.h | 17 |
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 | ||
11 | struct Scsi_Host; | 12 | struct Scsi_Host; |
12 | struct scsi_device; | 13 | struct 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 | ||
310 | static 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 */ |