diff options
-rw-r--r-- | drivers/ide/ide-cd.c | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 9d2e458250ba..c758e63b0fca 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -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) |