rev |
line source |
pascal@24141
|
1 aufs3.16 mmap patch
|
pascal@24141
|
2
|
pascal@24141
|
3 diff --git a/fs/buffer.c b/fs/buffer.c
|
pascal@24141
|
4 index eba6e4f..31f0b2d 100644
|
pascal@24141
|
5 --- a/fs/buffer.c
|
pascal@24141
|
6 +++ b/fs/buffer.c
|
pascal@24141
|
7 @@ -2460,7 +2460,7 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
|
pascal@24141
|
8 * Update file times before taking page lock. We may end up failing the
|
pascal@24141
|
9 * fault so this update may be superfluous but who really cares...
|
pascal@24141
|
10 */
|
pascal@24141
|
11 - file_update_time(vma->vm_file);
|
pascal@24141
|
12 + vma_file_update_time(vma);
|
pascal@24141
|
13
|
pascal@24141
|
14 ret = __block_page_mkwrite(vma, vmf, get_block);
|
pascal@24141
|
15 sb_end_pagefault(sb);
|
pascal@24141
|
16 diff --git a/fs/proc/base.c b/fs/proc/base.c
|
pascal@24141
|
17 index 2d696b0..fb92686 100644
|
pascal@24141
|
18 --- a/fs/proc/base.c
|
pascal@24141
|
19 +++ b/fs/proc/base.c
|
pascal@24141
|
20 @@ -1799,7 +1799,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path)
|
pascal@24141
|
21 down_read(&mm->mmap_sem);
|
pascal@24141
|
22 vma = find_exact_vma(mm, vm_start, vm_end);
|
pascal@24141
|
23 if (vma && vma->vm_file) {
|
pascal@24141
|
24 - *path = vma->vm_file->f_path;
|
pascal@24141
|
25 + *path = vma_pr_or_file(vma)->f_path;
|
pascal@24141
|
26 path_get(path);
|
pascal@24141
|
27 rc = 0;
|
pascal@24141
|
28 }
|
pascal@24141
|
29 diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c
|
pascal@24141
|
30 index d4a3574..1397181 100644
|
pascal@24141
|
31 --- a/fs/proc/nommu.c
|
pascal@24141
|
32 +++ b/fs/proc/nommu.c
|
pascal@24141
|
33 @@ -45,7 +45,10 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region)
|
pascal@24141
|
34 file = region->vm_file;
|
pascal@24141
|
35
|
pascal@24141
|
36 if (file) {
|
pascal@24141
|
37 - struct inode *inode = file_inode(region->vm_file);
|
pascal@24141
|
38 + struct inode *inode;
|
pascal@24141
|
39 +
|
pascal@24141
|
40 + file = vmr_pr_or_file(region);
|
pascal@24141
|
41 + inode = file_inode(file);
|
pascal@24141
|
42 dev = inode->i_sb->s_dev;
|
pascal@24141
|
43 ino = inode->i_ino;
|
pascal@24141
|
44 }
|
pascal@24141
|
45 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
|
pascal@24141
|
46 index cfa63ee..bf4919e 100644
|
pascal@24141
|
47 --- a/fs/proc/task_mmu.c
|
pascal@24141
|
48 +++ b/fs/proc/task_mmu.c
|
pascal@24141
|
49 @@ -265,7 +265,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
|
pascal@24141
|
50 const char *name = NULL;
|
pascal@24141
|
51
|
pascal@24141
|
52 if (file) {
|
pascal@24141
|
53 - struct inode *inode = file_inode(vma->vm_file);
|
pascal@24141
|
54 + struct inode *inode;
|
pascal@24141
|
55 +
|
pascal@24141
|
56 + file = vma_pr_or_file(vma);
|
pascal@24141
|
57 + inode = file_inode(file);
|
pascal@24141
|
58 dev = inode->i_sb->s_dev;
|
pascal@24141
|
59 ino = inode->i_ino;
|
pascal@24141
|
60 pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
|
pascal@24141
|
61 @@ -1390,7 +1393,7 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
|
pascal@24141
|
62 struct proc_maps_private *proc_priv = &numa_priv->proc_maps;
|
pascal@24141
|
63 struct vm_area_struct *vma = v;
|
pascal@24141
|
64 struct numa_maps *md = &numa_priv->md;
|
pascal@24141
|
65 - struct file *file = vma->vm_file;
|
pascal@24141
|
66 + struct file *file = vma_pr_or_file(vma);
|
pascal@24141
|
67 struct task_struct *task = proc_priv->task;
|
pascal@24141
|
68 struct mm_struct *mm = vma->vm_mm;
|
pascal@24141
|
69 struct mm_walk walk = {};
|
pascal@24141
|
70 diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
|
pascal@24141
|
71 index 678455d..ebd34ba 100644
|
pascal@24141
|
72 --- a/fs/proc/task_nommu.c
|
pascal@24141
|
73 +++ b/fs/proc/task_nommu.c
|
pascal@24141
|
74 @@ -141,7 +141,10 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma,
|
pascal@24141
|
75 file = vma->vm_file;
|
pascal@24141
|
76
|
pascal@24141
|
77 if (file) {
|
pascal@24141
|
78 - struct inode *inode = file_inode(vma->vm_file);
|
pascal@24141
|
79 + struct inode *inode;
|
pascal@24141
|
80 +
|
pascal@24141
|
81 + file = vma_pr_or_file(vma);
|
pascal@24141
|
82 + inode = file_inode(file);
|
pascal@24141
|
83 dev = inode->i_sb->s_dev;
|
pascal@24141
|
84 ino = inode->i_ino;
|
pascal@24141
|
85 pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT;
|
pascal@24141
|
86 diff --git a/include/linux/mm.h b/include/linux/mm.h
|
pascal@24141
|
87 index e03dd29..b576690 100644
|
pascal@24141
|
88 --- a/include/linux/mm.h
|
pascal@24141
|
89 +++ b/include/linux/mm.h
|
pascal@24141
|
90 @@ -1184,6 +1184,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
|
pascal@24141
|
91 }
|
pascal@24141
|
92 #endif
|
pascal@24141
|
93
|
pascal@24141
|
94 +extern void vma_do_file_update_time(struct vm_area_struct *, const char[], int);
|
pascal@24141
|
95 +extern struct file *vma_do_pr_or_file(struct vm_area_struct *, const char[],
|
pascal@24141
|
96 + int);
|
pascal@24141
|
97 +extern void vma_do_get_file(struct vm_area_struct *, const char[], int);
|
pascal@24141
|
98 +extern void vma_do_fput(struct vm_area_struct *, const char[], int);
|
pascal@24141
|
99 +
|
pascal@24141
|
100 +#define vma_file_update_time(vma) vma_do_file_update_time(vma, __func__, \
|
pascal@24141
|
101 + __LINE__)
|
pascal@24141
|
102 +#define vma_pr_or_file(vma) vma_do_pr_or_file(vma, __func__, \
|
pascal@24141
|
103 + __LINE__)
|
pascal@24141
|
104 +#define vma_get_file(vma) vma_do_get_file(vma, __func__, __LINE__)
|
pascal@24141
|
105 +#define vma_fput(vma) vma_do_fput(vma, __func__, __LINE__)
|
pascal@24141
|
106 +
|
pascal@24141
|
107 +#ifndef CONFIG_MMU
|
pascal@24141
|
108 +extern struct file *vmr_do_pr_or_file(struct vm_region *, const char[], int);
|
pascal@24141
|
109 +extern void vmr_do_fput(struct vm_region *, const char[], int);
|
pascal@24141
|
110 +
|
pascal@24141
|
111 +#define vmr_pr_or_file(region) vmr_do_pr_or_file(region, __func__, \
|
pascal@24141
|
112 + __LINE__)
|
pascal@24141
|
113 +#define vmr_fput(region) vmr_do_fput(region, __func__, __LINE__)
|
pascal@24141
|
114 +#endif /* !CONFIG_MMU */
|
pascal@24141
|
115 +
|
pascal@24141
|
116 extern int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write);
|
pascal@24141
|
117 extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
|
pascal@24141
|
118 void *buf, int len, int write);
|
pascal@24141
|
119 diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
|
pascal@24141
|
120 index 96c5750..a087ecd 100644
|
pascal@24141
|
121 --- a/include/linux/mm_types.h
|
pascal@24141
|
122 +++ b/include/linux/mm_types.h
|
pascal@24141
|
123 @@ -232,6 +232,7 @@ struct vm_region {
|
pascal@24141
|
124 unsigned long vm_top; /* region allocated to here */
|
pascal@24141
|
125 unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */
|
pascal@24141
|
126 struct file *vm_file; /* the backing file or NULL */
|
pascal@24141
|
127 + struct file *vm_prfile; /* the virtual backing file or NULL */
|
pascal@24141
|
128
|
pascal@24141
|
129 int vm_usage; /* region usage count (access under nommu_region_sem) */
|
pascal@24141
|
130 bool vm_icache_flushed : 1; /* true if the icache has been flushed for
|
pascal@24141
|
131 @@ -300,6 +301,7 @@ struct vm_area_struct {
|
pascal@24141
|
132 unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE
|
pascal@24141
|
133 units, *not* PAGE_CACHE_SIZE */
|
pascal@24141
|
134 struct file * vm_file; /* File we map to (can be NULL). */
|
pascal@24141
|
135 + struct file *vm_prfile; /* shadow of vm_file */
|
pascal@24141
|
136 void * vm_private_data; /* was vm_pte (shared mem) */
|
pascal@24141
|
137
|
pascal@24141
|
138 #ifndef CONFIG_MMU
|
pascal@24141
|
139 diff --git a/kernel/fork.c b/kernel/fork.c
|
pascal@24141
|
140 index 6a13c46..714302c 100644
|
pascal@24141
|
141 --- a/kernel/fork.c
|
pascal@24141
|
142 +++ b/kernel/fork.c
|
pascal@24141
|
143 @@ -416,7 +416,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
pascal@24141
|
144 struct inode *inode = file_inode(file);
|
pascal@24141
|
145 struct address_space *mapping = file->f_mapping;
|
pascal@24141
|
146
|
pascal@24141
|
147 - get_file(file);
|
pascal@24141
|
148 + vma_get_file(tmp);
|
pascal@24141
|
149 if (tmp->vm_flags & VM_DENYWRITE)
|
pascal@24141
|
150 atomic_dec(&inode->i_writecount);
|
pascal@24141
|
151 mutex_lock(&mapping->i_mmap_mutex);
|
pascal@24141
|
152 diff --git a/mm/Makefile b/mm/Makefile
|
pascal@24141
|
153 index 4064f3e..0003fdf 100644
|
pascal@24141
|
154 --- a/mm/Makefile
|
pascal@24141
|
155 +++ b/mm/Makefile
|
pascal@24141
|
156 @@ -18,7 +18,7 @@ obj-y := filemap.o mempool.o oom_kill.o fadvise.o \
|
pascal@24141
|
157 mm_init.o mmu_context.o percpu.o slab_common.o \
|
pascal@24141
|
158 compaction.o balloon_compaction.o vmacache.o \
|
pascal@24141
|
159 interval_tree.o list_lru.o workingset.o \
|
pascal@24141
|
160 - iov_iter.o $(mmu-y)
|
pascal@24141
|
161 + iov_iter.o prfile.o $(mmu-y)
|
pascal@24141
|
162
|
pascal@24141
|
163 obj-y += init-mm.o
|
pascal@24141
|
164
|
pascal@24141
|
165 diff --git a/mm/filemap.c b/mm/filemap.c
|
pascal@24141
|
166 index 900edfa..f4dda0c 100644
|
pascal@24141
|
167 --- a/mm/filemap.c
|
pascal@24141
|
168 +++ b/mm/filemap.c
|
pascal@24141
|
169 @@ -2040,7 +2040,7 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
pascal@24141
|
170 int ret = VM_FAULT_LOCKED;
|
pascal@24141
|
171
|
pascal@24141
|
172 sb_start_pagefault(inode->i_sb);
|
pascal@24141
|
173 - file_update_time(vma->vm_file);
|
pascal@24141
|
174 + vma_file_update_time(vma);
|
pascal@24141
|
175 lock_page(page);
|
pascal@24141
|
176 if (page->mapping != inode->i_mapping) {
|
pascal@24141
|
177 unlock_page(page);
|
pascal@24141
|
178 diff --git a/mm/fremap.c b/mm/fremap.c
|
pascal@24141
|
179 index 72b8fa3..a00bbf0 100644
|
pascal@24141
|
180 --- a/mm/fremap.c
|
pascal@24141
|
181 +++ b/mm/fremap.c
|
pascal@24141
|
182 @@ -224,16 +224,28 @@ get_write_lock:
|
pascal@24141
|
183 */
|
pascal@24141
|
184 if (mapping_cap_account_dirty(mapping)) {
|
pascal@24141
|
185 unsigned long addr;
|
pascal@24141
|
186 - struct file *file = get_file(vma->vm_file);
|
pascal@24141
|
187 + struct file *file = vma->vm_file,
|
pascal@24141
|
188 + *prfile = vma->vm_prfile;
|
pascal@24141
|
189 +
|
pascal@24141
|
190 /* mmap_region may free vma; grab the info now */
|
pascal@24141
|
191 vm_flags = vma->vm_flags;
|
pascal@24141
|
192
|
pascal@24141
|
193 + vma_get_file(vma);
|
pascal@24141
|
194 addr = mmap_region(file, start, size, vm_flags, pgoff);
|
pascal@24141
|
195 - fput(file);
|
pascal@24141
|
196 + vma_fput(vma);
|
pascal@24141
|
197 if (IS_ERR_VALUE(addr)) {
|
pascal@24141
|
198 err = addr;
|
pascal@24141
|
199 } else {
|
pascal@24141
|
200 BUG_ON(addr != start);
|
pascal@24141
|
201 + if (prfile) {
|
pascal@24141
|
202 + struct vm_area_struct *new_vma;
|
pascal@24141
|
203 +
|
pascal@24141
|
204 + new_vma = find_vma(mm, addr);
|
pascal@24141
|
205 + if (!new_vma->vm_prfile)
|
pascal@24141
|
206 + new_vma->vm_prfile = prfile;
|
pascal@24141
|
207 + if (new_vma != vma)
|
pascal@24141
|
208 + get_file(prfile);
|
pascal@24141
|
209 + }
|
pascal@24141
|
210 err = 0;
|
pascal@24141
|
211 }
|
pascal@24141
|
212 goto out_freed;
|
pascal@24141
|
213 diff --git a/mm/memory.c b/mm/memory.c
|
pascal@24141
|
214 index 8b44f76..69a72bf 100644
|
pascal@24141
|
215 --- a/mm/memory.c
|
pascal@24141
|
216 +++ b/mm/memory.c
|
pascal@24141
|
217 @@ -2161,7 +2161,7 @@ reuse:
|
pascal@24141
|
218 set_page_dirty_balance(dirty_page);
|
pascal@24141
|
219 /* file_update_time outside page_lock */
|
pascal@24141
|
220 if (vma->vm_file)
|
pascal@24141
|
221 - file_update_time(vma->vm_file);
|
pascal@24141
|
222 + vma_file_update_time(vma);
|
pascal@24141
|
223 }
|
pascal@24141
|
224 put_page(dirty_page);
|
pascal@24141
|
225 if (page_mkwrite) {
|
pascal@24141
|
226 diff --git a/mm/mmap.c b/mm/mmap.c
|
pascal@24141
|
227 index 129b847..869d1d7 100644
|
pascal@24141
|
228 --- a/mm/mmap.c
|
pascal@24141
|
229 +++ b/mm/mmap.c
|
pascal@24141
|
230 @@ -253,7 +253,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
|
pascal@24141
|
231 if (vma->vm_ops && vma->vm_ops->close)
|
pascal@24141
|
232 vma->vm_ops->close(vma);
|
pascal@24141
|
233 if (vma->vm_file)
|
pascal@24141
|
234 - fput(vma->vm_file);
|
pascal@24141
|
235 + vma_fput(vma);
|
pascal@24141
|
236 mpol_put(vma_policy(vma));
|
pascal@24141
|
237 kmem_cache_free(vm_area_cachep, vma);
|
pascal@24141
|
238 return next;
|
pascal@24141
|
239 @@ -863,7 +863,7 @@ again: remove_next = 1 + (end > next->vm_end);
|
pascal@24141
|
240 if (remove_next) {
|
pascal@24141
|
241 if (file) {
|
pascal@24141
|
242 uprobe_munmap(next, next->vm_start, next->vm_end);
|
pascal@24141
|
243 - fput(file);
|
pascal@24141
|
244 + vma_fput(vma);
|
pascal@24141
|
245 }
|
pascal@24141
|
246 if (next->anon_vma)
|
pascal@24141
|
247 anon_vma_merge(vma, next);
|
pascal@24141
|
248 @@ -1643,8 +1643,8 @@ out:
|
pascal@24141
|
249 unmap_and_free_vma:
|
pascal@24141
|
250 if (vm_flags & VM_DENYWRITE)
|
pascal@24141
|
251 allow_write_access(file);
|
pascal@24141
|
252 + vma_fput(vma);
|
pascal@24141
|
253 vma->vm_file = NULL;
|
pascal@24141
|
254 - fput(file);
|
pascal@24141
|
255
|
pascal@24141
|
256 /* Undo any partial mapping done by a device driver. */
|
pascal@24141
|
257 unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end);
|
pascal@24141
|
258 @@ -2434,7 +2434,7 @@ static int __split_vma(struct mm_struct * mm, struct vm_area_struct * vma,
|
pascal@24141
|
259 goto out_free_mpol;
|
pascal@24141
|
260
|
pascal@24141
|
261 if (new->vm_file)
|
pascal@24141
|
262 - get_file(new->vm_file);
|
pascal@24141
|
263 + vma_get_file(new);
|
pascal@24141
|
264
|
pascal@24141
|
265 if (new->vm_ops && new->vm_ops->open)
|
pascal@24141
|
266 new->vm_ops->open(new);
|
pascal@24141
|
267 @@ -2453,7 +2453,7 @@ static int __split_vma(struct mm_struct * mm, struct vm_area_struct * vma,
|
pascal@24141
|
268 if (new->vm_ops && new->vm_ops->close)
|
pascal@24141
|
269 new->vm_ops->close(new);
|
pascal@24141
|
270 if (new->vm_file)
|
pascal@24141
|
271 - fput(new->vm_file);
|
pascal@24141
|
272 + vma_fput(new);
|
pascal@24141
|
273 unlink_anon_vmas(new);
|
pascal@24141
|
274 out_free_mpol:
|
pascal@24141
|
275 mpol_put(vma_policy(new));
|
pascal@24141
|
276 @@ -2842,7 +2842,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
|
pascal@24141
|
277 if (anon_vma_clone(new_vma, vma))
|
pascal@24141
|
278 goto out_free_mempol;
|
pascal@24141
|
279 if (new_vma->vm_file)
|
pascal@24141
|
280 - get_file(new_vma->vm_file);
|
pascal@24141
|
281 + vma_get_file(new_vma);
|
pascal@24141
|
282 if (new_vma->vm_ops && new_vma->vm_ops->open)
|
pascal@24141
|
283 new_vma->vm_ops->open(new_vma);
|
pascal@24141
|
284 vma_link(mm, new_vma, prev, rb_link, rb_parent);
|
pascal@24141
|
285 diff --git a/mm/nommu.c b/mm/nommu.c
|
pascal@24141
|
286 index 4a852f6..b369644 100644
|
pascal@24141
|
287 --- a/mm/nommu.c
|
pascal@24141
|
288 +++ b/mm/nommu.c
|
pascal@24141
|
289 @@ -658,7 +658,7 @@ static void __put_nommu_region(struct vm_region *region)
|
pascal@24141
|
290 up_write(&nommu_region_sem);
|
pascal@24141
|
291
|
pascal@24141
|
292 if (region->vm_file)
|
pascal@24141
|
293 - fput(region->vm_file);
|
pascal@24141
|
294 + vmr_fput(region);
|
pascal@24141
|
295
|
pascal@24141
|
296 /* IO memory and memory shared directly out of the pagecache
|
pascal@24141
|
297 * from ramfs/tmpfs mustn't be released here */
|
pascal@24141
|
298 @@ -823,7 +823,7 @@ static void delete_vma(struct mm_struct *mm, struct vm_area_struct *vma)
|
pascal@24141
|
299 if (vma->vm_ops && vma->vm_ops->close)
|
pascal@24141
|
300 vma->vm_ops->close(vma);
|
pascal@24141
|
301 if (vma->vm_file)
|
pascal@24141
|
302 - fput(vma->vm_file);
|
pascal@24141
|
303 + vma_fput(vma);
|
pascal@24141
|
304 put_nommu_region(vma->vm_region);
|
pascal@24141
|
305 kmem_cache_free(vm_area_cachep, vma);
|
pascal@24141
|
306 }
|
pascal@24141
|
307 @@ -1385,7 +1385,7 @@ unsigned long do_mmap_pgoff(struct file *file,
|
pascal@24141
|
308 goto error_just_free;
|
pascal@24141
|
309 }
|
pascal@24141
|
310 }
|
pascal@24141
|
311 - fput(region->vm_file);
|
pascal@24141
|
312 + vmr_fput(region);
|
pascal@24141
|
313 kmem_cache_free(vm_region_jar, region);
|
pascal@24141
|
314 region = pregion;
|
pascal@24141
|
315 result = start;
|
pascal@24141
|
316 @@ -1461,10 +1461,10 @@ error_just_free:
|
pascal@24141
|
317 up_write(&nommu_region_sem);
|
pascal@24141
|
318 error:
|
pascal@24141
|
319 if (region->vm_file)
|
pascal@24141
|
320 - fput(region->vm_file);
|
pascal@24141
|
321 + vmr_fput(region);
|
pascal@24141
|
322 kmem_cache_free(vm_region_jar, region);
|
pascal@24141
|
323 if (vma->vm_file)
|
pascal@24141
|
324 - fput(vma->vm_file);
|
pascal@24141
|
325 + vma_fput(vma);
|
pascal@24141
|
326 kmem_cache_free(vm_area_cachep, vma);
|
pascal@24141
|
327 kleave(" = %d", ret);
|
pascal@24141
|
328 return ret;
|
pascal@24141
|
329 diff --git a/mm/prfile.c b/mm/prfile.c
|
pascal@24141
|
330 new file mode 100644
|
pascal@24141
|
331 index 0000000..532e518
|
pascal@24141
|
332 --- /dev/null
|
pascal@24141
|
333 +++ b/mm/prfile.c
|
pascal@24141
|
334 @@ -0,0 +1,86 @@
|
pascal@24141
|
335 +/*
|
pascal@24141
|
336 + * Mainly for aufs which mmap(2) diffrent file and wants to print different path
|
pascal@24141
|
337 + * in /proc/PID/maps.
|
pascal@24141
|
338 + * Call these functions via macros defined in linux/mm.h.
|
pascal@24141
|
339 + *
|
pascal@24141
|
340 + * See Documentation/filesystems/aufs/design/06mmap.txt
|
pascal@24141
|
341 + *
|
pascal@24141
|
342 + * Copyright (c) 2014 Junjro R. Okajima
|
pascal@24141
|
343 + * Copyright (c) 2014 Ian Campbell
|
pascal@24141
|
344 + */
|
pascal@24141
|
345 +
|
pascal@24141
|
346 +#include <linux/mm.h>
|
pascal@24141
|
347 +#include <linux/file.h>
|
pascal@24141
|
348 +#include <linux/fs.h>
|
pascal@24141
|
349 +
|
pascal@24141
|
350 +/* #define PRFILE_TRACE */
|
pascal@24141
|
351 +static inline void prfile_trace(struct file *f, struct file *pr,
|
pascal@24141
|
352 + const char func[], int line, const char func2[])
|
pascal@24141
|
353 +{
|
pascal@24141
|
354 +#ifdef PRFILE_TRACE
|
pascal@24141
|
355 + if (pr)
|
pascal@24141
|
356 + pr_info("%s:%d: %s, %s\n", func, line, func2,
|
pascal@24141
|
357 + f ? (char *)f->f_dentry->d_name.name : "(null)");
|
pascal@24141
|
358 +#endif
|
pascal@24141
|
359 +}
|
pascal@24141
|
360 +
|
pascal@24141
|
361 +void vma_do_file_update_time(struct vm_area_struct *vma, const char func[],
|
pascal@24141
|
362 + int line)
|
pascal@24141
|
363 +{
|
pascal@24141
|
364 + struct file *f = vma->vm_file, *pr = vma->vm_prfile;
|
pascal@24141
|
365 +
|
pascal@24141
|
366 + prfile_trace(f, pr, func, line, __func__);
|
pascal@24141
|
367 + file_update_time(f);
|
pascal@24141
|
368 + if (f && pr)
|
pascal@24141
|
369 + file_update_time(pr);
|
pascal@24141
|
370 +}
|
pascal@24141
|
371 +
|
pascal@24141
|
372 +struct file *vma_do_pr_or_file(struct vm_area_struct *vma, const char func[],
|
pascal@24141
|
373 + int line)
|
pascal@24141
|
374 +{
|
pascal@24141
|
375 + struct file *f = vma->vm_file, *pr = vma->vm_prfile;
|
pascal@24141
|
376 +
|
pascal@24141
|
377 + prfile_trace(f, pr, func, line, __func__);
|
pascal@24141
|
378 + return (f && pr) ? pr : f;
|
pascal@24141
|
379 +}
|
pascal@24141
|
380 +
|
pascal@24141
|
381 +void vma_do_get_file(struct vm_area_struct *vma, const char func[], int line)
|
pascal@24141
|
382 +{
|
pascal@24141
|
383 + struct file *f = vma->vm_file, *pr = vma->vm_prfile;
|
pascal@24141
|
384 +
|
pascal@24141
|
385 + prfile_trace(f, pr, func, line, __func__);
|
pascal@24141
|
386 + get_file(f);
|
pascal@24141
|
387 + if (f && pr)
|
pascal@24141
|
388 + get_file(pr);
|
pascal@24141
|
389 +}
|
pascal@24141
|
390 +
|
pascal@24141
|
391 +void vma_do_fput(struct vm_area_struct *vma, const char func[], int line)
|
pascal@24141
|
392 +{
|
pascal@24141
|
393 + struct file *f = vma->vm_file, *pr = vma->vm_prfile;
|
pascal@24141
|
394 +
|
pascal@24141
|
395 + prfile_trace(f, pr, func, line, __func__);
|
pascal@24141
|
396 + fput(f);
|
pascal@24141
|
397 + if (f && pr)
|
pascal@24141
|
398 + fput(pr);
|
pascal@24141
|
399 +}
|
pascal@24141
|
400 +
|
pascal@24141
|
401 +#ifndef CONFIG_MMU
|
pascal@24141
|
402 +struct file *vmr_do_pr_or_file(struct vm_region *region, const char func[],
|
pascal@24141
|
403 + int line)
|
pascal@24141
|
404 +{
|
pascal@24141
|
405 + struct file *f = region->vm_file, *pr = region->vm_prfile;
|
pascal@24141
|
406 +
|
pascal@24141
|
407 + prfile_trace(f, pr, func, line, __func__);
|
pascal@24141
|
408 + return (f && pr) ? pr : f;
|
pascal@24141
|
409 +}
|
pascal@24141
|
410 +
|
pascal@24141
|
411 +void vmr_do_fput(struct vm_region *region, const char func[], int line)
|
pascal@24141
|
412 +{
|
pascal@24141
|
413 + struct file *f = region->vm_file, *pr = region->vm_prfile;
|
pascal@24141
|
414 +
|
pascal@24141
|
415 + prfile_trace(f, pr, func, line, __func__);
|
pascal@24141
|
416 + fput(f);
|
pascal@24141
|
417 + if (f && pr)
|
pascal@24141
|
418 + fput(pr);
|
pascal@24141
|
419 +}
|
pascal@24141
|
420 +#endif /* !CONFIG_MMU */
|