]>
Commit | Line | Data |
---|---|---|
b6450630 SF |
1 | /* |
2 | * Mainly for aufs which mmap(2) different file and wants to print different | |
3 | * path in /proc/PID/maps. | |
4 | * Call these functions via macros defined in linux/mm.h. | |
5 | * | |
6 | * See Documentation/filesystems/aufs/design/06mmap.txt | |
7 | * | |
8 | * Copyright (c) 2014-2017 Junjro R. Okajima | |
9 | * Copyright (c) 2014 Ian Campbell | |
10 | */ | |
11 | ||
12 | #include <linux/mm.h> | |
13 | #include <linux/file.h> | |
14 | #include <linux/fs.h> | |
15 | ||
16 | /* #define PRFILE_TRACE */ | |
17 | static inline void prfile_trace(struct file *f, struct file *pr, | |
18 | const char func[], int line, const char func2[]) | |
19 | { | |
20 | #ifdef PRFILE_TRACE | |
21 | if (pr) | |
22 | pr_info("%s:%d: %s, %pD2\n", func, line, func2, f); | |
23 | #endif | |
24 | } | |
25 | ||
26 | void vma_do_file_update_time(struct vm_area_struct *vma, const char func[], | |
27 | int line) | |
28 | { | |
29 | struct file *f = vma->vm_file, *pr = vma->vm_prfile; | |
30 | ||
31 | prfile_trace(f, pr, func, line, __func__); | |
32 | file_update_time(f); | |
33 | if (f && pr) | |
34 | file_update_time(pr); | |
35 | } | |
36 | ||
37 | struct file *vma_do_pr_or_file(struct vm_area_struct *vma, const char func[], | |
38 | int line) | |
39 | { | |
40 | struct file *f = vma->vm_file, *pr = vma->vm_prfile; | |
41 | ||
42 | prfile_trace(f, pr, func, line, __func__); | |
43 | return (f && pr) ? pr : f; | |
44 | } | |
45 | ||
46 | void vma_do_get_file(struct vm_area_struct *vma, const char func[], int line) | |
47 | { | |
48 | struct file *f = vma->vm_file, *pr = vma->vm_prfile; | |
49 | ||
50 | prfile_trace(f, pr, func, line, __func__); | |
51 | get_file(f); | |
52 | if (f && pr) | |
53 | get_file(pr); | |
54 | } | |
55 | ||
56 | void vma_do_fput(struct vm_area_struct *vma, const char func[], int line) | |
57 | { | |
58 | struct file *f = vma->vm_file, *pr = vma->vm_prfile; | |
59 | ||
60 | prfile_trace(f, pr, func, line, __func__); | |
61 | fput(f); | |
62 | if (f && pr) | |
63 | fput(pr); | |
64 | } | |
65 | ||
66 | #ifndef CONFIG_MMU | |
67 | struct file *vmr_do_pr_or_file(struct vm_region *region, const char func[], | |
68 | int line) | |
69 | { | |
70 | struct file *f = region->vm_file, *pr = region->vm_prfile; | |
71 | ||
72 | prfile_trace(f, pr, func, line, __func__); | |
73 | return (f && pr) ? pr : f; | |
74 | } | |
75 | ||
76 | void vmr_do_fput(struct vm_region *region, const char func[], int line) | |
77 | { | |
78 | struct file *f = region->vm_file, *pr = region->vm_prfile; | |
79 | ||
80 | prfile_trace(f, pr, func, line, __func__); | |
81 | fput(f); | |
82 | if (f && pr) | |
83 | fput(pr); | |
84 | } | |
85 | #endif /* !CONFIG_MMU */ |