diff options
-rw-r--r-- | drivers/char/mem.c | 204 |
1 files changed, 102 insertions, 102 deletions
diff --git a/drivers/char/mem.c b/drivers/char/mem.c index e3f5577cbce3..1f3215ac085b 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 1991, 1992 Linus Torvalds | 4 | * Copyright (C) 1991, 1992 Linus Torvalds |
5 | * | 5 | * |
6 | * Added devfs support. | 6 | * Added devfs support. |
7 | * Jan-11-1998, C. Scott Ananian <cananian@alumni.princeton.edu> | 7 | * Jan-11-1998, C. Scott Ananian <cananian@alumni.princeton.edu> |
8 | * Shared /dev/zero mmapping support, Feb 2000, Kanoj Sarcar <kanoj@sgi.com> | 8 | * Shared /dev/zero mmapping support, Feb 2000, Kanoj Sarcar <kanoj@sgi.com> |
9 | */ | 9 | */ |
@@ -44,36 +44,6 @@ static inline unsigned long size_inside_page(unsigned long start, | |||
44 | return min(sz, size); | 44 | return min(sz, size); |
45 | } | 45 | } |
46 | 46 | ||
47 | /* | ||
48 | * Architectures vary in how they handle caching for addresses | ||
49 | * outside of main memory. | ||
50 | * | ||
51 | */ | ||
52 | static inline int uncached_access(struct file *file, unsigned long addr) | ||
53 | { | ||
54 | #if defined(CONFIG_IA64) | ||
55 | /* | ||
56 | * On ia64, we ignore O_DSYNC because we cannot tolerate memory attribute aliases. | ||
57 | */ | ||
58 | return !(efi_mem_attributes(addr) & EFI_MEMORY_WB); | ||
59 | #elif defined(CONFIG_MIPS) | ||
60 | { | ||
61 | extern int __uncached_access(struct file *file, | ||
62 | unsigned long addr); | ||
63 | |||
64 | return __uncached_access(file, addr); | ||
65 | } | ||
66 | #else | ||
67 | /* | ||
68 | * Accessing memory above the top the kernel knows about or through a file pointer | ||
69 | * that was marked O_DSYNC will be done non-cached. | ||
70 | */ | ||
71 | if (file->f_flags & O_DSYNC) | ||
72 | return 1; | ||
73 | return addr >= __pa(high_memory); | ||
74 | #endif | ||
75 | } | ||
76 | |||
77 | #ifndef ARCH_HAS_VALID_PHYS_ADDR_RANGE | 47 | #ifndef ARCH_HAS_VALID_PHYS_ADDR_RANGE |
78 | static inline int valid_phys_addr_range(unsigned long addr, size_t count) | 48 | static inline int valid_phys_addr_range(unsigned long addr, size_t count) |
79 | { | 49 | { |
@@ -115,15 +85,15 @@ static inline int range_is_allowed(unsigned long pfn, unsigned long size) | |||
115 | } | 85 | } |
116 | #endif | 86 | #endif |
117 | 87 | ||
118 | void __attribute__((weak)) unxlate_dev_mem_ptr(unsigned long phys, void *addr) | 88 | void __weak unxlate_dev_mem_ptr(unsigned long phys, void *addr) |
119 | { | 89 | { |
120 | } | 90 | } |
121 | 91 | ||
122 | /* | 92 | /* |
123 | * This funcion reads the *physical* memory. The f_pos points directly to the | 93 | * This funcion reads the *physical* memory. The f_pos points directly to the |
124 | * memory location. | 94 | * memory location. |
125 | */ | 95 | */ |
126 | static ssize_t read_mem(struct file * file, char __user * buf, | 96 | static ssize_t read_mem(struct file *file, char __user *buf, |
127 | size_t count, loff_t *ppos) | 97 | size_t count, loff_t *ppos) |
128 | { | 98 | { |
129 | unsigned long p = *ppos; | 99 | unsigned long p = *ppos; |
@@ -140,10 +110,10 @@ static ssize_t read_mem(struct file * file, char __user * buf, | |||
140 | if (sz > 0) { | 110 | if (sz > 0) { |
141 | if (clear_user(buf, sz)) | 111 | if (clear_user(buf, sz)) |
142 | return -EFAULT; | 112 | return -EFAULT; |
143 | buf += sz; | 113 | buf += sz; |
144 | p += sz; | 114 | p += sz; |
145 | count -= sz; | 115 | count -= sz; |
146 | read += sz; | 116 | read += sz; |
147 | } | 117 | } |
148 | } | 118 | } |
149 | #endif | 119 | #endif |
@@ -157,9 +127,9 @@ static ssize_t read_mem(struct file * file, char __user * buf, | |||
157 | return -EPERM; | 127 | return -EPERM; |
158 | 128 | ||
159 | /* | 129 | /* |
160 | * On ia64 if a page has been mapped somewhere as | 130 | * On ia64 if a page has been mapped somewhere as uncached, then |
161 | * uncached, then it must also be accessed uncached | 131 | * it must also be accessed uncached by the kernel or data |
162 | * by the kernel or data corruption may occur | 132 | * corruption may occur. |
163 | */ | 133 | */ |
164 | ptr = xlate_dev_mem_ptr(p); | 134 | ptr = xlate_dev_mem_ptr(p); |
165 | if (!ptr) | 135 | if (!ptr) |
@@ -180,7 +150,7 @@ static ssize_t read_mem(struct file * file, char __user * buf, | |||
180 | return read; | 150 | return read; |
181 | } | 151 | } |
182 | 152 | ||
183 | static ssize_t write_mem(struct file * file, const char __user * buf, | 153 | static ssize_t write_mem(struct file *file, const char __user *buf, |
184 | size_t count, loff_t *ppos) | 154 | size_t count, loff_t *ppos) |
185 | { | 155 | { |
186 | unsigned long p = *ppos; | 156 | unsigned long p = *ppos; |
@@ -212,9 +182,9 @@ static ssize_t write_mem(struct file * file, const char __user * buf, | |||
212 | return -EPERM; | 182 | return -EPERM; |
213 | 183 | ||
214 | /* | 184 | /* |
215 | * On ia64 if a page has been mapped somewhere as | 185 | * On ia64 if a page has been mapped somewhere as uncached, then |
216 | * uncached, then it must also be accessed uncached | 186 | * it must also be accessed uncached by the kernel or data |
217 | * by the kernel or data corruption may occur | 187 | * corruption may occur. |
218 | */ | 188 | */ |
219 | ptr = xlate_dev_mem_ptr(p); | 189 | ptr = xlate_dev_mem_ptr(p); |
220 | if (!ptr) { | 190 | if (!ptr) { |
@@ -242,13 +212,46 @@ static ssize_t write_mem(struct file * file, const char __user * buf, | |||
242 | return written; | 212 | return written; |
243 | } | 213 | } |
244 | 214 | ||
245 | int __attribute__((weak)) phys_mem_access_prot_allowed(struct file *file, | 215 | int __weak phys_mem_access_prot_allowed(struct file *file, |
246 | unsigned long pfn, unsigned long size, pgprot_t *vma_prot) | 216 | unsigned long pfn, unsigned long size, pgprot_t *vma_prot) |
247 | { | 217 | { |
248 | return 1; | 218 | return 1; |
249 | } | 219 | } |
250 | 220 | ||
251 | #ifndef __HAVE_PHYS_MEM_ACCESS_PROT | 221 | #ifndef __HAVE_PHYS_MEM_ACCESS_PROT |
222 | |||
223 | /* | ||
224 | * Architectures vary in how they handle caching for addresses | ||
225 | * outside of main memory. | ||
226 | * | ||
227 | */ | ||
228 | static int uncached_access(struct file *file, unsigned long addr) | ||
229 | { | ||
230 | #if defined(CONFIG_IA64) | ||
231 | /* | ||
232 | * On ia64, we ignore O_DSYNC because we cannot tolerate memory | ||
233 | * attribute aliases. | ||
234 | */ | ||
235 | return !(efi_mem_attributes(addr) & EFI_MEMORY_WB); | ||
236 | #elif defined(CONFIG_MIPS) | ||
237 | { | ||
238 | extern int __uncached_access(struct file *file, | ||
239 | unsigned long addr); | ||
240 | |||
241 | return __uncached_access(file, addr); | ||
242 | } | ||
243 | #else | ||
244 | /* | ||
245 | * Accessing memory above the top the kernel knows about or through a | ||
246 | * file pointer | ||
247 | * that was marked O_DSYNC will be done non-cached. | ||
248 | */ | ||
249 | if (file->f_flags & O_DSYNC) | ||
250 | return 1; | ||
251 | return addr >= __pa(high_memory); | ||
252 | #endif | ||
253 | } | ||
254 | |||
252 | static pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | 255 | static pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, |
253 | unsigned long size, pgprot_t vma_prot) | 256 | unsigned long size, pgprot_t vma_prot) |
254 | { | 257 | { |
@@ -294,7 +297,7 @@ static const struct vm_operations_struct mmap_mem_ops = { | |||
294 | #endif | 297 | #endif |
295 | }; | 298 | }; |
296 | 299 | ||
297 | static int mmap_mem(struct file * file, struct vm_area_struct * vma) | 300 | static int mmap_mem(struct file *file, struct vm_area_struct *vma) |
298 | { | 301 | { |
299 | size_t size = vma->vm_end - vma->vm_start; | 302 | size_t size = vma->vm_end - vma->vm_start; |
300 | 303 | ||
@@ -329,7 +332,7 @@ static int mmap_mem(struct file * file, struct vm_area_struct * vma) | |||
329 | } | 332 | } |
330 | 333 | ||
331 | #ifdef CONFIG_DEVKMEM | 334 | #ifdef CONFIG_DEVKMEM |
332 | static int mmap_kmem(struct file * file, struct vm_area_struct * vma) | 335 | static int mmap_kmem(struct file *file, struct vm_area_struct *vma) |
333 | { | 336 | { |
334 | unsigned long pfn; | 337 | unsigned long pfn; |
335 | 338 | ||
@@ -337,9 +340,9 @@ static int mmap_kmem(struct file * file, struct vm_area_struct * vma) | |||
337 | pfn = __pa((u64)vma->vm_pgoff << PAGE_SHIFT) >> PAGE_SHIFT; | 340 | pfn = __pa((u64)vma->vm_pgoff << PAGE_SHIFT) >> PAGE_SHIFT; |
338 | 341 | ||
339 | /* | 342 | /* |
340 | * RED-PEN: on some architectures there is more mapped memory | 343 | * RED-PEN: on some architectures there is more mapped memory than |
341 | * than available in mem_map which pfn_valid checks | 344 | * available in mem_map which pfn_valid checks for. Perhaps should add a |
342 | * for. Perhaps should add a new macro here. | 345 | * new macro here. |
343 | * | 346 | * |
344 | * RED-PEN: vmalloc is not supported right now. | 347 | * RED-PEN: vmalloc is not supported right now. |
345 | */ | 348 | */ |
@@ -389,7 +392,7 @@ static ssize_t read_oldmem(struct file *file, char __user *buf, | |||
389 | /* | 392 | /* |
390 | * This function reads the *virtual* memory as seen by the kernel. | 393 | * This function reads the *virtual* memory as seen by the kernel. |
391 | */ | 394 | */ |
392 | static ssize_t read_kmem(struct file *file, char __user *buf, | 395 | static ssize_t read_kmem(struct file *file, char __user *buf, |
393 | size_t count, loff_t *ppos) | 396 | size_t count, loff_t *ppos) |
394 | { | 397 | { |
395 | unsigned long p = *ppos; | 398 | unsigned long p = *ppos; |
@@ -400,8 +403,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf, | |||
400 | read = 0; | 403 | read = 0; |
401 | if (p < (unsigned long) high_memory) { | 404 | if (p < (unsigned long) high_memory) { |
402 | low_count = count; | 405 | low_count = count; |
403 | if (count > (unsigned long) high_memory - p) | 406 | if (count > (unsigned long)high_memory - p) |
404 | low_count = (unsigned long) high_memory - p; | 407 | low_count = (unsigned long)high_memory - p; |
405 | 408 | ||
406 | #ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED | 409 | #ifdef __ARCH_HAS_NO_PAGE_ZERO_MAPPED |
407 | /* we don't have page 0 mapped on sparc and m68k.. */ | 410 | /* we don't have page 0 mapped on sparc and m68k.. */ |
@@ -465,9 +468,8 @@ static ssize_t read_kmem(struct file *file, char __user *buf, | |||
465 | } | 468 | } |
466 | 469 | ||
467 | 470 | ||
468 | static inline ssize_t | 471 | static ssize_t do_write_kmem(unsigned long p, const char __user *buf, |
469 | do_write_kmem(unsigned long p, const char __user *buf, | 472 | size_t count, loff_t *ppos) |
470 | size_t count, loff_t *ppos) | ||
471 | { | 473 | { |
472 | ssize_t written, sz; | 474 | ssize_t written, sz; |
473 | unsigned long copied; | 475 | unsigned long copied; |
@@ -491,9 +493,9 @@ do_write_kmem(unsigned long p, const char __user *buf, | |||
491 | sz = size_inside_page(p, count); | 493 | sz = size_inside_page(p, count); |
492 | 494 | ||
493 | /* | 495 | /* |
494 | * On ia64 if a page has been mapped somewhere as | 496 | * On ia64 if a page has been mapped somewhere as uncached, then |
495 | * uncached, then it must also be accessed uncached | 497 | * it must also be accessed uncached by the kernel or data |
496 | * by the kernel or data corruption may occur | 498 | * corruption may occur. |
497 | */ | 499 | */ |
498 | ptr = xlate_dev_kmem_ptr((char *)p); | 500 | ptr = xlate_dev_kmem_ptr((char *)p); |
499 | 501 | ||
@@ -514,11 +516,10 @@ do_write_kmem(unsigned long p, const char __user *buf, | |||
514 | return written; | 516 | return written; |
515 | } | 517 | } |
516 | 518 | ||
517 | |||
518 | /* | 519 | /* |
519 | * This function writes to the *virtual* memory as seen by the kernel. | 520 | * This function writes to the *virtual* memory as seen by the kernel. |
520 | */ | 521 | */ |
521 | static ssize_t write_kmem(struct file * file, const char __user * buf, | 522 | static ssize_t write_kmem(struct file *file, const char __user *buf, |
522 | size_t count, loff_t *ppos) | 523 | size_t count, loff_t *ppos) |
523 | { | 524 | { |
524 | unsigned long p = *ppos; | 525 | unsigned long p = *ppos; |
@@ -570,17 +571,17 @@ static ssize_t write_kmem(struct file * file, const char __user * buf, | |||
570 | #endif | 571 | #endif |
571 | 572 | ||
572 | #ifdef CONFIG_DEVPORT | 573 | #ifdef CONFIG_DEVPORT |
573 | static ssize_t read_port(struct file * file, char __user * buf, | 574 | static ssize_t read_port(struct file *file, char __user *buf, |
574 | size_t count, loff_t *ppos) | 575 | size_t count, loff_t *ppos) |
575 | { | 576 | { |
576 | unsigned long i = *ppos; | 577 | unsigned long i = *ppos; |
577 | char __user *tmp = buf; | 578 | char __user *tmp = buf; |
578 | 579 | ||
579 | if (!access_ok(VERIFY_WRITE, buf, count)) | 580 | if (!access_ok(VERIFY_WRITE, buf, count)) |
580 | return -EFAULT; | 581 | return -EFAULT; |
581 | while (count-- > 0 && i < 65536) { | 582 | while (count-- > 0 && i < 65536) { |
582 | if (__put_user(inb(i),tmp) < 0) | 583 | if (__put_user(inb(i), tmp) < 0) |
583 | return -EFAULT; | 584 | return -EFAULT; |
584 | i++; | 585 | i++; |
585 | tmp++; | 586 | tmp++; |
586 | } | 587 | } |
@@ -588,22 +589,22 @@ static ssize_t read_port(struct file * file, char __user * buf, | |||
588 | return tmp-buf; | 589 | return tmp-buf; |
589 | } | 590 | } |
590 | 591 | ||
591 | static ssize_t write_port(struct file * file, const char __user * buf, | 592 | static ssize_t write_port(struct file *file, const char __user *buf, |
592 | size_t count, loff_t *ppos) | 593 | size_t count, loff_t *ppos) |
593 | { | 594 | { |
594 | unsigned long i = *ppos; | 595 | unsigned long i = *ppos; |
595 | const char __user * tmp = buf; | 596 | const char __user * tmp = buf; |
596 | 597 | ||
597 | if (!access_ok(VERIFY_READ,buf,count)) | 598 | if (!access_ok(VERIFY_READ, buf, count)) |
598 | return -EFAULT; | 599 | return -EFAULT; |
599 | while (count-- > 0 && i < 65536) { | 600 | while (count-- > 0 && i < 65536) { |
600 | char c; | 601 | char c; |
601 | if (__get_user(c, tmp)) { | 602 | if (__get_user(c, tmp)) { |
602 | if (tmp > buf) | 603 | if (tmp > buf) |
603 | break; | 604 | break; |
604 | return -EFAULT; | 605 | return -EFAULT; |
605 | } | 606 | } |
606 | outb(c,i); | 607 | outb(c, i); |
607 | i++; | 608 | i++; |
608 | tmp++; | 609 | tmp++; |
609 | } | 610 | } |
@@ -612,13 +613,13 @@ static ssize_t write_port(struct file * file, const char __user * buf, | |||
612 | } | 613 | } |
613 | #endif | 614 | #endif |
614 | 615 | ||
615 | static ssize_t read_null(struct file * file, char __user * buf, | 616 | static ssize_t read_null(struct file *file, char __user *buf, |
616 | size_t count, loff_t *ppos) | 617 | size_t count, loff_t *ppos) |
617 | { | 618 | { |
618 | return 0; | 619 | return 0; |
619 | } | 620 | } |
620 | 621 | ||
621 | static ssize_t write_null(struct file * file, const char __user * buf, | 622 | static ssize_t write_null(struct file *file, const char __user *buf, |
622 | size_t count, loff_t *ppos) | 623 | size_t count, loff_t *ppos) |
623 | { | 624 | { |
624 | return count; | 625 | return count; |
@@ -630,13 +631,13 @@ static int pipe_to_null(struct pipe_inode_info *info, struct pipe_buffer *buf, | |||
630 | return sd->len; | 631 | return sd->len; |
631 | } | 632 | } |
632 | 633 | ||
633 | static ssize_t splice_write_null(struct pipe_inode_info *pipe,struct file *out, | 634 | static ssize_t splice_write_null(struct pipe_inode_info *pipe, struct file *out, |
634 | loff_t *ppos, size_t len, unsigned int flags) | 635 | loff_t *ppos, size_t len, unsigned int flags) |
635 | { | 636 | { |
636 | return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_null); | 637 | return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_null); |
637 | } | 638 | } |
638 | 639 | ||
639 | static ssize_t read_zero(struct file * file, char __user * buf, | 640 | static ssize_t read_zero(struct file *file, char __user *buf, |
640 | size_t count, loff_t *ppos) | 641 | size_t count, loff_t *ppos) |
641 | { | 642 | { |
642 | size_t written; | 643 | size_t written; |
@@ -667,7 +668,7 @@ static ssize_t read_zero(struct file * file, char __user * buf, | |||
667 | return written ? written : -EFAULT; | 668 | return written ? written : -EFAULT; |
668 | } | 669 | } |
669 | 670 | ||
670 | static int mmap_zero(struct file * file, struct vm_area_struct * vma) | 671 | static int mmap_zero(struct file *file, struct vm_area_struct *vma) |
671 | { | 672 | { |
672 | #ifndef CONFIG_MMU | 673 | #ifndef CONFIG_MMU |
673 | return -ENOSYS; | 674 | return -ENOSYS; |
@@ -677,7 +678,7 @@ static int mmap_zero(struct file * file, struct vm_area_struct * vma) | |||
677 | return 0; | 678 | return 0; |
678 | } | 679 | } |
679 | 680 | ||
680 | static ssize_t write_full(struct file * file, const char __user * buf, | 681 | static ssize_t write_full(struct file *file, const char __user *buf, |
681 | size_t count, loff_t *ppos) | 682 | size_t count, loff_t *ppos) |
682 | { | 683 | { |
683 | return -ENOSPC; | 684 | return -ENOSPC; |
@@ -688,8 +689,7 @@ static ssize_t write_full(struct file * file, const char __user * buf, | |||
688 | * can fopen() both devices with "a" now. This was previously impossible. | 689 | * can fopen() both devices with "a" now. This was previously impossible. |
689 | * -- SRB. | 690 | * -- SRB. |
690 | */ | 691 | */ |
691 | 692 | static loff_t null_lseek(struct file *file, loff_t offset, int orig) | |
692 | static loff_t null_lseek(struct file * file, loff_t offset, int orig) | ||
693 | { | 693 | { |
694 | return file->f_pos = 0; | 694 | return file->f_pos = 0; |
695 | } | 695 | } |
@@ -702,31 +702,31 @@ static loff_t null_lseek(struct file * file, loff_t offset, int orig) | |||
702 | * also note that seeking relative to the "end of file" isn't supported: | 702 | * also note that seeking relative to the "end of file" isn't supported: |
703 | * it has no meaning, so it returns -EINVAL. | 703 | * it has no meaning, so it returns -EINVAL. |
704 | */ | 704 | */ |
705 | static loff_t memory_lseek(struct file * file, loff_t offset, int orig) | 705 | static loff_t memory_lseek(struct file *file, loff_t offset, int orig) |
706 | { | 706 | { |
707 | loff_t ret; | 707 | loff_t ret; |
708 | 708 | ||
709 | mutex_lock(&file->f_path.dentry->d_inode->i_mutex); | 709 | mutex_lock(&file->f_path.dentry->d_inode->i_mutex); |
710 | switch (orig) { | 710 | switch (orig) { |
711 | case SEEK_CUR: | 711 | case SEEK_CUR: |
712 | offset += file->f_pos; | 712 | offset += file->f_pos; |
713 | if ((unsigned long long)offset < | 713 | if ((unsigned long long)offset < |
714 | (unsigned long long)file->f_pos) { | 714 | (unsigned long long)file->f_pos) { |
715 | ret = -EOVERFLOW; | 715 | ret = -EOVERFLOW; |
716 | break; | 716 | break; |
717 | } | 717 | } |
718 | case SEEK_SET: | 718 | case SEEK_SET: |
719 | /* to avoid userland mistaking f_pos=-9 as -EBADF=-9 */ | 719 | /* to avoid userland mistaking f_pos=-9 as -EBADF=-9 */ |
720 | if ((unsigned long long)offset >= ~0xFFFULL) { | 720 | if ((unsigned long long)offset >= ~0xFFFULL) { |
721 | ret = -EOVERFLOW; | 721 | ret = -EOVERFLOW; |
722 | break; | ||
723 | } | ||
724 | file->f_pos = offset; | ||
725 | ret = file->f_pos; | ||
726 | force_successful_syscall_return(); | ||
727 | break; | 722 | break; |
728 | default: | 723 | } |
729 | ret = -EINVAL; | 724 | file->f_pos = offset; |
725 | ret = file->f_pos; | ||
726 | force_successful_syscall_return(); | ||
727 | break; | ||
728 | default: | ||
729 | ret = -EINVAL; | ||
730 | } | 730 | } |
731 | mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); | 731 | mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); |
732 | return ret; | 732 | return ret; |
@@ -810,7 +810,7 @@ static const struct file_operations oldmem_fops = { | |||
810 | }; | 810 | }; |
811 | #endif | 811 | #endif |
812 | 812 | ||
813 | static ssize_t kmsg_write(struct file * file, const char __user * buf, | 813 | static ssize_t kmsg_write(struct file *file, const char __user *buf, |
814 | size_t count, loff_t *ppos) | 814 | size_t count, loff_t *ppos) |
815 | { | 815 | { |
816 | char *tmp; | 816 | char *tmp; |
@@ -832,7 +832,7 @@ static ssize_t kmsg_write(struct file * file, const char __user * buf, | |||
832 | } | 832 | } |
833 | 833 | ||
834 | static const struct file_operations kmsg_fops = { | 834 | static const struct file_operations kmsg_fops = { |
835 | .write = kmsg_write, | 835 | .write = kmsg_write, |
836 | }; | 836 | }; |
837 | 837 | ||
838 | static const struct memdev { | 838 | static const struct memdev { |
@@ -883,7 +883,7 @@ static int memory_open(struct inode *inode, struct file *filp) | |||
883 | } | 883 | } |
884 | 884 | ||
885 | static const struct file_operations memory_fops = { | 885 | static const struct file_operations memory_fops = { |
886 | .open = memory_open, | 886 | .open = memory_open, |
887 | }; | 887 | }; |
888 | 888 | ||
889 | static char *mem_devnode(struct device *dev, mode_t *mode) | 889 | static char *mem_devnode(struct device *dev, mode_t *mode) |
@@ -904,7 +904,7 @@ static int __init chr_dev_init(void) | |||
904 | if (err) | 904 | if (err) |
905 | return err; | 905 | return err; |
906 | 906 | ||
907 | if (register_chrdev(MEM_MAJOR,"mem",&memory_fops)) | 907 | if (register_chrdev(MEM_MAJOR, "mem", &memory_fops)) |
908 | printk("unable to get major %d for memory devs\n", MEM_MAJOR); | 908 | printk("unable to get major %d for memory devs\n", MEM_MAJOR); |
909 | 909 | ||
910 | mem_class = class_create(THIS_MODULE, "mem"); | 910 | mem_class = class_create(THIS_MODULE, "mem"); |