diff options
Diffstat (limited to 'drivers/cdrom/viocd.c')
-rw-r--r-- | drivers/cdrom/viocd.c | 33 |
1 files changed, 8 insertions, 25 deletions
diff --git a/drivers/cdrom/viocd.c b/drivers/cdrom/viocd.c index 9b1624e0ddeb..0fff646cc2f0 100644 --- a/drivers/cdrom/viocd.c +++ b/drivers/cdrom/viocd.c | |||
@@ -282,7 +282,7 @@ static int send_request(struct request *req) | |||
282 | viopath_targetinst(viopath_hostLp), | 282 | viopath_targetinst(viopath_hostLp), |
283 | (u64)req, VIOVERSION << 16, | 283 | (u64)req, VIOVERSION << 16, |
284 | ((u64)DEVICE_NR(diskinfo) << 48) | dmaaddr, | 284 | ((u64)DEVICE_NR(diskinfo) << 48) | dmaaddr, |
285 | (u64)req->sector * 512, len, 0); | 285 | (u64)blk_rq_pos(req) * 512, len, 0); |
286 | if (hvrc != HvLpEvent_Rc_Good) { | 286 | if (hvrc != HvLpEvent_Rc_Good) { |
287 | printk(VIOCD_KERN_WARNING "hv error on op %d\n", (int)hvrc); | 287 | printk(VIOCD_KERN_WARNING "hv error on op %d\n", (int)hvrc); |
288 | return -1; | 288 | return -1; |
@@ -291,36 +291,19 @@ static int send_request(struct request *req) | |||
291 | return 0; | 291 | return 0; |
292 | } | 292 | } |
293 | 293 | ||
294 | static void viocd_end_request(struct request *req, int error) | ||
295 | { | ||
296 | int nsectors = req->hard_nr_sectors; | ||
297 | |||
298 | /* | ||
299 | * Make sure it's fully ended, and ensure that we process | ||
300 | * at least one sector. | ||
301 | */ | ||
302 | if (blk_pc_request(req)) | ||
303 | nsectors = (req->data_len + 511) >> 9; | ||
304 | if (!nsectors) | ||
305 | nsectors = 1; | ||
306 | |||
307 | if (__blk_end_request(req, error, nsectors << 9)) | ||
308 | BUG(); | ||
309 | } | ||
310 | |||
311 | static int rwreq; | 294 | static int rwreq; |
312 | 295 | ||
313 | static void do_viocd_request(struct request_queue *q) | 296 | static void do_viocd_request(struct request_queue *q) |
314 | { | 297 | { |
315 | struct request *req; | 298 | struct request *req; |
316 | 299 | ||
317 | while ((rwreq == 0) && ((req = elv_next_request(q)) != NULL)) { | 300 | while ((rwreq == 0) && ((req = blk_fetch_request(q)) != NULL)) { |
318 | if (!blk_fs_request(req)) | 301 | if (!blk_fs_request(req)) |
319 | viocd_end_request(req, -EIO); | 302 | __blk_end_request_all(req, -EIO); |
320 | else if (send_request(req) < 0) { | 303 | else if (send_request(req) < 0) { |
321 | printk(VIOCD_KERN_WARNING | 304 | printk(VIOCD_KERN_WARNING |
322 | "unable to send message to OS/400!"); | 305 | "unable to send message to OS/400!"); |
323 | viocd_end_request(req, -EIO); | 306 | __blk_end_request_all(req, -EIO); |
324 | } else | 307 | } else |
325 | rwreq++; | 308 | rwreq++; |
326 | } | 309 | } |
@@ -486,8 +469,8 @@ static void vio_handle_cd_event(struct HvLpEvent *event) | |||
486 | case viocdopen: | 469 | case viocdopen: |
487 | if (event->xRc == 0) { | 470 | if (event->xRc == 0) { |
488 | di = &viocd_diskinfo[bevent->disk]; | 471 | di = &viocd_diskinfo[bevent->disk]; |
489 | blk_queue_hardsect_size(di->viocd_disk->queue, | 472 | blk_queue_logical_block_size(di->viocd_disk->queue, |
490 | bevent->block_size); | 473 | bevent->block_size); |
491 | set_capacity(di->viocd_disk, | 474 | set_capacity(di->viocd_disk, |
492 | bevent->media_size * | 475 | bevent->media_size * |
493 | bevent->block_size / 512); | 476 | bevent->block_size / 512); |
@@ -531,9 +514,9 @@ return_complete: | |||
531 | "with rc %d:0x%04X: %s\n", | 514 | "with rc %d:0x%04X: %s\n", |
532 | req, event->xRc, | 515 | req, event->xRc, |
533 | bevent->sub_result, err->msg); | 516 | bevent->sub_result, err->msg); |
534 | viocd_end_request(req, -EIO); | 517 | __blk_end_request_all(req, -EIO); |
535 | } else | 518 | } else |
536 | viocd_end_request(req, 0); | 519 | __blk_end_request_all(req, 0); |
537 | 520 | ||
538 | /* restart handling of incoming requests */ | 521 | /* restart handling of incoming requests */ |
539 | spin_unlock_irqrestore(&viocd_reqlock, flags); | 522 | spin_unlock_irqrestore(&viocd_reqlock, flags); |