]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - mm/prfile.c
ipv4: convert dst_metrics.refcnt from atomic_t to refcount_t
[mirror_ubuntu-artful-kernel.git] / mm / prfile.c
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 */