* now end the failed request
*/
if (blk_fs_request(failed)) {
- if (ide_end_rq(drive, failed, 0,
+ if (ide_end_rq(drive, failed, -EIO,
failed->hard_nr_sectors << 9))
BUG();
} else {
#include <asm/uaccess.h>
#include <asm/io.h>
-int ide_end_rq(ide_drive_t *drive, struct request *rq, int uptodate,
+int ide_end_rq(ide_drive_t *drive, struct request *rq, int error,
unsigned int nr_bytes)
{
- int error = 0;
-
- if (uptodate <= 0)
- error = uptodate ? uptodate : -EIO;
-
- /*
- * if failfast is set on a request, override number of sectors and
- * complete the whole request right now
- */
- if (blk_noretry_request(rq) && error)
- nr_bytes = rq->hard_nr_sectors << 9;
-
- if (!blk_fs_request(rq) && error && !rq->errors)
- rq->errors = -EIO;
-
/*
* decide whether to reenable DMA -- 3 is a random magic for now,
* if we DMA timeout more than 3 times, just stay in PIO
{
unsigned int nr_bytes = nr_sectors << 9;
struct request *rq = drive->hwif->rq;
- int rc;
+ int rc, error = 0;
if (!nr_bytes) {
if (blk_pc_request(rq))
nr_bytes = rq->hard_cur_sectors << 9;
}
- rc = ide_end_rq(drive, rq, uptodate, nr_bytes);
+ /*
+ * if failfast is set on a request, override number of sectors
+ * and complete the whole request right now
+ */
+ if (blk_noretry_request(rq) && uptodate <= 0)
+ nr_bytes = rq->hard_nr_sectors << 9;
+
+ if (blk_fs_request(rq) == 0 && uptodate <= 0 && rq->errors == 0)
+ rq->errors = -EIO;
+
+ if (uptodate <= 0)
+ error = uptodate ? uptodate : -EIO;
+
+ rc = ide_end_rq(drive, rq, error, nr_bytes);
if (rc == 0)
drive->hwif->rq = NULL;