X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fblock%2Fpktcdvd.c;h=bc9b2bcd7dba71023824ebb8adc6cbf9e9e0c712;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=a04f60693c396446d4a310e8c1df0eaef62c5012;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index a04f60693..bc9b2bcd7 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -56,7 +56,6 @@ #include #include #include -#include #include #include #include @@ -82,7 +81,7 @@ static struct pktcdvd_device *pkt_devs[MAX_WRITERS]; static struct proc_dir_entry *pkt_proc; static int pkt_major; -static struct mutex ctl_mutex; /* Serialize open/close/setup/teardown */ +static struct semaphore ctl_mutex; /* Serialize open/close/setup/teardown */ static mempool_t *psd_pool; @@ -230,6 +229,16 @@ static int pkt_grow_pktlist(struct pktcdvd_device *pd, int nr_packets) return 1; } +static void *pkt_rb_alloc(gfp_t gfp_mask, void *data) +{ + return kmalloc(sizeof(struct pkt_rb_node), gfp_mask); +} + +static void pkt_rb_free(void *ptr, void *data) +{ + kfree(ptr); +} + static inline struct pkt_rb_node *pkt_rbtree_next(struct pkt_rb_node *node) { struct rb_node *n = rb_next(&node->rb_node); @@ -2009,7 +2018,7 @@ static int pkt_open(struct inode *inode, struct file *file) VPRINTK("pktcdvd: entering open\n"); - mutex_lock(&ctl_mutex); + down(&ctl_mutex); pd = pkt_find_dev_from_minor(iminor(inode)); if (!pd) { ret = -ENODEV; @@ -2035,14 +2044,14 @@ static int pkt_open(struct inode *inode, struct file *file) set_blocksize(inode->i_bdev, CD_FRAMESIZE); } - mutex_unlock(&ctl_mutex); + up(&ctl_mutex); return 0; out_dec: pd->refcnt--; out: VPRINTK("pktcdvd: failed open (%d)\n", ret); - mutex_unlock(&ctl_mutex); + up(&ctl_mutex); return ret; } @@ -2051,18 +2060,28 @@ static int pkt_close(struct inode *inode, struct file *file) struct pktcdvd_device *pd = inode->i_bdev->bd_disk->private_data; int ret = 0; - mutex_lock(&ctl_mutex); + down(&ctl_mutex); pd->refcnt--; BUG_ON(pd->refcnt < 0); if (pd->refcnt == 0) { int flush = test_bit(PACKET_WRITABLE, &pd->flags); pkt_release_dev(pd, flush); } - mutex_unlock(&ctl_mutex); + up(&ctl_mutex); return ret; } +static void *psd_pool_alloc(gfp_t gfp_mask, void *data) +{ + return kmalloc(sizeof(struct packet_stacked_data), gfp_mask); +} + +static void psd_pool_free(void *ptr, void *data) +{ + kfree(ptr); +} + static int pkt_end_io_read_cloned(struct bio *bio, unsigned int bytes_done, int err) { struct packet_stacked_data *psd = bio->bi_private; @@ -2455,8 +2474,7 @@ static int pkt_setup_dev(struct pkt_ctrl_command *ctrl_cmd) if (!pd) return ret; - pd->rb_pool = mempool_create_kmalloc_pool(PKT_RB_POOL_SIZE, - sizeof(struct pkt_rb_node)); + pd->rb_pool = mempool_create(PKT_RB_POOL_SIZE, pkt_rb_alloc, pkt_rb_free, NULL); if (!pd->rb_pool) goto out_mem; @@ -2496,7 +2514,7 @@ static int pkt_setup_dev(struct pkt_ctrl_command *ctrl_cmd) return 0; out_new_dev: - blk_cleanup_queue(disk->queue); + blk_put_queue(disk->queue); out_mem2: put_disk(disk); out_mem: @@ -2537,7 +2555,7 @@ static int pkt_remove_dev(struct pkt_ctrl_command *ctrl_cmd) DPRINTK("pktcdvd: writer %s unmapped\n", pd->name); del_gendisk(pd->disk); - blk_cleanup_queue(pd->disk->queue); + blk_put_queue(pd->disk->queue); put_disk(pd->disk); pkt_devs[idx] = NULL; @@ -2578,21 +2596,21 @@ static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cm case PKT_CTRL_CMD_SETUP: if (!capable(CAP_SYS_ADMIN)) return -EPERM; - mutex_lock(&ctl_mutex); + down(&ctl_mutex); ret = pkt_setup_dev(&ctrl_cmd); - mutex_unlock(&ctl_mutex); + up(&ctl_mutex); break; case PKT_CTRL_CMD_TEARDOWN: if (!capable(CAP_SYS_ADMIN)) return -EPERM; - mutex_lock(&ctl_mutex); + down(&ctl_mutex); ret = pkt_remove_dev(&ctrl_cmd); - mutex_unlock(&ctl_mutex); + up(&ctl_mutex); break; case PKT_CTRL_CMD_STATUS: - mutex_lock(&ctl_mutex); + down(&ctl_mutex); pkt_get_status(&ctrl_cmd); - mutex_unlock(&ctl_mutex); + up(&ctl_mutex); break; default: return -ENOTTY; @@ -2620,8 +2638,7 @@ static int __init pkt_init(void) { int ret; - psd_pool = mempool_create_kmalloc_pool(PSD_POOL_SIZE, - sizeof(struct packet_stacked_data)); + psd_pool = mempool_create(PSD_POOL_SIZE, psd_pool_alloc, psd_pool_free, NULL); if (!psd_pool) return -ENOMEM; @@ -2639,7 +2656,7 @@ static int __init pkt_init(void) goto out; } - mutex_init(&ctl_mutex); + init_MUTEX(&ctl_mutex); pkt_proc = proc_mkdir("pktcdvd", proc_root_driver);