diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-11 13:52:27 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-11 14:10:35 -0400 |
commit | c9059598ea8981d02356eead3188bf7fa4d717b8 (patch) | |
tree | 03e73b20a30e988da7c6a3e0ad93b2dc5843274d /drivers/ide/ide-atapi.c | |
parent | 0a33f80a8373eca7f4bea3961d1346c3815fa5ed (diff) | |
parent | b0fd271d5fba0b2d00888363f3869e3f9b26caa9 (diff) |
Merge branch 'for-2.6.31' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.31' of git://git.kernel.dk/linux-2.6-block: (153 commits)
block: add request clone interface (v2)
floppy: fix hibernation
ramdisk: remove long-deprecated "ramdisk=" boot-time parameter
fs/bio.c: add missing __user annotation
block: prevent possible io_context->refcount overflow
Add serial number support for virtio_blk, V4a
block: Add missing bounce_pfn stacking and fix comments
Revert "block: Fix bounce limit setting in DM"
cciss: decode unit attention in SCSI error handling code
cciss: Remove no longer needed sendcmd reject processing code
cciss: change SCSI error handling routines to work with interrupts enabled.
cciss: separate error processing and command retrying code in sendcmd_withirq_core()
cciss: factor out fix target status processing code from sendcmd functions
cciss: simplify interface of sendcmd() and sendcmd_withirq()
cciss: factor out core of sendcmd_withirq() for use by SCSI error handling code
cciss: Use schedule_timeout_uninterruptible in SCSI error handling code
block: needs to set the residual length of a bidi request
Revert "block: implement blkdev_readpages"
block: Fix bounce limit setting in DM
Removed reference to non-existing file Documentation/PCI/PCI-DMA-mapping.txt
...
Manually fix conflicts with tracing updates in:
block/blk-sysfs.c
drivers/ide/ide-atapi.c
drivers/ide/ide-cd.c
drivers/ide/ide-floppy.c
drivers/ide/ide-tape.c
include/trace/events/block.h
kernel/trace/blktrace.c
Diffstat (limited to 'drivers/ide/ide-atapi.c')
-rw-r--r-- | drivers/ide/ide-atapi.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index afe5a4323879..757e5956b132 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
@@ -246,6 +246,7 @@ EXPORT_SYMBOL_GPL(ide_queue_sense_rq); | |||
246 | */ | 246 | */ |
247 | void ide_retry_pc(ide_drive_t *drive) | 247 | void ide_retry_pc(ide_drive_t *drive) |
248 | { | 248 | { |
249 | struct request *failed_rq = drive->hwif->rq; | ||
249 | struct request *sense_rq = &drive->sense_rq; | 250 | struct request *sense_rq = &drive->sense_rq; |
250 | struct ide_atapi_pc *pc = &drive->request_sense_pc; | 251 | struct ide_atapi_pc *pc = &drive->request_sense_pc; |
251 | 252 | ||
@@ -255,13 +256,22 @@ void ide_retry_pc(ide_drive_t *drive) | |||
255 | ide_init_pc(pc); | 256 | ide_init_pc(pc); |
256 | memcpy(pc->c, sense_rq->cmd, 12); | 257 | memcpy(pc->c, sense_rq->cmd, 12); |
257 | pc->buf = bio_data(sense_rq->bio); /* pointer to mapped address */ | 258 | pc->buf = bio_data(sense_rq->bio); /* pointer to mapped address */ |
258 | pc->req_xfer = sense_rq->data_len; | 259 | pc->req_xfer = blk_rq_bytes(sense_rq); |
259 | 260 | ||
260 | if (drive->media == ide_tape) | 261 | if (drive->media == ide_tape) |
261 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); | 262 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); |
262 | 263 | ||
263 | if (ide_queue_sense_rq(drive, pc)) | 264 | /* |
264 | ide_complete_rq(drive, -EIO, blk_rq_bytes(drive->hwif->rq)); | 265 | * Push back the failed request and put request sense on top |
266 | * of it. The failed command will be retried after sense data | ||
267 | * is acquired. | ||
268 | */ | ||
269 | blk_requeue_request(failed_rq->q, failed_rq); | ||
270 | drive->hwif->rq = NULL; | ||
271 | if (ide_queue_sense_rq(drive, pc)) { | ||
272 | blk_start_request(failed_rq); | ||
273 | ide_complete_rq(drive, -EIO, blk_rq_bytes(failed_rq)); | ||
274 | } | ||
265 | } | 275 | } |
266 | EXPORT_SYMBOL_GPL(ide_retry_pc); | 276 | EXPORT_SYMBOL_GPL(ide_retry_pc); |
267 | 277 | ||
@@ -303,7 +313,7 @@ int ide_cd_get_xferlen(struct request *rq) | |||
303 | return 32768; | 313 | return 32768; |
304 | else if (blk_sense_request(rq) || blk_pc_request(rq) || | 314 | else if (blk_sense_request(rq) || blk_pc_request(rq) || |
305 | rq->cmd_type == REQ_TYPE_ATA_PC) | 315 | rq->cmd_type == REQ_TYPE_ATA_PC) |
306 | return rq->data_len; | 316 | return blk_rq_bytes(rq); |
307 | else | 317 | else |
308 | return 0; | 318 | return 0; |
309 | } | 319 | } |
@@ -367,7 +377,6 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
367 | /* No more interrupts */ | 377 | /* No more interrupts */ |
368 | if ((stat & ATA_DRQ) == 0) { | 378 | if ((stat & ATA_DRQ) == 0) { |
369 | int uptodate, error; | 379 | int uptodate, error; |
370 | unsigned int done; | ||
371 | 380 | ||
372 | debug_log("Packet command completed, %d bytes transferred\n", | 381 | debug_log("Packet command completed, %d bytes transferred\n", |
373 | pc->xferred); | 382 | pc->xferred); |
@@ -431,7 +440,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
431 | error = uptodate ? 0 : -EIO; | 440 | error = uptodate ? 0 : -EIO; |
432 | } | 441 | } |
433 | 442 | ||
434 | ide_complete_rq(drive, error, done); | 443 | ide_complete_rq(drive, error, blk_rq_bytes(rq)); |
435 | return ide_stopped; | 444 | return ide_stopped; |
436 | } | 445 | } |
437 | 446 | ||