aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/raw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/raw.c')
-rw-r--r--drivers/char/raw.c50
1 files changed, 14 insertions, 36 deletions
diff --git a/drivers/char/raw.c b/drivers/char/raw.c
index 579868af4a54..89b718e326e5 100644
--- a/drivers/char/raw.c
+++ b/drivers/char/raw.c
@@ -238,39 +238,14 @@ out:
238 return err; 238 return err;
239} 239}
240 240
241static ssize_t raw_file_write(struct file *file, const char __user *buf,
242 size_t count, loff_t *ppos)
243{
244 struct iovec local_iov = {
245 .iov_base = (char __user *)buf,
246 .iov_len = count
247 };
248
249 return generic_file_write_nolock(file, &local_iov, 1, ppos);
250}
251
252static ssize_t raw_file_aio_write(struct kiocb *iocb, const char __user *buf,
253 size_t count, loff_t pos)
254{
255 struct iovec local_iov = {
256 .iov_base = (char __user *)buf,
257 .iov_len = count
258 };
259
260 return generic_file_aio_write_nolock(iocb, &local_iov, 1, &iocb->ki_pos);
261}
262
263
264static const struct file_operations raw_fops = { 241static const struct file_operations raw_fops = {
265 .read = generic_file_read, 242 .read = do_sync_read,
266 .aio_read = generic_file_aio_read, 243 .aio_read = generic_file_aio_read,
267 .write = raw_file_write, 244 .write = do_sync_write,
268 .aio_write = raw_file_aio_write, 245 .aio_write = generic_file_aio_write_nolock,
269 .open = raw_open, 246 .open = raw_open,
270 .release= raw_release, 247 .release= raw_release,
271 .ioctl = raw_ioctl, 248 .ioctl = raw_ioctl,
272 .readv = generic_file_readv,
273 .writev = generic_file_writev,
274 .owner = THIS_MODULE, 249 .owner = THIS_MODULE,
275}; 250};
276 251
@@ -288,31 +263,34 @@ static struct cdev raw_cdev = {
288static int __init raw_init(void) 263static int __init raw_init(void)
289{ 264{
290 dev_t dev = MKDEV(RAW_MAJOR, 0); 265 dev_t dev = MKDEV(RAW_MAJOR, 0);
266 int ret;
291 267
292 if (register_chrdev_region(dev, MAX_RAW_MINORS, "raw")) 268 ret = register_chrdev_region(dev, MAX_RAW_MINORS, "raw");
269 if (ret)
293 goto error; 270 goto error;
294 271
295 cdev_init(&raw_cdev, &raw_fops); 272 cdev_init(&raw_cdev, &raw_fops);
296 if (cdev_add(&raw_cdev, dev, MAX_RAW_MINORS)) { 273 ret = cdev_add(&raw_cdev, dev, MAX_RAW_MINORS);
274 if (ret) {
297 kobject_put(&raw_cdev.kobj); 275 kobject_put(&raw_cdev.kobj);
298 unregister_chrdev_region(dev, MAX_RAW_MINORS); 276 goto error_region;
299 goto error;
300 } 277 }
301 278
302 raw_class = class_create(THIS_MODULE, "raw"); 279 raw_class = class_create(THIS_MODULE, "raw");
303 if (IS_ERR(raw_class)) { 280 if (IS_ERR(raw_class)) {
304 printk(KERN_ERR "Error creating raw class.\n"); 281 printk(KERN_ERR "Error creating raw class.\n");
305 cdev_del(&raw_cdev); 282 cdev_del(&raw_cdev);
306 unregister_chrdev_region(dev, MAX_RAW_MINORS); 283 ret = PTR_ERR(raw_class);
307 goto error; 284 goto error_region;
308 } 285 }
309 class_device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL, "rawctl"); 286 class_device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
310 287
311 return 0; 288 return 0;
312 289
290error_region:
291 unregister_chrdev_region(dev, MAX_RAW_MINORS);
313error: 292error:
314 printk(KERN_ERR "error register raw device\n"); 293 return ret;
315 return 1;
316} 294}
317 295
318static void __exit raw_exit(void) 296static void __exit raw_exit(void)