X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fblock%2Fpktcdvd.c;h=bc56770bcc90889338810134bba163530e9f72d1;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=03a9388049a4610578267888e4495cb4674e6f7b;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 03a938804..bc56770bc 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -135,12 +135,10 @@ static struct packet_data *pkt_alloc_packet_data(void) goto no_bio; for (i = 0; i < PAGES_PER_PACKET; i++) { - pkt->pages[i] = alloc_page(GFP_KERNEL); + pkt->pages[i] = alloc_page(GFP_KERNEL|__GFP_ZERO); if (!pkt->pages[i]) goto no_page; } - for (i = 0; i < PAGES_PER_PACKET; i++) - clear_page(page_address(pkt->pages[i])); spin_lock_init(&pkt->lock); @@ -221,7 +219,7 @@ static int pkt_grow_pktlist(struct pktcdvd_device *pd, int nr_packets) return 1; } -static void *pkt_rb_alloc(int gfp_mask, void *data) +static void *pkt_rb_alloc(unsigned int __nocast gfp_mask, void *data) { return kmalloc(sizeof(struct pkt_rb_node), gfp_mask); } @@ -377,6 +375,7 @@ static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command * rq->ref_count++; rq->flags |= REQ_NOMERGE; rq->waiting = &wait; + rq->end_io = blk_end_sync_rq; elv_add_request(q, rq, ELEVATOR_INSERT_BACK, 1); generic_unplug_device(q); wait_for_completion(&wait); @@ -607,8 +606,7 @@ static int pkt_set_segment_merging(struct pktcdvd_device *pd, request_queue_t *q /* * Copy CD_FRAMESIZE bytes from src_bio into a destination page */ -static void pkt_copy_bio_data(struct bio *src_bio, int seg, int offs, - struct page *dst_page, int dst_offs) +static void pkt_copy_bio_data(struct bio *src_bio, int seg, int offs, struct page *dst_page, int dst_offs) { unsigned int copy_size = CD_FRAMESIZE; @@ -916,8 +914,10 @@ static int pkt_handle_queue(struct pktcdvd_device *pd) bio = node->bio; zone = ZONE(bio->bi_sector, pd); list_for_each_entry(p, &pd->cdrw.pkt_active_list, list) { - if (p->sector == zone) + if (p->sector == zone) { + bio = NULL; goto try_next_bio; + } } break; try_next_bio: @@ -1301,8 +1301,7 @@ static void pkt_print_settings(struct pktcdvd_device *pd) printk("Mode-%c disc\n", pd->settings.block_mode == 8 ? '1' : '2'); } -static int pkt_mode_sense(struct pktcdvd_device *pd, struct packet_command *cgc, - int page_code, int page_control) +static int pkt_mode_sense(struct pktcdvd_device *pd, struct packet_command *cgc, int page_code, int page_control) { memset(cgc->cmd, 0, sizeof(cgc->cmd)); @@ -1424,8 +1423,8 @@ static int pkt_set_write_settings(struct pktcdvd_device *pd) char buffer[128]; int ret, size; - /* doesn't apply to DVD+RW */ - if (pd->mmc3_profile == 0x1a) + /* doesn't apply to DVD+RW or DVD-RAM */ + if ((pd->mmc3_profile == 0x1a) || (pd->mmc3_profile == 0x12)) return 0; memset(buffer, 0, sizeof(buffer)); @@ -1539,6 +1538,7 @@ static int pkt_good_disc(struct pktcdvd_device *pd, disc_information *di) break; case 0x1a: /* DVD+RW */ case 0x13: /* DVD-RW */ + case 0x12: /* DVD-RAM */ return 0; default: printk("pktcdvd: Wrong disc profile (%x)\n", pd->mmc3_profile); @@ -1604,6 +1604,9 @@ static int pkt_probe_settings(struct pktcdvd_device *pd) case 0x13: /* DVD-RW */ printk("pktcdvd: inserted media is DVD-RW\n"); break; + case 0x12: /* DVD-RAM */ + printk("pktcdvd: inserted media is DVD-RAM\n"); + break; default: printk("pktcdvd: inserted media is CD-R%s\n", di.erasable ? "W" : ""); break; @@ -1896,6 +1899,7 @@ static int pkt_open_write(struct pktcdvd_device *pd) switch (pd->mmc3_profile) { case 0x13: /* DVD-RW */ case 0x1a: /* DVD+RW */ + case 0x12: /* DVD-RAM */ DPRINTK("pktcdvd: write speed %ukB/s\n", write_speed); break; default: @@ -2017,7 +2021,13 @@ static int pkt_open(struct inode *inode, struct file *file) BUG_ON(pd->refcnt < 0); pd->refcnt++; - if (pd->refcnt == 1) { + if (pd->refcnt > 1) { + if ((file->f_mode & FMODE_WRITE) && + !test_bit(PACKET_WRITABLE, &pd->flags)) { + ret = -EBUSY; + goto out_dec; + } + } else { if (pkt_open_dev(pd, file->f_mode & FMODE_WRITE)) { ret = -EIO; goto out_dec; @@ -2057,7 +2067,7 @@ static int pkt_close(struct inode *inode, struct file *file) } -static void *psd_pool_alloc(int gfp_mask, void *data) +static void *psd_pool_alloc(unsigned int __nocast gfp_mask, void *data) { return kmalloc(sizeof(struct packet_stacked_data), gfp_mask); } @@ -2404,7 +2414,7 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u case CDROM_LAST_WRITTEN: case CDROM_SEND_PACKET: case SCSI_IOCTL_SEND_COMMAND: - return ioctl_by_bdev(pd->bdev, cmd, arg); + return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); case CDROMEJECT: /* @@ -2412,7 +2422,7 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u * have to unlock it or else the eject command fails. */ pkt_lock_door(pd, 0); - return ioctl_by_bdev(pd->bdev, cmd, arg); + return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); default: printk("pktcdvd: Unknown ioctl for %s (%x)\n", pd->name, cmd); @@ -2627,7 +2637,7 @@ static struct miscdevice pkt_misc = { .fops = &pkt_ctl_fops }; -int pkt_init(void) +static int __init pkt_init(void) { int ret; @@ -2663,7 +2673,7 @@ out2: return ret; } -void pkt_exit(void) +static void __exit pkt_exit(void) { remove_proc_entry("pktcdvd", proc_root_driver); misc_deregister(&pkt_misc);