void unlink_file_vma(struct vm_area_struct *vma) { struct file *file = vma->vm_file; if (file) { struct address_space *mapping = file->f_mapping; mutex_lock(&mapping->i_mmap_mutex); __remove_shared_vm_struct(vma, file, mapping); mutex_unlock(&mapping->i_mmap_mutex); } }
/* * Remove one vm structure and free it. */ static void remove_vm_struct(struct vm_area_struct *vma) { struct file *file = vma->vm_file; if (file) { struct address_space *mapping = file->f_mapping; spin_lock(&mapping->i_mmap_lock); __remove_shared_vm_struct(vma, file, mapping); spin_unlock(&mapping->i_mmap_lock); } if (vma->vm_ops && vma->vm_ops->close) vma->vm_ops->close(vma); if (file) fput(file); anon_vma_unlink(vma); mpol_free(vma_policy(vma)); kmem_cache_free(vm_area_cachep, vma); }