diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-11 09:19:22 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-11 09:19:22 -0800 |
commit | eedcdefb1ad75de9cc0889b247524be64cc244ef (patch) | |
tree | 763c742fe2ef0f109af364fca266f022739ef8bc /drivers/ide/ide-io.c | |
parent | 9585ca02f8f9e844b64e7ff4d167ccc1390a99ab (diff) | |
parent | 467390a2a50493332ddc21eb806094b1829c1161 (diff) | |
download | op-kernel-dev-eedcdefb1ad75de9cc0889b247524be64cc244ef.zip op-kernel-dev-eedcdefb1ad75de9cc0889b247524be64cc244ef.tar.gz |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6:
ide: remove stale comment from ide-lib.c
ide: fix comment in init_irq()
ide: ide_init_port() bugfix
ide-disk: fix flush requests (take 2)
ide: introduce CONFIG_BLK_DEV_IDEDMA_SFF option
bast-ide: build fix
ide-tape: remove never executed code
ide: fix ide/legacy/gayle.c compilation
ide-cd: replace ntohs with generic byteorder macro be16_to_cpu
ide: remove stale version number
pdc202xx_old: always enable burst mode
palm_bk3710: use struct ide_port_info
palm_bk3710: port initialization/probing bugfix
palm_bk3710: fix ide_unregister() usage
palm_bk3710: ide_register_hw() -> ide_device_add()
ide: insert BUG_ON() into __ide_set_handler() (take 2)
cs5520: remove stale comment
ide: another possible ide panic fix for blk-end-request
Diffstat (limited to 'drivers/ide/ide-io.c')
-rw-r--r-- | drivers/ide/ide-io.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 3addbe4..7153796 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -361,17 +361,21 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err) spin_unlock_irqrestore(&ide_lock, flags); if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { - ide_task_t *args = (ide_task_t *) rq->special; + ide_task_t *task = (ide_task_t *)rq->special; + if (rq->errors == 0) - rq->errors = !OK_STAT(stat,READY_STAT,BAD_STAT); - - if (args) { - struct ide_taskfile *tf = &args->tf; + rq->errors = !OK_STAT(stat, READY_STAT, BAD_STAT); + + if (task) { + struct ide_taskfile *tf = &task->tf; tf->error = err; tf->status = stat; - ide_tf_read(drive, args); + ide_tf_read(drive, task); + + if (task->tf_flags & IDE_TFLAG_DYN) + kfree(task); } } else if (blk_pm_request(rq)) { struct request_pm_state *pm = rq->data; @@ -388,7 +392,8 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err) spin_lock_irqsave(&ide_lock, flags); HWGROUP(drive)->rq = NULL; rq->errors = err; - if (__blk_end_request(rq, (rq->errors ? -EIO : 0), 0)) + if (unlikely(__blk_end_request(rq, (rq->errors ? -EIO : 0), + blk_rq_bytes(rq)))) BUG(); spin_unlock_irqrestore(&ide_lock, flags); } |