diff options
author | Kiyoshi Ueda <k-ueda@ct.jp.nec.com> | 2008-02-10 18:32:11 -0500 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-02-10 18:32:11 -0500 |
commit | 3b0e044d5a881c937293a045158149514b86783c (patch) | |
tree | bdd78f0e2e7774d72f04862641e67f1421b90553 /drivers/ide | |
parent | 0eccf60bfa9190d1588b2bf07d23d7b9b3a19d9e (diff) |
ide: another possible ide panic fix for blk-end-request
I have reviewed all blk-end-request patches again to confirm whether
there are any similar problems with the last week's ide-cd panic:
http://lkml.org/lkml/2008/1/29/140
And I found a possible similar bug in ide-io change:
ide_end_drive_cmd() could be called for blk_pc_request() which could
have bios. To complete such requests correctly, we need to pass
the actual size of the request.
Otherwise, __blk_end_request() returns 1 because the request still has
bios, and the system will BUG() unnecessarily.
The following patch fixes the bug and should be applied on top of
Linus' git.
Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
Cc: Borislav Petkov <petkovbb@googlemail.com>
Cc: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-io.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 3addbe478d26..e41383fa3a51 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -388,7 +388,8 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err) | |||
388 | spin_lock_irqsave(&ide_lock, flags); | 388 | spin_lock_irqsave(&ide_lock, flags); |
389 | HWGROUP(drive)->rq = NULL; | 389 | HWGROUP(drive)->rq = NULL; |
390 | rq->errors = err; | 390 | rq->errors = err; |
391 | if (__blk_end_request(rq, (rq->errors ? -EIO : 0), 0)) | 391 | if (unlikely(__blk_end_request(rq, (rq->errors ? -EIO : 0), |
392 | blk_rq_bytes(rq)))) | ||
392 | BUG(); | 393 | BUG(); |
393 | spin_unlock_irqrestore(&ide_lock, flags); | 394 | spin_unlock_irqrestore(&ide_lock, flags); |
394 | } | 395 | } |