Commit 25f5906c authored by Hugh Dickins's avatar Hugh Dickins Committed by Linus Torvalds

[PATCH] vmtrunc: unmap_mapping_range_tree

Move unmap_mapping_range's nonlinear vma handling out to its own inline,
parallel to the prio_tree handling; unmap_mapping_range_list is a better name
for the nonlinear list, rename the other unmap_mapping_range_tree.
Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 84c496cf
...@@ -1354,9 +1354,9 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma, ...@@ -1354,9 +1354,9 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,
} }
/* /*
* Helper function for unmap_mapping_range(). * Helper functions for unmap_mapping_range().
*/ */
static inline void unmap_mapping_range_list(struct prio_tree_root *root, static inline void unmap_mapping_range_tree(struct prio_tree_root *root,
struct zap_details *details) struct zap_details *details)
{ {
struct vm_area_struct *vma; struct vm_area_struct *vma;
...@@ -1380,6 +1380,24 @@ static inline void unmap_mapping_range_list(struct prio_tree_root *root, ...@@ -1380,6 +1380,24 @@ static inline void unmap_mapping_range_list(struct prio_tree_root *root,
} }
} }
static inline void unmap_mapping_range_list(struct list_head *head,
struct zap_details *details)
{
struct vm_area_struct *vma;
/*
* In nonlinear VMAs there is no correspondence between virtual address
* offset and file offset. So we must perform an exhaustive search
* across *all* the pages in each nonlinear VMA, not just the pages
* whose virtual address lies outside the file truncation point.
*/
list_for_each_entry(vma, head, shared.vm_set.list) {
details->nonlinear_vma = vma;
zap_page_range(vma, vma->vm_start,
vma->vm_end - vma->vm_start, details);
}
}
/** /**
* unmap_mapping_range - unmap the portion of all mmaps * unmap_mapping_range - unmap the portion of all mmaps
* in the specified address_space corresponding to the specified * in the specified address_space corresponding to the specified
...@@ -1424,23 +1442,9 @@ void unmap_mapping_range(struct address_space *mapping, ...@@ -1424,23 +1442,9 @@ void unmap_mapping_range(struct address_space *mapping,
mapping->truncate_count++; mapping->truncate_count++;
if (unlikely(!prio_tree_empty(&mapping->i_mmap))) if (unlikely(!prio_tree_empty(&mapping->i_mmap)))
unmap_mapping_range_list(&mapping->i_mmap, &details); unmap_mapping_range_tree(&mapping->i_mmap, &details);
if (unlikely(!list_empty(&mapping->i_mmap_nonlinear)))
/* unmap_mapping_range_list(&mapping->i_mmap_nonlinear, &details);
* In nonlinear VMAs there is no correspondence between virtual address
* offset and file offset. So we must perform an exhaustive search
* across *all* the pages in each nonlinear VMA, not just the pages
* whose virtual address lies outside the file truncation point.
*/
if (unlikely(!list_empty(&mapping->i_mmap_nonlinear))) {
struct vm_area_struct *vma;
list_for_each_entry(vma, &mapping->i_mmap_nonlinear,
shared.vm_set.list) {
details.nonlinear_vma = vma;
zap_page_range(vma, vma->vm_start,
vma->vm_end - vma->vm_start, &details);
}
}
spin_unlock(&mapping->i_mmap_lock); spin_unlock(&mapping->i_mmap_lock);
} }
EXPORT_SYMBOL(unmap_mapping_range); EXPORT_SYMBOL(unmap_mapping_range);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment