diff options
author | Christoph Hellwig <hch@lst.de> | 2014-07-08 07:16:17 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-07-25 07:38:08 -0400 |
commit | 6af7a4ffa2775c452c77eccc6bb6a4e2b71c2371 (patch) | |
tree | a02a81dcd071c343d85cb19bcd25657b3edf53c2 /drivers/scsi | |
parent | 4f1e57657548d7afb4a6b62097765282f3b03c6e (diff) |
scsi: add scsi_setup_cmnd helper
Factor out command setup code that will be shared with the blk-mq code path.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Webb Scales <webbnh@hp.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/scsi_lib.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 85cf0ef843f6..04c368470c8a 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -1092,6 +1092,27 @@ static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req) | |||
1092 | return scsi_cmd_to_driver(cmd)->init_command(cmd); | 1092 | return scsi_cmd_to_driver(cmd)->init_command(cmd); |
1093 | } | 1093 | } |
1094 | 1094 | ||
1095 | static int scsi_setup_cmnd(struct scsi_device *sdev, struct request *req) | ||
1096 | { | ||
1097 | struct scsi_cmnd *cmd = req->special; | ||
1098 | |||
1099 | if (!blk_rq_bytes(req)) | ||
1100 | cmd->sc_data_direction = DMA_NONE; | ||
1101 | else if (rq_data_dir(req) == WRITE) | ||
1102 | cmd->sc_data_direction = DMA_TO_DEVICE; | ||
1103 | else | ||
1104 | cmd->sc_data_direction = DMA_FROM_DEVICE; | ||
1105 | |||
1106 | switch (req->cmd_type) { | ||
1107 | case REQ_TYPE_FS: | ||
1108 | return scsi_setup_fs_cmnd(sdev, req); | ||
1109 | case REQ_TYPE_BLOCK_PC: | ||
1110 | return scsi_setup_blk_pc_cmnd(sdev, req); | ||
1111 | default: | ||
1112 | return BLKPREP_KILL; | ||
1113 | } | ||
1114 | } | ||
1115 | |||
1095 | static int | 1116 | static int |
1096 | scsi_prep_state_check(struct scsi_device *sdev, struct request *req) | 1117 | scsi_prep_state_check(struct scsi_device *sdev, struct request *req) |
1097 | { | 1118 | { |
@@ -1195,24 +1216,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) | |||
1195 | goto out; | 1216 | goto out; |
1196 | } | 1217 | } |
1197 | 1218 | ||
1198 | if (!blk_rq_bytes(req)) | 1219 | ret = scsi_setup_cmnd(sdev, req); |
1199 | cmd->sc_data_direction = DMA_NONE; | ||
1200 | else if (rq_data_dir(req) == WRITE) | ||
1201 | cmd->sc_data_direction = DMA_TO_DEVICE; | ||
1202 | else | ||
1203 | cmd->sc_data_direction = DMA_FROM_DEVICE; | ||
1204 | |||
1205 | switch (req->cmd_type) { | ||
1206 | case REQ_TYPE_FS: | ||
1207 | ret = scsi_setup_fs_cmnd(sdev, req); | ||
1208 | break; | ||
1209 | case REQ_TYPE_BLOCK_PC: | ||
1210 | ret = scsi_setup_blk_pc_cmnd(sdev, req); | ||
1211 | break; | ||
1212 | default: | ||
1213 | ret = BLKPREP_KILL; | ||
1214 | } | ||
1215 | |||
1216 | out: | 1220 | out: |
1217 | return scsi_prep_return(q, req, ret); | 1221 | return scsi_prep_return(q, req, ret); |
1218 | } | 1222 | } |