aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_lib.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-01-02 11:25:34 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-01-02 16:11:06 -0500
commitac40532ef0b8649e6f7f83859ea0de1c4ed08a19 (patch)
treeca86d577fe7fe68ae28b7f7d020f86bc9fff5535 /drivers/scsi/scsi_lib.c
parent158a962422e4a54dc256b6a9b9562f3d30d34d9c (diff)
scsi: revert "[SCSI] Get rid of scsi_cmnd->done"
This reverts commit 6f5391c283d7fdcf24bf40786ea79061919d1e1d ("[SCSI] Get rid of scsi_cmnd->done") that was supposed to be a cleanup commit, but apparently it causes regressions: Bug 9370 - v2.6.24-rc2-409-g9418d5d: attempt to access beyond end of device http://bugzilla.kernel.org/show_bug.cgi?id=9370 this patch should be reintroduced in a more split-up form to make testing of it easier. Signed-off-by: Ingo Molnar <mingo@elte.hu> Acked-by: Matthew Wilcox <matthew@wil.cx> Cc: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r--drivers/scsi/scsi_lib.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 0e81e4cf8876..8df8267ce316 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1092,6 +1092,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
1092 } 1092 }
1093 scsi_end_request(cmd, 0, this_count, !result); 1093 scsi_end_request(cmd, 0, this_count, !result);
1094} 1094}
1095EXPORT_SYMBOL(scsi_io_completion);
1095 1096
1096/* 1097/*
1097 * Function: scsi_init_io() 1098 * Function: scsi_init_io()
@@ -1170,6 +1171,18 @@ static struct scsi_cmnd *scsi_get_cmd_from_req(struct scsi_device *sdev,
1170 return cmd; 1171 return cmd;
1171} 1172}
1172 1173
1174static void scsi_blk_pc_done(struct scsi_cmnd *cmd)
1175{
1176 BUG_ON(!blk_pc_request(cmd->request));
1177 /*
1178 * This will complete the whole command with uptodate=1 so
1179 * as far as the block layer is concerned the command completed
1180 * successfully. Since this is a REQ_BLOCK_PC command the
1181 * caller should check the request's errors value
1182 */
1183 scsi_io_completion(cmd, cmd->request_bufflen);
1184}
1185
1173int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req) 1186int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
1174{ 1187{
1175 struct scsi_cmnd *cmd; 1188 struct scsi_cmnd *cmd;
@@ -1219,6 +1232,7 @@ int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
1219 cmd->transfersize = req->data_len; 1232 cmd->transfersize = req->data_len;
1220 cmd->allowed = req->retries; 1233 cmd->allowed = req->retries;
1221 cmd->timeout_per_command = req->timeout; 1234 cmd->timeout_per_command = req->timeout;
1235 cmd->done = scsi_blk_pc_done;
1222 return BLKPREP_OK; 1236 return BLKPREP_OK;
1223} 1237}
1224EXPORT_SYMBOL(scsi_setup_blk_pc_cmnd); 1238EXPORT_SYMBOL(scsi_setup_blk_pc_cmnd);