aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_lib.c
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2008-04-30 04:19:47 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-05-02 11:18:22 -0400
commit64a87b244b9297667ca80264aab849a36f494884 (patch)
tree554d78d1cfe594b92409a19b3ed1d32efcbd31cc /drivers/scsi/scsi_lib.c
parent9f5de6b105bfa45911d46566df0b36720b648c42 (diff)
[SCSI] Let scsi_cmnd->cmnd use request->cmd buffer
- struct scsi_cmnd had a 16 bytes command buffer of its own. This is an unnecessary duplication and copy of request's cmd. It is probably left overs from the time that scsi_cmnd could function without a request attached. So clean that up. - Once above is done, few places, apart from scsi-ml, needed adjustments due to changing the data type of scsi_cmnd->cmnd. - Lots of drivers still use MAX_COMMAND_SIZE. So I have left that #define but equate it to BLK_MAX_CDB. The way I see it and is reflected in the patch below is. MAX_COMMAND_SIZE - means: The longest fixed-length (*) SCSI CDB as per the SCSI standard and is not related to the implementation. BLK_MAX_CDB. - The allocated space at the request level - I have audit all ISA drivers and made sure none use ->cmnd in a DMA Operation. Same audit was done by Andi Kleen. (*)fixed-length here means commands that their size can be determined by their opcode and the CDB does not carry a length specifier, (unlike the VARIABLE_LENGTH_CMD(0x7f) command). This is actually not exactly true and the SCSI standard also defines extended commands and vendor specific commands that can be bigger than 16 bytes. The kernel will support these using the same infrastructure used for VARLEN CDB's. So in effect MAX_COMMAND_SIZE means the maximum size command scsi-ml supports without specifying a cmd_len by ULD's Signed-off-by: Boaz Harrosh <bharrosh@panasas.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r--drivers/scsi/scsi_lib.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 67f412bb4974..325270b520e1 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1090,6 +1090,8 @@ static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev,
1090 cmd->tag = req->tag; 1090 cmd->tag = req->tag;
1091 cmd->request = req; 1091 cmd->request = req;
1092 1092
1093 cmd->cmnd = req->cmd;
1094
1093 return cmd; 1095 return cmd;
1094} 1096}
1095 1097
@@ -1127,8 +1129,6 @@ int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
1127 req->buffer = NULL; 1129 req->buffer = NULL;
1128 } 1130 }
1129 1131
1130 BUILD_BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd));
1131 memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd));
1132 cmd->cmd_len = req->cmd_len; 1132 cmd->cmd_len = req->cmd_len;
1133 if (!req->data_len) 1133 if (!req->data_len)
1134 cmd->sc_data_direction = DMA_NONE; 1134 cmd->sc_data_direction = DMA_NONE;
@@ -1165,6 +1165,7 @@ int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req)
1165 if (unlikely(!cmd)) 1165 if (unlikely(!cmd))
1166 return BLKPREP_DEFER; 1166 return BLKPREP_DEFER;
1167 1167
1168 memset(cmd->cmnd, 0, BLK_MAX_CDB);
1168 return scsi_init_io(cmd, GFP_ATOMIC); 1169 return scsi_init_io(cmd, GFP_ATOMIC);
1169} 1170}
1170EXPORT_SYMBOL(scsi_setup_fs_cmnd); 1171EXPORT_SYMBOL(scsi_setup_fs_cmnd);