aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAndrea Arcangeli <aarcange@redhat.com>2015-02-11 18:27:26 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-02-11 20:06:05 -0500
commit7e339128496284cc21977fba5416166ee81f5172 (patch)
tree6af95386953cc67f3f465b966e03cb56f184dd30 /net
parenta7b780750e1a1c7833812681e1f8fa30bbb06802 (diff)
mm: gup: use get_user_pages_unlocked
This allows those get_user_pages calls to pass FAULT_FLAG_ALLOW_RETRY to the page fault in order to release the mmap_sem during the I/O. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> Reviewed-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Andres Lagar-Cavilla <andreslc@google.com> Cc: Peter Feiner <pfeiner@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/pagevec.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/net/ceph/pagevec.c b/net/ceph/pagevec.c
index 555013034f7a..096d91447e06 100644
--- a/net/ceph/pagevec.c
+++ b/net/ceph/pagevec.c
@@ -23,17 +23,15 @@ struct page **ceph_get_direct_page_vector(const void __user *data,
23 if (!pages) 23 if (!pages)
24 return ERR_PTR(-ENOMEM); 24 return ERR_PTR(-ENOMEM);
25 25
26 down_read(&current->mm->mmap_sem);
27 while (got < num_pages) { 26 while (got < num_pages) {
28 rc = get_user_pages(current, current->mm, 27 rc = get_user_pages_unlocked(current, current->mm,
29 (unsigned long)data + ((unsigned long)got * PAGE_SIZE), 28 (unsigned long)data + ((unsigned long)got * PAGE_SIZE),
30 num_pages - got, write_page, 0, pages + got, NULL); 29 num_pages - got, write_page, 0, pages + got);
31 if (rc < 0) 30 if (rc < 0)
32 break; 31 break;
33 BUG_ON(rc == 0); 32 BUG_ON(rc == 0);
34 got += rc; 33 got += rc;
35 } 34 }
36 up_read(&current->mm->mmap_sem);
37 if (rc < 0) 35 if (rc < 0)
38 goto fail; 36 goto fail;
39 return pages; 37 return pages;