|
@@ -332,7 +332,6 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
|
|
|
|
|
|
} else if (blk_pc_request(rq) || rq->cmd_type == REQ_TYPE_ATA_PC) {
|
|
|
/* All other functions, except for READ. */
|
|
|
- unsigned long flags;
|
|
|
|
|
|
/*
|
|
|
* if we have an error, pass back CHECK_CONDITION as the
|
|
@@ -370,15 +369,7 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
|
|
|
* remove failed request completely and end it when the
|
|
|
* request sense has completed
|
|
|
*/
|
|
|
- if (stat & ERR_STAT) {
|
|
|
- spin_lock_irqsave(&ide_lock, flags);
|
|
|
- blkdev_dequeue_request(rq);
|
|
|
- HWGROUP(drive)->rq = NULL;
|
|
|
- spin_unlock_irqrestore(&ide_lock, flags);
|
|
|
-
|
|
|
- cdrom_queue_request_sense(drive, rq->sense, rq);
|
|
|
- } else
|
|
|
- cdrom_end_request(drive, 0);
|
|
|
+ goto end_request;
|
|
|
|
|
|
} else if (blk_fs_request(rq)) {
|
|
|
int do_end_request = 0;
|
|
@@ -458,23 +449,15 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
|
|
|
sense data. We need this in order to perform end of media
|
|
|
processing */
|
|
|
|
|
|
- if (do_end_request) {
|
|
|
- if (stat & ERR_STAT) {
|
|
|
- unsigned long flags;
|
|
|
- spin_lock_irqsave(&ide_lock, flags);
|
|
|
- blkdev_dequeue_request(rq);
|
|
|
- HWGROUP(drive)->rq = NULL;
|
|
|
- spin_unlock_irqrestore(&ide_lock, flags);
|
|
|
+ if (do_end_request)
|
|
|
+ goto end_request;
|
|
|
|
|
|
- cdrom_queue_request_sense(drive, rq->sense, rq);
|
|
|
- } else
|
|
|
- cdrom_end_request(drive, 0);
|
|
|
- } else {
|
|
|
- /* If we got a CHECK_CONDITION status,
|
|
|
- queue a request sense command. */
|
|
|
- if (stat & ERR_STAT)
|
|
|
- cdrom_queue_request_sense(drive, NULL, NULL);
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * If we got a CHECK_CONDITION status,
|
|
|
+ * queue a request sense command.
|
|
|
+ */
|
|
|
+ if (stat & ERR_STAT)
|
|
|
+ cdrom_queue_request_sense(drive, NULL, NULL);
|
|
|
} else {
|
|
|
blk_dump_rq_flags(rq, "ide-cd: bad rq");
|
|
|
cdrom_end_request(drive, 0);
|
|
@@ -482,6 +465,21 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
|
|
|
|
|
|
/* Retry, or handle the next request. */
|
|
|
return 1;
|
|
|
+
|
|
|
+end_request:
|
|
|
+ if (stat & ERR_STAT) {
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&ide_lock, flags);
|
|
|
+ blkdev_dequeue_request(rq);
|
|
|
+ HWGROUP(drive)->rq = NULL;
|
|
|
+ spin_unlock_irqrestore(&ide_lock, flags);
|
|
|
+
|
|
|
+ cdrom_queue_request_sense(drive, rq->sense, rq);
|
|
|
+ } else
|
|
|
+ cdrom_end_request(drive, 0);
|
|
|
+
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
static int cdrom_timer_expiry(ide_drive_t *drive)
|