|
@@ -315,17 +315,20 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
|
file = tmp->vm_file;
|
|
file = tmp->vm_file;
|
|
if (file) {
|
|
if (file) {
|
|
struct inode *inode = file->f_path.dentry->d_inode;
|
|
struct inode *inode = file->f_path.dentry->d_inode;
|
|
|
|
+ struct address_space *mapping = file->f_mapping;
|
|
|
|
+
|
|
get_file(file);
|
|
get_file(file);
|
|
if (tmp->vm_flags & VM_DENYWRITE)
|
|
if (tmp->vm_flags & VM_DENYWRITE)
|
|
atomic_dec(&inode->i_writecount);
|
|
atomic_dec(&inode->i_writecount);
|
|
-
|
|
|
|
- /* insert tmp into the share list, just after mpnt */
|
|
|
|
- spin_lock(&file->f_mapping->i_mmap_lock);
|
|
|
|
|
|
+ spin_lock(&mapping->i_mmap_lock);
|
|
|
|
+ if (tmp->vm_flags & VM_SHARED)
|
|
|
|
+ mapping->i_mmap_writable++;
|
|
tmp->vm_truncate_count = mpnt->vm_truncate_count;
|
|
tmp->vm_truncate_count = mpnt->vm_truncate_count;
|
|
- flush_dcache_mmap_lock(file->f_mapping);
|
|
|
|
|
|
+ flush_dcache_mmap_lock(mapping);
|
|
|
|
+ /* insert tmp into the share list, just after mpnt */
|
|
vma_prio_tree_add(tmp, mpnt);
|
|
vma_prio_tree_add(tmp, mpnt);
|
|
- flush_dcache_mmap_unlock(file->f_mapping);
|
|
|
|
- spin_unlock(&file->f_mapping->i_mmap_lock);
|
|
|
|
|
|
+ flush_dcache_mmap_unlock(mapping);
|
|
|
|
+ spin_unlock(&mapping->i_mmap_lock);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|