diff options
Diffstat (limited to 'drivers/char/raw.c')
-rw-r--r-- | drivers/char/raw.c | 50 |
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 | ||
241 | static 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 | |||
252 | static 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 | |||
264 | static const struct file_operations raw_fops = { | 241 | static 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 = { | |||
288 | static int __init raw_init(void) | 263 | static 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 | ||
290 | error_region: | ||
291 | unregister_chrdev_region(dev, MAX_RAW_MINORS); | ||
313 | error: | 292 | error: |
314 | printk(KERN_ERR "error register raw device\n"); | 293 | return ret; |
315 | return 1; | ||
316 | } | 294 | } |
317 | 295 | ||
318 | static void __exit raw_exit(void) | 296 | static void __exit raw_exit(void) |