Loading drivers/input/serio/serio_raw.c +13 −15 Original line number Original line Diff line number Diff line Loading @@ -9,6 +9,7 @@ * the Free Software Foundation. * the Free Software Foundation. */ */ #include <linux/kref.h> #include <linux/sched.h> #include <linux/sched.h> #include <linux/slab.h> #include <linux/slab.h> #include <linux/poll.h> #include <linux/poll.h> Loading @@ -33,7 +34,7 @@ struct serio_raw { unsigned int tail, head; unsigned int tail, head; char name[16]; char name[16]; unsigned int refcnt; struct kref kref; struct serio *serio; struct serio *serio; struct miscdevice dev; struct miscdevice dev; wait_queue_head_t wait; wait_queue_head_t wait; Loading Loading @@ -104,7 +105,7 @@ static int serio_raw_open(struct inode *inode, struct file *file) list->serio_raw = serio_raw; list->serio_raw = serio_raw; file->private_data = list; file->private_data = list; serio_raw->refcnt++; kref_get(&serio_raw->kref); list_add_tail(&list->node, &serio_raw->list); list_add_tail(&list->node, &serio_raw->list); out: out: Loading @@ -112,17 +113,14 @@ static int serio_raw_open(struct inode *inode, struct file *file) return retval; return retval; } } static int serio_raw_cleanup(struct serio_raw *serio_raw) static void serio_raw_cleanup(struct kref *kref) { { if (--serio_raw->refcnt == 0) { struct serio_raw *serio_raw = container_of(kref, struct serio_raw, kref); misc_deregister(&serio_raw->dev); misc_deregister(&serio_raw->dev); list_del_init(&serio_raw->node); list_del_init(&serio_raw->node); kfree(serio_raw); kfree(serio_raw); return 1; } return 0; } } static int serio_raw_release(struct inode *inode, struct file *file) static int serio_raw_release(struct inode *inode, struct file *file) Loading @@ -132,7 +130,7 @@ static int serio_raw_release(struct inode *inode, struct file *file) mutex_lock(&serio_raw_mutex); mutex_lock(&serio_raw_mutex); serio_raw_cleanup(serio_raw); kref_put(&serio_raw->kref, serio_raw_cleanup); mutex_unlock(&serio_raw_mutex); mutex_unlock(&serio_raw_mutex); return 0; return 0; Loading Loading @@ -283,7 +281,7 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) mutex_lock(&serio_raw_mutex); mutex_lock(&serio_raw_mutex); snprintf(serio_raw->name, sizeof(serio_raw->name), "serio_raw%d", serio_raw_no++); snprintf(serio_raw->name, sizeof(serio_raw->name), "serio_raw%d", serio_raw_no++); serio_raw->refcnt = 1; kref_init(&serio_raw->kref); serio_raw->serio = serio; serio_raw->serio = serio; INIT_LIST_HEAD(&serio_raw->list); INIT_LIST_HEAD(&serio_raw->list); init_waitqueue_head(&serio_raw->wait); init_waitqueue_head(&serio_raw->wait); Loading Loading @@ -357,8 +355,8 @@ static void serio_raw_disconnect(struct serio *serio) serio_set_drvdata(serio, NULL); serio_set_drvdata(serio, NULL); serio_raw->serio = NULL; serio_raw->serio = NULL; if (!serio_raw_cleanup(serio_raw)) wake_up_interruptible(&serio_raw->wait); wake_up_interruptible(&serio_raw->wait); kref_put(&serio_raw->kref, serio_raw_cleanup); mutex_unlock(&serio_raw_mutex); mutex_unlock(&serio_raw_mutex); } } Loading Loading
drivers/input/serio/serio_raw.c +13 −15 Original line number Original line Diff line number Diff line Loading @@ -9,6 +9,7 @@ * the Free Software Foundation. * the Free Software Foundation. */ */ #include <linux/kref.h> #include <linux/sched.h> #include <linux/sched.h> #include <linux/slab.h> #include <linux/slab.h> #include <linux/poll.h> #include <linux/poll.h> Loading @@ -33,7 +34,7 @@ struct serio_raw { unsigned int tail, head; unsigned int tail, head; char name[16]; char name[16]; unsigned int refcnt; struct kref kref; struct serio *serio; struct serio *serio; struct miscdevice dev; struct miscdevice dev; wait_queue_head_t wait; wait_queue_head_t wait; Loading Loading @@ -104,7 +105,7 @@ static int serio_raw_open(struct inode *inode, struct file *file) list->serio_raw = serio_raw; list->serio_raw = serio_raw; file->private_data = list; file->private_data = list; serio_raw->refcnt++; kref_get(&serio_raw->kref); list_add_tail(&list->node, &serio_raw->list); list_add_tail(&list->node, &serio_raw->list); out: out: Loading @@ -112,17 +113,14 @@ static int serio_raw_open(struct inode *inode, struct file *file) return retval; return retval; } } static int serio_raw_cleanup(struct serio_raw *serio_raw) static void serio_raw_cleanup(struct kref *kref) { { if (--serio_raw->refcnt == 0) { struct serio_raw *serio_raw = container_of(kref, struct serio_raw, kref); misc_deregister(&serio_raw->dev); misc_deregister(&serio_raw->dev); list_del_init(&serio_raw->node); list_del_init(&serio_raw->node); kfree(serio_raw); kfree(serio_raw); return 1; } return 0; } } static int serio_raw_release(struct inode *inode, struct file *file) static int serio_raw_release(struct inode *inode, struct file *file) Loading @@ -132,7 +130,7 @@ static int serio_raw_release(struct inode *inode, struct file *file) mutex_lock(&serio_raw_mutex); mutex_lock(&serio_raw_mutex); serio_raw_cleanup(serio_raw); kref_put(&serio_raw->kref, serio_raw_cleanup); mutex_unlock(&serio_raw_mutex); mutex_unlock(&serio_raw_mutex); return 0; return 0; Loading Loading @@ -283,7 +281,7 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) mutex_lock(&serio_raw_mutex); mutex_lock(&serio_raw_mutex); snprintf(serio_raw->name, sizeof(serio_raw->name), "serio_raw%d", serio_raw_no++); snprintf(serio_raw->name, sizeof(serio_raw->name), "serio_raw%d", serio_raw_no++); serio_raw->refcnt = 1; kref_init(&serio_raw->kref); serio_raw->serio = serio; serio_raw->serio = serio; INIT_LIST_HEAD(&serio_raw->list); INIT_LIST_HEAD(&serio_raw->list); init_waitqueue_head(&serio_raw->wait); init_waitqueue_head(&serio_raw->wait); Loading Loading @@ -357,8 +355,8 @@ static void serio_raw_disconnect(struct serio *serio) serio_set_drvdata(serio, NULL); serio_set_drvdata(serio, NULL); serio_raw->serio = NULL; serio_raw->serio = NULL; if (!serio_raw_cleanup(serio_raw)) wake_up_interruptible(&serio_raw->wait); wake_up_interruptible(&serio_raw->wait); kref_put(&serio_raw->kref, serio_raw_cleanup); mutex_unlock(&serio_raw_mutex); mutex_unlock(&serio_raw_mutex); } } Loading