|
@@ -155,22 +155,14 @@ xip_file_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
|
|
|
EXPORT_SYMBOL_GPL(xip_file_read);
|
|
|
|
|
|
/*
|
|
|
- * __xip_unmap is invoked from xip_unmap and
|
|
|
- * xip_write
|
|
|
+ * __xip_unmap is invoked from xip_unmap and xip_write
|
|
|
*
|
|
|
* This function walks all vmas of the address_space and unmaps the
|
|
|
* __xip_sparse_page when found at pgoff.
|
|
|
*/
|
|
|
-static void
|
|
|
-__xip_unmap (struct address_space * mapping,
|
|
|
- unsigned long pgoff)
|
|
|
+static void __xip_unmap(struct address_space * mapping, unsigned long pgoff)
|
|
|
{
|
|
|
struct vm_area_struct *vma;
|
|
|
- struct mm_struct *mm;
|
|
|
- unsigned long address;
|
|
|
- pte_t *pte;
|
|
|
- pte_t pteval;
|
|
|
- spinlock_t *ptl;
|
|
|
struct page *page;
|
|
|
unsigned count;
|
|
|
int locked = 0;
|
|
@@ -182,11 +174,14 @@ __xip_unmap (struct address_space * mapping,
|
|
|
return;
|
|
|
|
|
|
retry:
|
|
|
- i_mmap_lock_write(mapping);
|
|
|
+ i_mmap_lock_read(mapping);
|
|
|
vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) {
|
|
|
- mm = vma->vm_mm;
|
|
|
- address = vma->vm_start +
|
|
|
+ pte_t *pte, pteval;
|
|
|
+ spinlock_t *ptl;
|
|
|
+ struct mm_struct *mm = vma->vm_mm;
|
|
|
+ unsigned long address = vma->vm_start +
|
|
|
((pgoff - vma->vm_pgoff) << PAGE_SHIFT);
|
|
|
+
|
|
|
BUG_ON(address < vma->vm_start || address >= vma->vm_end);
|
|
|
pte = page_check_address(page, mm, address, &ptl, 1);
|
|
|
if (pte) {
|
|
@@ -202,7 +197,7 @@ retry:
|
|
|
page_cache_release(page);
|
|
|
}
|
|
|
}
|
|
|
- i_mmap_unlock_write(mapping);
|
|
|
+ i_mmap_unlock_read(mapping);
|
|
|
|
|
|
if (locked) {
|
|
|
mutex_unlock(&xip_sparse_mutex);
|