wok annotate linux/stuff/aufs3-mmap.patch @ rev 25135

updated phpfm (0.9.8 -> 1.7.9)
author Hans-G?nter Theisgen
date Wed Jun 29 10:56:29 2022 +0100 (23 months ago)
parents
children
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 */