This source file includes following definitions.
- msdos_file_mmap_nopage
- msdos_mmap
1
2
3
4
5
6
7
8
9 #include <linux/stat.h>
10 #include <linux/sched.h>
11 #include <linux/kernel.h>
12 #include <linux/mm.h>
13 #include <linux/shm.h>
14 #include <linux/errno.h>
15 #include <linux/mman.h>
16 #include <linux/string.h>
17 #include <linux/malloc.h>
18 #include <asm/segment.h>
19 #include <asm/system.h>
20 #include <linux/msdos_fs.h>
21
22
23
24
25 static unsigned long msdos_file_mmap_nopage(
26 struct vm_area_struct * area,
27 unsigned long address,
28 unsigned long page,
29 int error_code)
30 {
31 struct inode * inode = area->vm_inode;
32 unsigned int clear;
33 int pos;
34 long gap;
35
36 address &= PAGE_MASK;
37 pos = address - area->vm_start + area->vm_offset;
38
39 clear = 0;
40 gap = inode->i_size - pos;
41 if (gap <= 0){
42
43 clear = PAGE_SIZE;
44 }else{
45 int cur_read;
46 int need_read;
47 struct file filp;
48 if (gap < PAGE_SIZE){
49 clear = PAGE_SIZE - gap;
50 }
51 filp.f_reada = 0;
52 filp.f_pos = pos;
53 need_read = PAGE_SIZE - clear;
54 {
55 unsigned long cur_fs = get_fs();
56 set_fs (KERNEL_DS);
57 cur_read = msdos_file_read (inode,&filp,(char*)page
58 ,need_read);
59 set_fs (cur_fs);
60 }
61 if (cur_read != need_read){
62 printk ("MSDOS: Error while reading an mmap file %d <> %d\n"
63 ,cur_read,need_read);
64 }
65 }
66 if (clear > 0){
67 memset ((char*)page+PAGE_SIZE-clear,0,clear);
68 }
69 return page;
70 }
71
72 struct vm_operations_struct msdos_file_mmap = {
73 NULL,
74 NULL,
75 NULL,
76 NULL,
77 NULL,
78 NULL,
79 msdos_file_mmap_nopage,
80 NULL,
81 NULL,
82 NULL,
83 };
84
85
86
87
88
89 int msdos_mmap(struct inode * inode, struct file * file, struct vm_area_struct * vma)
90 {
91 if (vma->vm_page_prot & PAGE_RW)
92 return -EINVAL;
93 if (vma->vm_offset & (inode->i_sb->s_blocksize - 1))
94 return -EINVAL;
95 if (!inode->i_sb || !S_ISREG(inode->i_mode))
96 return -EACCES;
97 if (!IS_RDONLY(inode)) {
98 inode->i_atime = CURRENT_TIME;
99 inode->i_dirt = 1;
100 }
101
102 vma->vm_inode = inode;
103 inode->i_count++;
104 vma->vm_ops = &msdos_file_mmap;
105 return 0;
106 }
107