diff --git a/mm/mmap.c b/mm/mmap.c index 5c2c7651ca29..a0a4eadc8779 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1836,7 +1836,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr, if (!arch_validate_flags(vma->vm_flags)) { error = -EINVAL; if (file) - goto unmap_and_free_vma; + goto close_and_free_vma; else goto free_vma; } @@ -1876,6 +1876,9 @@ out: return addr; +close_and_free_vma: + if (vma->vm_ops && vma->vm_ops->close) + vma->vm_ops->close(vma); unmap_and_free_vma: fput(vma->vm_file); vma->vm_file = NULL;