From: Pekka Enberg As pointed out by Nick Piggin, __revoke_break_cow() only needs to do down_read() and we must use vma_pages() for get_user_pages(). Cc: Nick Piggin Signed-off-by: Pekka Enberg Signed-off-by: Andrew Morton --- fs/revoke.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff -puN fs/revoke.c~revoke-core-code-break-cow-fixes fs/revoke.c --- a/fs/revoke.c~revoke-core-code-break-cow-fixes +++ a/fs/revoke.c @@ -185,7 +185,7 @@ static int __revoke_break_cow(struct tas struct vm_area_struct *vma; int err = 0; - down_write(&mm->mmap_sem); + down_read(&mm->mmap_sem); for (vma = mm->mmap; vma != NULL; vma = vma->vm_next) { int ret; @@ -196,14 +196,13 @@ static int __revoke_break_cow(struct tas continue; ret = get_user_pages(tsk, tsk->mm, vma->vm_start, - vma->vm_end-vma->vm_start, 1, 1, NULL, - NULL); + vma_pages(vma), 1, 1, NULL, NULL); if (ret < 0) { err = ret; break; } } - up_write(&mm->mmap_sem); + up_read(&mm->mmap_sem); return err; } _