page allocator: check only once if the zonelist is suitable for the allocation
[sfrench/cifs-2.6.git] / drivers / ide / ide-atapi.c
index afe5a4323879314b91198f5133fb19c230cea21f..702ef64a0f12fc6897ab4276a2fefbf3821ac879 100644 (file)
@@ -246,6 +246,7 @@ EXPORT_SYMBOL_GPL(ide_queue_sense_rq);
  */
 void ide_retry_pc(ide_drive_t *drive)
 {
+       struct request *failed_rq = drive->hwif->rq;
        struct request *sense_rq = &drive->sense_rq;
        struct ide_atapi_pc *pc = &drive->request_sense_pc;
 
@@ -255,13 +256,22 @@ void ide_retry_pc(ide_drive_t *drive)
        ide_init_pc(pc);
        memcpy(pc->c, sense_rq->cmd, 12);
        pc->buf = bio_data(sense_rq->bio);      /* pointer to mapped address */
-       pc->req_xfer = sense_rq->data_len;
+       pc->req_xfer = blk_rq_bytes(sense_rq);
 
        if (drive->media == ide_tape)
-               set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
+               drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC;
 
-       if (ide_queue_sense_rq(drive, pc))
-               ide_complete_rq(drive, -EIO, blk_rq_bytes(drive->hwif->rq));
+       /*
+        * Push back the failed request and put request sense on top
+        * of it.  The failed command will be retried after sense data
+        * is acquired.
+        */
+       blk_requeue_request(failed_rq->q, failed_rq);
+       drive->hwif->rq = NULL;
+       if (ide_queue_sense_rq(drive, pc)) {
+               blk_start_request(failed_rq);
+               ide_complete_rq(drive, -EIO, blk_rq_bytes(failed_rq));
+       }
 }
 EXPORT_SYMBOL_GPL(ide_retry_pc);
 
@@ -303,7 +313,7 @@ int ide_cd_get_xferlen(struct request *rq)
                return 32768;
        else if (blk_sense_request(rq) || blk_pc_request(rq) ||
                         rq->cmd_type == REQ_TYPE_ATA_PC)
-               return rq->data_len;
+               return blk_rq_bytes(rq);
        else
                return 0;
 }
@@ -367,7 +377,6 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive)
        /* No more interrupts */
        if ((stat & ATA_DRQ) == 0) {
                int uptodate, error;
-               unsigned int done;
 
                debug_log("Packet command completed, %d bytes transferred\n",
                          pc->xferred);
@@ -431,7 +440,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive)
                        error = uptodate ? 0 : -EIO;
                }
 
-               ide_complete_rq(drive, error, done);
+               ide_complete_rq(drive, error, blk_rq_bytes(rq));
                return ide_stopped;
        }
 
@@ -568,7 +577,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)
 
                /*
                 * If necessary schedule the packet transfer to occur 'timeout'
-                * miliseconds later in ide_delayed_transfer_pc() after the
+                * milliseconds later in ide_delayed_transfer_pc() after the
                 * device says it's ready for a packet.
                 */
                if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) {