diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ide/ide-io.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 49b098de367c..b8426e9c0906 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -144,6 +144,20 @@ int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq, | |||
144 | } | 144 | } |
145 | EXPORT_SYMBOL_GPL(ide_end_dequeued_request); | 145 | EXPORT_SYMBOL_GPL(ide_end_dequeued_request); |
146 | 146 | ||
147 | static void ide_complete_task(ide_drive_t *drive, ide_task_t *task, | ||
148 | u8 stat, u8 err) | ||
149 | { | ||
150 | struct ide_taskfile *tf = &task->tf; | ||
151 | |||
152 | tf->error = err; | ||
153 | tf->status = stat; | ||
154 | |||
155 | drive->hwif->tp_ops->tf_read(drive, task); | ||
156 | |||
157 | if (task->tf_flags & IDE_TFLAG_DYN) | ||
158 | kfree(task); | ||
159 | } | ||
160 | |||
147 | /** | 161 | /** |
148 | * ide_end_drive_cmd - end an explicit drive command | 162 | * ide_end_drive_cmd - end an explicit drive command |
149 | * @drive: command | 163 | * @drive: command |
@@ -166,17 +180,8 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err) | |||
166 | if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { | 180 | if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { |
167 | ide_task_t *task = (ide_task_t *)rq->special; | 181 | ide_task_t *task = (ide_task_t *)rq->special; |
168 | 182 | ||
169 | if (task) { | 183 | if (task) |
170 | struct ide_taskfile *tf = &task->tf; | 184 | ide_complete_task(drive, task, stat, err); |
171 | |||
172 | tf->error = err; | ||
173 | tf->status = stat; | ||
174 | |||
175 | drive->hwif->tp_ops->tf_read(drive, task); | ||
176 | |||
177 | if (task->tf_flags & IDE_TFLAG_DYN) | ||
178 | kfree(task); | ||
179 | } | ||
180 | } else if (blk_pm_request(rq)) { | 185 | } else if (blk_pm_request(rq)) { |
181 | ide_complete_pm_rq(drive, rq); | 186 | ide_complete_pm_rq(drive, rq); |
182 | return; | 187 | return; |