#include <linux/init.h>
#include <linux/fs.h>
+#include <linux/devfs_fs_kernel.h>
#include <linux/major.h>
#include <linux/blkdev.h>
#include <linux/module.h>
#include <linux/uio.h>
#include <linux/cdev.h>
#include <linux/device.h>
-#include <linux/mutex.h>
#include <asm/uaccess.h>
static struct class *raw_class;
static struct raw_device_data raw_devices[MAX_RAW_MINORS];
-static DEFINE_MUTEX(raw_mutex);
-static const struct file_operations raw_ctl_fops; /* forward declaration */
+static DECLARE_MUTEX(raw_mutex);
+static struct file_operations raw_ctl_fops; /* forward declaration */
/*
* Open/close code for raw IO.
return 0;
}
- mutex_lock(&raw_mutex);
+ down(&raw_mutex);
/*
* All we need to do on open is check that the device is bound.
filp->f_dentry->d_inode->i_mapping =
bdev->bd_inode->i_mapping;
filp->private_data = bdev;
- mutex_unlock(&raw_mutex);
+ up(&raw_mutex);
return 0;
out2:
out1:
blkdev_put(bdev);
out:
- mutex_unlock(&raw_mutex);
+ up(&raw_mutex);
return err;
}
const int minor= iminor(inode);
struct block_device *bdev;
- mutex_lock(&raw_mutex);
+ down(&raw_mutex);
bdev = raw_devices[minor].binding;
if (--raw_devices[minor].inuse == 0) {
/* Here inode->i_mapping == bdev->bd_inode->i_mapping */
inode->i_mapping = &inode->i_data;
inode->i_mapping->backing_dev_info = &default_backing_dev_info;
}
- mutex_unlock(&raw_mutex);
+ up(&raw_mutex);
bd_release(bdev);
blkdev_put(bdev);
goto out;
}
- mutex_lock(&raw_mutex);
+ down(&raw_mutex);
if (rawdev->inuse) {
- mutex_unlock(&raw_mutex);
+ up(&raw_mutex);
err = -EBUSY;
goto out;
}
bind_device(&rq);
}
}
- mutex_unlock(&raw_mutex);
+ up(&raw_mutex);
} else {
struct block_device *bdev;
- mutex_lock(&raw_mutex);
+ down(&raw_mutex);
bdev = rawdev->binding;
if (bdev) {
rq.block_major = MAJOR(bdev->bd_dev);
} else {
rq.block_major = rq.block_minor = 0;
}
- mutex_unlock(&raw_mutex);
+ up(&raw_mutex);
if (copy_to_user((void __user *)arg, &rq, sizeof(rq))) {
err = -EFAULT;
goto out;
}
-static const struct file_operations raw_fops = {
+static struct file_operations raw_fops = {
.read = generic_file_read,
.aio_read = generic_file_aio_read,
.write = raw_file_write,
.owner = THIS_MODULE,
};
-static const struct file_operations raw_ctl_fops = {
+static struct file_operations raw_ctl_fops = {
.ioctl = raw_ctl_ioctl,
.open = raw_open,
.owner = THIS_MODULE,
static int __init raw_init(void)
{
+ int i;
dev_t dev = MKDEV(RAW_MAJOR, 0);
if (register_chrdev_region(dev, MAX_RAW_MINORS, "raw"))
}
class_device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
+ devfs_mk_cdev(MKDEV(RAW_MAJOR, 0),
+ S_IFCHR | S_IRUGO | S_IWUGO,
+ "raw/rawctl");
+ for (i = 1; i < MAX_RAW_MINORS; i++)
+ devfs_mk_cdev(MKDEV(RAW_MAJOR, i),
+ S_IFCHR | S_IRUGO | S_IWUGO,
+ "raw/raw%d", i);
return 0;
error:
static void __exit raw_exit(void)
{
+ int i;
+
+ for (i = 1; i < MAX_RAW_MINORS; i++)
+ devfs_remove("raw/raw%d", i);
+ devfs_remove("raw/rawctl");
+ devfs_remove("raw");
class_device_destroy(raw_class, MKDEV(RAW_MAJOR, 0));
class_destroy(raw_class);
cdev_del(&raw_cdev);