diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-01-02 11:25:34 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-02 16:11:06 -0500 |
commit | ac40532ef0b8649e6f7f83859ea0de1c4ed08a19 (patch) | |
tree | ca86d577fe7fe68ae28b7f7d020f86bc9fff5535 /drivers/scsi/scsi_lib.c | |
parent | 158a962422e4a54dc256b6a9b9562f3d30d34d9c (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.c | 14 |
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 | } |
1095 | EXPORT_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 | ||
1174 | static 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 | |||
1173 | int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req) | 1186 | int 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 | } |
1224 | EXPORT_SYMBOL(scsi_setup_blk_pc_cmnd); | 1238 | EXPORT_SYMBOL(scsi_setup_blk_pc_cmnd); |