static ssize_t raw_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { struct iovec local_iov = { .iov_base = (void *)buf, .iov_len = count }; return generic_file_write_nolock(file, &local_iov, 1, ppos); } static ssize_t raw_file_aio_write(struct kiocb *iocb, const char *buf, size_t count, loff_t pos) { struct iovec local_iov = { .iov_base = (void *)buf, .iov_len = count }; return generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos); } static struct file_operations raw_fops = { .read = generic_file_read, .aio_read = generic_file_aio_read, .write = raw_file_write, .aio_write = raw_file_aio_write, .open = raw_open, .release= raw_release, .ioctl = raw_ioctl, .readv = generic_file_readv, .writev = generic_file_writev, .owner = THIS_MODULE, }; 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; register_chrdev(RAW_MAJOR, "raw", &raw_fops); 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; } 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"); unregister_chrdev(RAW_MAJOR, "raw"); }
static ssize_t raw_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct iovec local_iov = { .iov_base = (char __user *)buf, .iov_len = count }; return generic_file_write_nolock(file, &local_iov, 1, ppos); } static ssize_t raw_file_aio_write(struct kiocb *iocb, const char __user *buf, size_t count, loff_t pos) { struct iovec local_iov = { .iov_base = (char __user *)buf, .iov_len = count }; return generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos); } static struct file_operations raw_fops = { .read = generic_file_read, .aio_read = generic_file_aio_read, .write = raw_file_write, .aio_write = raw_file_aio_write, .open = raw_open, .release= raw_release, .ioctl = raw_ioctl, .readv = generic_file_readv, .writev = generic_file_writev, .owner = THIS_MODULE, }; static struct file_operations raw_ctl_fops = { .ioctl = raw_ctl_ioctl, .open = raw_open, .owner = THIS_MODULE, }; static struct cdev raw_cdev = { .kobj = {.name = "raw", }, .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")) goto error; cdev_init(&raw_cdev, &raw_fops); if (cdev_add(&raw_cdev, dev, MAX_RAW_MINORS)) { kobject_put(&raw_cdev.kobj); unregister_chrdev_region(dev, MAX_RAW_MINORS); goto error; } 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: printk(KERN_ERR "error register raw device\n"); return 1; }