Index: cdemu_core.c =================================================================== --- cdemu_core.c +++ cdemu_core.c 2008-04-23 16:32:29.000000000 +0300 @@ -169,13 +169,13 @@ static int cdemu_transfer_bio(struct cdemu_device *vc, struct bio *bio, sector_t sector) { - ssize_t retval; int startposition, track; int offset; loff_t position; /* is only != 0 if the sector is not inline with our sectors vmware does request such sectors ... mount does not */ int sec_offset = sector % 4; + read_descriptor_t desc; sector /= 4; /* thats just testing code as I don't know really how it works */ @@ -209,15 +209,16 @@ /* we only support read, and we told the kernel that, * so we won't check it here */ position = startposition + offset + sec_offset * 512; + desc.written = 0; + desc.count = bio_iovec(bio)->bv_len; + desc.arg.data = &bio; + desc.error = 0; dprintk("cdemu_transfer: %lli %i\n", position, bio_iovec(bio)->bv_len); - retval = vc->backing_file->f_op->sendfile(vc->backing_file, - &position, bio_iovec(bio)->bv_len, cdemu_read_actor_bio, bio); - if (retval < 0) { - dprintk("cdemu_transfer: retval error %i\n", (int) retval); - return retval; - } else { + do_generic_file_read(vc->backing_file, &position, &desc, cdemu_read_actor_bio); + if (desc.written) return 0; - } + dprintk("cdemu_transfer: retval error %i\n", (int) desc.error); + return desc.error; } static int unload_cd(struct cdemu_device *vc) @@ -286,7 +287,7 @@ /* now lets end the request */ end_this_request: - bio_endio(bio, bio->bi_size, status); + bio_endio(bio, status); return 0; } Index: cdemu_mod.c =================================================================== --- cdemu_mod.c +++ cdemu_mod.c 2008-04-23 16:33:58.000000000 +0300 @@ -433,8 +433,7 @@ device_for_each_child(&virtual_bus, NULL, &remove_cdemu_device_helper); out_blkdev: - if (unregister_blkdev(cdemu_drv.major, DEVICE_NAME)) - printk_cdemu(KERN_ERR, "unable to unregister block device\n"); + unregister_blkdev(cdemu_drv.major, DEVICE_NAME); out_driver_unregister: driver_unregister(&cdemu_drv.drv); @@ -459,8 +458,7 @@ devfs_remove("cdemu"); #endif - if (unregister_blkdev(cdemu_drv.major, DEVICE_NAME)) - printk_cdemu(KERN_ERR, "unable to unregister block device\n"); + unregister_blkdev(cdemu_drv.major, DEVICE_NAME); /* unregister driver */ if(!driver_was_registered) {