--- cdemu-0.8/cdemu_core.c 2006-08-05 04:38:56.000000000 +0200 +++ cdemu-0.8/cdemu_core.c 2007-08-06 10:51:31.000000000 +0200 @@ -176,7 +176,7 @@ static int cdemu_transfer_bio(struct cde 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", retval); + dprintk("cdemu_transfer: retval error %i\n", (int)retval); return retval; } else { return 0; @@ -486,11 +486,25 @@ static int cdemu_ioctl(struct cdrom_devi } if (cmd == CDROMREADRAW) { - tmp = generic_file_read(vc->backing_file, (void*)arg, CD_FRAMESIZE_RAW, &position); + struct iovec local_iov = { .iov_base = (void*)arg, .iov_len = CD_FRAMESIZE_RAW }; + struct kiocb kiocb; + + init_sync_kiocb(&kiocb, vc->backing_file); + tmp = generic_file_aio_read(&kiocb, &local_iov, 1, position); + if (-EIOCBQUEUED == tmp) + tmp = wait_on_sync_kiocb(&kiocb); + if (tmp != CD_FRAMESIZE_RAW) dprintk("only read %i bytes\n",tmp); } else { /*CDROMREADCOOKED*/ - tmp = generic_file_read(vc->backing_file, (void*)arg, CD_FRAMESIZE, &position); + struct iovec local_iov = { .iov_base = (void*)arg, .iov_len = CD_FRAMESIZE }; + struct kiocb kiocb; + + init_sync_kiocb(&kiocb, vc->backing_file); + tmp = generic_file_aio_read(&kiocb, &local_iov, 1, position); + if (-EIOCBQUEUED == tmp) + tmp = wait_on_sync_kiocb(&kiocb); + if (tmp != CD_FRAMESIZE) dprintk("only read %i bytes\n",tmp); } --- cdemu-0.8/cdemu_mod.c 2006-08-05 04:38:56.000000000 +0200 +++ cdemu-0.8/cdemu_mod.c 2007-08-06 10:49:49.000000000 +0200 @@ -195,7 +195,7 @@ static void __exit cdemu_exit(void) #endif if (vc->bdev) { dprintk("cdemu_exit: punting bdev\n"); - invalidate_bdev(vc->bdev, 1); + invalidate_bdev(vc->bdev); bdput(vc->bdev); } if (vc->gd) {