The misc character device driver uses a semaphore as mutex. Use the mutex API
instead of the (binary) semaphore.
Signed-off-by: Matthias Kaehlcke <matthias.kaehlcke@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/slab.h>
+#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
* Head entry for the doubly linked miscdevice list
*/
static LIST_HEAD(misc_list);
* Head entry for the doubly linked miscdevice list
*/
static LIST_HEAD(misc_list);
-static DECLARE_MUTEX(misc_sem);
+static DEFINE_MUTEX(misc_mtx);
/*
* Assigned numbers, used for dynamic minors
/*
* Assigned numbers, used for dynamic minors
struct miscdevice *p;
loff_t off = 0;
struct miscdevice *p;
loff_t off = 0;
list_for_each_entry(p, &misc_list, list) {
if (*pos == off++)
return p;
list_for_each_entry(p, &misc_list, list) {
if (*pos == off++)
return p;
static void misc_seq_stop(struct seq_file *seq, void *v)
{
static void misc_seq_stop(struct seq_file *seq, void *v)
{
+ mutex_unlock(&misc_mtx);
}
static int misc_seq_show(struct seq_file *seq, void *v)
}
static int misc_seq_show(struct seq_file *seq, void *v)
int err = -ENODEV;
const struct file_operations *old_fops, *new_fops = NULL;
int err = -ENODEV;
const struct file_operations *old_fops, *new_fops = NULL;
list_for_each_entry(c, &misc_list, list) {
if (c->minor == minor) {
list_for_each_entry(c, &misc_list, list) {
if (c->minor == minor) {
+ mutex_unlock(&misc_mtx);
request_module("char-major-%d-%d", MISC_MAJOR, minor);
request_module("char-major-%d-%d", MISC_MAJOR, minor);
list_for_each_entry(c, &misc_list, list) {
if (c->minor == minor) {
list_for_each_entry(c, &misc_list, list) {
if (c->minor == minor) {
}
fops_put(old_fops);
fail:
}
fops_put(old_fops);
fail:
+ mutex_unlock(&misc_mtx);
INIT_LIST_HEAD(&misc->list);
INIT_LIST_HEAD(&misc->list);
list_for_each_entry(c, &misc_list, list) {
if (c->minor == misc->minor) {
list_for_each_entry(c, &misc_list, list) {
if (c->minor == misc->minor) {
+ mutex_unlock(&misc_mtx);
if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)
break;
if (i<0) {
if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)
break;
if (i<0) {
+ mutex_unlock(&misc_mtx);
return -EBUSY;
}
misc->minor = i;
return -EBUSY;
}
misc->minor = i;
*/
list_add(&misc->list, &misc_list);
out:
*/
list_add(&misc->list, &misc_list);
out:
+ mutex_unlock(&misc_mtx);
if (list_empty(&misc->list))
return -EINVAL;
if (list_empty(&misc->list))
return -EINVAL;
list_del(&misc->list);
device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
if (i < DYNAMIC_MINORS && i>0) {
misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
}
list_del(&misc->list);
device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
if (i < DYNAMIC_MINORS && i>0) {
misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
}
+ mutex_unlock(&misc_mtx);