Skip to content

Commit

Permalink
ide-cd: carve out an ide_cd_breathe()-helper for fs write requests
Browse files Browse the repository at this point in the history
There should be no functional change resulting from this patch.

Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
  • Loading branch information
Borislav Petkov authored and Bartlomiej Zolnierkiewicz committed Apr 8, 2009
1 parent 8e59bfd commit 805ec58
Showing 1 changed file with 38 additions and 27 deletions.
65 changes: 38 additions & 27 deletions drivers/ide/ide-cd.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,43 @@ static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq)
cdrom_analyze_sense_data(drive, NULL, sense);
}


/*
* Allow the drive 5 seconds to recover; some devices will return NOT_READY
* while flushing data from cache.
*
* returns: 0 failed (write timeout expired)
* 1 success
*/
static int ide_cd_breathe(ide_drive_t *drive, struct request *rq)
{

struct cdrom_info *info = drive->driver_data;

if (!rq->errors)
info->write_timeout = jiffies + ATAPI_WAIT_WRITE_BUSY;

rq->errors = 1;

if (time_after(jiffies, info->write_timeout))
return 0;
else {
struct request_queue *q = drive->queue;
unsigned long flags;

/*
* take a breather relying on the unplug timer to kick us again
*/

spin_lock_irqsave(q->queue_lock, flags);
blk_plug_device(q);
spin_unlock_irqrestore(q->queue_lock, flags);

return 1;
}
}

/**
* Returns:
* 0: if the request should be continued.
* 1: if the request will be going through error recovery.
Expand Down Expand Up @@ -348,36 +384,11 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
/* fail the request */
printk(KERN_ERR PFX "%s: tray open\n",
drive->name);
do_end_request = 1;
} else {
struct cdrom_info *info = drive->driver_data;

/*
* Allow the drive 5 seconds to recover, some
* devices will return this error while flushing
* data from cache.
*/
if (!rq->errors)
info->write_timeout = jiffies +
ATAPI_WAIT_WRITE_BUSY;
rq->errors = 1;
if (time_after(jiffies, info->write_timeout))
do_end_request = 1;
else {
struct request_queue *q = drive->queue;
unsigned long flags;

/*
* take a breather relying on the unplug
* timer to kick us again
*/
spin_lock_irqsave(q->queue_lock, flags);
blk_plug_device(q);
spin_unlock_irqrestore(q->queue_lock, flags);

if (ide_cd_breathe(drive, rq))
return 1;
}
}
do_end_request = 1;
} else if (sense_key == UNIT_ATTENTION) {
/* media change */
cdrom_saw_media_change(drive);
Expand Down

0 comments on commit 805ec58

Please sign in to comment.