diff options
Diffstat (limited to 'mm/msync.c')
| -rw-r--r-- | mm/msync.c | 8 | 
1 files changed, 7 insertions, 1 deletions
| diff --git a/mm/msync.c b/mm/msync.c index 632df4527c01..a5c673669ca6 100644 --- a/mm/msync.c +++ b/mm/msync.c @@ -58,6 +58,7 @@ SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)  	vma = find_vma(mm, start);  	for (;;) {  		struct file *file; +		loff_t fstart, fend;  		/* Still start < end. */  		error = -ENOMEM; @@ -77,12 +78,17 @@ SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)  			goto out_unlock;  		}  		file = vma->vm_file; +		fstart = start + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); +		fend = fstart + (min(end, vma->vm_end) - start) - 1;  		start = vma->vm_end;  		if ((flags & MS_SYNC) && file &&  				(vma->vm_flags & VM_SHARED)) {  			get_file(file);  			up_read(&mm->mmap_sem); -			error = vfs_fsync(file, 0); +			if (vma->vm_flags & VM_NONLINEAR) +				error = vfs_fsync(file, 1); +			else +				error = vfs_fsync_range(file, fstart, fend, 1);  			fput(file);  			if (error || start >= end)  				goto out; | 
