aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-cd.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2009-04-18 18:00:42 -0400
committerJens Axboe <jens.axboe@oracle.com>2009-04-28 01:37:30 -0400
commit02e7cf8f848841ca21864ccd019e480b73c323b7 (patch)
treeeb8b88b0b253f7063bfbee063df817fbac6eb60f /drivers/ide/ide-cd.c
parent068753203e6cd085664a62e0fc0636e19b148a12 (diff)
ide-cd,atapi: use bio for internal commands
Impact: unify request data buffer handling rq->data is used mostly to pass kernel buffer through request queue without using bio. There are only a couple of places which still do this in kernel and converting to bio isn't difficult. This patch converts ide-cd and atapi to use bio instead of rq->data for request sense and internal pc commands. With previous change to unify sense request handling, this is relatively easily achieved by adding blk_rq_map_kern() during sense_rq prep and PC issue. If blk_rq_map_kern() fails for sense, the error is deferred till sense issue and aborts the failed command which triggered the sense. Note that this is a slim possibility as sense prep is done on each command issue, so for the above condition to actually trigger, all preps since the last sense issue till the issue of the request which would require a sense should fail. * do_request functions might sleep now. This should be okay as ide request_fn - do_ide_request() - is invoked only from make_request and plug work. Make sure this is the case by adding might_sleep() to do_ide_request(). * Functions which access the read sense data before the sense request is complete now should access bio_data(sense_rq->bio) as the sense buffer might have been copied during blk_rq_map_kern(). * ide-tape updated to map sg. * cdrom_do_block_pc() now doesn't have to deal with REQ_TYPE_ATA_PC special case. Simplified. * tp_ops->output/input_data path dropped from ide_pc_intr(). Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/ide/ide-cd.c')
-rw-r--r--drivers/ide/ide-cd.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 061d7bbcd34a..673628790f10 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -210,10 +210,12 @@ static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq)
210{ 210{
211 /* 211 /*
212 * For REQ_TYPE_SENSE, "rq->special" points to the original 212 * For REQ_TYPE_SENSE, "rq->special" points to the original
213 * failed request 213 * failed request. Also, the sense data should be read
214 * directly from rq which might be different from the original
215 * sense buffer if it got copied during mapping.
214 */ 216 */
215 struct request *failed = (struct request *)rq->special; 217 struct request *failed = (struct request *)rq->special;
216 struct request_sense *sense = &drive->sense_data; 218 void *sense = bio_data(rq->bio);
217 219
218 if (failed) { 220 if (failed) {
219 if (failed->sense) { 221 if (failed->sense) {
@@ -398,7 +400,7 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat)
398 400
399 /* if we got a CHECK_CONDITION status, queue a request sense command */ 401 /* if we got a CHECK_CONDITION status, queue a request sense command */
400 if (stat & ATA_ERR) 402 if (stat & ATA_ERR)
401 ide_queue_sense_rq(drive, NULL); 403 return ide_queue_sense_rq(drive, NULL) ? 2 : 1;
402 return 1; 404 return 1;
403 405
404end_request: 406end_request:
@@ -412,8 +414,7 @@ end_request:
412 414
413 hwif->rq = NULL; 415 hwif->rq = NULL;
414 416
415 ide_queue_sense_rq(drive, rq); 417 return ide_queue_sense_rq(drive, rq) ? 2 : 1;
416 return 1;
417 } else 418 } else
418 return 2; 419 return 2;
419} 420}
@@ -507,8 +508,12 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd,
507 rq->cmd_flags |= cmd_flags; 508 rq->cmd_flags |= cmd_flags;
508 rq->timeout = timeout; 509 rq->timeout = timeout;
509 if (buffer) { 510 if (buffer) {
510 rq->data = buffer; 511 error = blk_rq_map_kern(drive->queue, rq, buffer,
511 rq->data_len = *bufflen; 512 *bufflen, GFP_NOIO);
513 if (error) {
514 blk_put_request(rq);
515 return error;
516 }
512 } 517 }
513 518
514 error = blk_execute_rq(drive->queue, info->disk, rq, 0); 519 error = blk_execute_rq(drive->queue, info->disk, rq, 0);
@@ -802,15 +807,10 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
802 drive->dma = 0; 807 drive->dma = 0;
803 808
804 /* sg request */ 809 /* sg request */
805 if (rq->bio || ((rq->cmd_type == REQ_TYPE_ATA_PC) && rq->data_len)) { 810 if (rq->bio) {
806 struct request_queue *q = drive->queue; 811 struct request_queue *q = drive->queue;
812 char *buf = bio_data(rq->bio);
807 unsigned int alignment; 813 unsigned int alignment;
808 char *buf;
809
810 if (rq->bio)
811 buf = bio_data(rq->bio);
812 else
813 buf = rq->data;
814 814
815 drive->dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA); 815 drive->dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
816 816