|
|
@@ -208,9 +208,10 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
|
|
|
if (mapping_cap_account_dirty(mapping)) {
|
|
|
unsigned long addr;
|
|
|
struct file *file = get_file(vma->vm_file);
|
|
|
+ /* mmap_region may free vma; grab the info now */
|
|
|
+ vm_flags = vma->vm_flags;
|
|
|
|
|
|
- addr = mmap_region(file, start, size,
|
|
|
- vma->vm_flags, pgoff);
|
|
|
+ addr = mmap_region(file, start, size, vm_flags, pgoff);
|
|
|
fput(file);
|
|
|
if (IS_ERR_VALUE(addr)) {
|
|
|
err = addr;
|
|
|
@@ -218,7 +219,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
|
|
|
BUG_ON(addr != start);
|
|
|
err = 0;
|
|
|
}
|
|
|
- goto out;
|
|
|
+ goto out_freed;
|
|
|
}
|
|
|
mutex_lock(&mapping->i_mmap_mutex);
|
|
|
flush_dcache_mmap_lock(mapping);
|
|
|
@@ -253,6 +254,7 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
|
|
|
out:
|
|
|
if (vma)
|
|
|
vm_flags = vma->vm_flags;
|
|
|
+out_freed:
|
|
|
if (likely(!has_write_lock))
|
|
|
up_read(&mm->mmap_sem);
|
|
|
else
|